66884a4912
Previously `writeDarwinBundle` used a handcrafted shell wrapper, however this causes issues on Apple Silicon Macs as script-only application bundles are always run under Rosetta[0][1]. Replacing the handcrafted shell wrapper with a binary wrapper allows apps to run natively instead of requiring Rosetta. However, this means we can no longer use `$1` and `$@`. After checking nearly every current usage of `desktopToDarwinBundle`, there were no apps that used `%[fFuU]` before the last argument, meaning removing them naively is good enough for the current apps. [0]: https://developer.apple.com/documentation/apple-silicon/building-a-universal-macos-binary [1]: https://stackoverflow.com/a/68208374
47 lines
1.4 KiB
Nix
47 lines
1.4 KiB
Nix
{ 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
|
|
''
|