nixpkgs/pkgs/os-specific/darwin/dockutil/default.nix
2024-04-11 18:03:20 +02:00

100 lines
2.5 KiB
Nix

{ lib
, stdenv
, stdenvNoCC
, fetchFromGitHub
, fetchurl
, swift
, swiftpm
, swiftpm2nix
, swiftPackages
, darwin
, libarchive
, p7zip
# Building from source on x86_64 fails (among other things) due to:
# error: cannot load underlying module for 'Darwin'
, fromSource ? (stdenv.system != "x86_64-darwin")
}:
let
generated = swiftpm2nix.helpers ./generated;
pname = "dockutil";
version = "3.1.3";
meta = with lib; {
description = "Tool for managing dock items";
homepage = "https://github.com/kcrawford/dockutil";
license = licenses.asl20;
maintainers = with maintainers; [ tboerger ];
mainProgram = "dockutil";
platforms = platforms.darwin;
};
buildFromSource = swiftPackages.stdenv.mkDerivation (finalAttrs: {
inherit pname version meta;
src = fetchFromGitHub {
owner = "kcrawford";
repo = "dockutil";
rev = finalAttrs.version;
hash = "sha256-mmk4vVZhq4kt05nI/dDM1676FDWyf4wTSwY2YzqKsLU=";
};
postPatch = ''
# Patch sources so that they build with Swift CoreFoundation
# which differs ever so slightly from Apple's implementation.
substituteInPlace Sources/DockUtil/DockUtil.swift \
--replace-fail "URL(filePath:" \
"URL(fileURLWithPath:" \
--replace-fail "path(percentEncoded: false)" \
"path"
'';
nativeBuildInputs = [ swift swiftpm ];
buildInputs = with darwin.apple_sdk.frameworks; [ Cocoa ];
configurePhase = generated.configure;
installPhase = ''
runHook preInstall
install -Dm755 .build/${stdenv.hostPlatform.darwinArch}-apple-macosx/release/dockutil -t $out/bin
runHook postInstall
'';
});
installBinary = stdenvNoCC.mkDerivation (finalAttrs: {
inherit pname version;
src = fetchurl {
url = "https://github.com/kcrawford/dockutil/releases/download/${finalAttrs.version}/dockutil-${finalAttrs.version}.pkg";
hash = "sha256-9g24Jz/oDXxIJFiL7bU4pTh2dcORftsAENq59S0/JYI=";
};
dontPatch = true;
dontConfigure = true;
dontBuild = true;
nativeBuildInputs = [ libarchive p7zip ];
unpackPhase = ''
7z x $src
bsdtar -xf Payload~
'';
installPhase = ''
runHook preInstall
mkdir -p $out/bin
install -Dm755 usr/local/bin/dockutil -t $out/bin
runHook postInstall
'';
meta = meta // {
sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
};
});
in
if fromSource
then buildFromSource
else installBinary