diff options
Diffstat (limited to 'nixpkgs/pkgs/build-support/make-darwin-bundle')
-rw-r--r-- | nixpkgs/pkgs/build-support/make-darwin-bundle/default.nix | 26 | ||||
-rw-r--r-- | nixpkgs/pkgs/build-support/make-darwin-bundle/write-darwin-bundle.nix | 47 |
2 files changed, 73 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/build-support/make-darwin-bundle/default.nix b/nixpkgs/pkgs/build-support/make-darwin-bundle/default.nix new file mode 100644 index 000000000000..52dd54b0b2c4 --- /dev/null +++ b/nixpkgs/pkgs/build-support/make-darwin-bundle/default.nix @@ -0,0 +1,26 @@ +# given a package with an executable and an icon, make a darwin bundle for +# it. This package should be used when generating launchers for native Darwin +# applications. If the package conatins a .desktop file use +# `desktopToDarwinLauncher` instead. + +{ lib, writeShellScript, writeDarwinBundle }: + +{ name # The name of the Application file. +, exec # Executable file. +, icon ? "" # Optional icon file. +}: + +writeShellScript "make-darwin-bundle-${name}" ('' + function makeDarwinBundlePhase() { + mkdir -p "''${!outputBin}/Applications/${name}.app/Contents/MacOS" + mkdir -p "''${!outputBin}/Applications/${name}.app/Contents/Resources" + + if [ -n "${icon}" ]; then + ln -s "${icon}" "''${!outputBin}/Applications/${name}.app/Contents/Resources" + fi + + ${writeDarwinBundle}/bin/write-darwin-bundle "''${!outputBin}" "${name}" "${exec}" + } + + preDistPhases+=" makeDarwinBundlePhase" +'') diff --git a/nixpkgs/pkgs/build-support/make-darwin-bundle/write-darwin-bundle.nix b/nixpkgs/pkgs/build-support/make-darwin-bundle/write-darwin-bundle.nix new file mode 100644 index 000000000000..752cbbde2a31 --- /dev/null +++ b/nixpkgs/pkgs/build-support/make-darwin-bundle/write-darwin-bundle.nix @@ -0,0 +1,47 @@ +{ writeScriptBin, lib, makeBinaryWrapper }: + +let + pListText = lib.generators.toPlist { } { + CFBundleDevelopmentRegion = "English"; + CFBundleExecutable = "$name"; + CFBundleIconFile = "$icon"; + CFBundleIconFiles = [ "$icon" ]; + CFBundleIdentifier = "org.nixos.$name"; + CFBundleInfoDictionaryVersion = "6.0"; + CFBundleName = "$name"; + CFBundlePackageType = "APPL"; + CFBundleSignature = "???"; + }; +in writeScriptBin "write-darwin-bundle" '' + shopt -s nullglob + + readonly prefix=$1 + readonly name=$2 + # TODO: support executables with spaces in their names + readonly execName=''${3%% *} # Before the first space + [[ $3 =~ " " ]] && readonly execArgs=''${3#* } # Everything after the first space + readonly icon=$4.icns + readonly squircle=''${5:-1} + readonly plist=$prefix/Applications/$name.app/Contents/Info.plist + readonly binary=$prefix/bin/$execName + readonly bundleExecutable=$prefix/Applications/$name.app/Contents/MacOS/$name + + cat > "$plist" <<EOF +${pListText} +EOF + + if [[ $squircle == 0 || $squircle == "false" ]]; then + sed '/CFBundleIconFiles/,\|</array>|d' -i "$plist" + fi + + if [[ -n "$execArgs" ]]; then + ( + source ${makeBinaryWrapper}/nix-support/setup-hook + # WORKAROUND: makeBinaryWrapper fails when -u is set + set +u + makeBinaryWrapper "$binary" "$bundleExecutable" --add-flags "$execArgs" + ) + else + ln -s "$binary" "$bundleExecutable" + fi +'' |