dadc7eb329
Whenever we create scripts that are installed to $out, we must use runtimeShell in order to get the shell that can be executed on the machine we create the package for. This is relevant for cross-compiling. The only use case for stdenv.shell are scripts that are executed as part of the build system. Usages in checkPhase are borderline however to decrease the likelyhood of people copying the wrong examples, I decided to use runtimeShell as well.
135 lines
3.8 KiB
Nix
135 lines
3.8 KiB
Nix
{ stdenv, lib, buildPackages, makeWrapper, writeText, runCommand
|
|
, CoreServices, ImageIO, CoreGraphics
|
|
, runtimeShell
|
|
, xcodePlatform ? stdenv.targetPlatform.xcodePlatform or "MacOSX"
|
|
, xcodeVer ? stdenv.targetPlatform.xcodeVer or "9.4.1"
|
|
, sdkVer ? stdenv.targetPlatform.sdkVer or "10.10" }:
|
|
|
|
let
|
|
|
|
toolchainName = "com.apple.dt.toolchain.XcodeDefault";
|
|
sdkName = "${xcodePlatform}${sdkVer}";
|
|
|
|
# TODO: expose MACOSX_DEPLOYMENT_TARGET in nix so we can use it here.
|
|
sdkBuildVersion = "17E189";
|
|
xcodeSelectVersion = "2349";
|
|
|
|
xcbuild = buildPackages.callPackage ./default.nix {
|
|
inherit CoreServices ImageIO CoreGraphics;
|
|
};
|
|
|
|
toolchains = buildPackages.callPackage ./toolchains.nix {
|
|
inherit toolchainName;
|
|
};
|
|
|
|
sdks = buildPackages.callPackage ./sdks.nix {
|
|
inherit toolchainName sdkName xcodePlatform;
|
|
version = sdkVer;
|
|
};
|
|
|
|
platforms = buildPackages.callPackage ./platforms.nix {
|
|
inherit sdks xcodePlatform;
|
|
};
|
|
|
|
xcconfig = writeText "nix.xcconfig" ''
|
|
SDKROOT=${sdkName}
|
|
'';
|
|
|
|
xcode-select = writeText "xcode-select" ''
|
|
#!${runtimeShell}
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
-h | --help) ;; # noop
|
|
-s | --switch) shift;; # noop
|
|
-r | --reset) ;; # noop
|
|
-v | --version) echo xcode-select version ${xcodeSelectVersion} ;;
|
|
-p | -print-path | --print-path) echo @DEVELOPER_DIR@ ;;
|
|
--install) ;; # noop
|
|
esac
|
|
shift
|
|
done
|
|
'';
|
|
|
|
xcrun = writeText "xcrun" ''
|
|
#!${runtimeShell}
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
--sdk | -sdk) shift ;;
|
|
--find | -find)
|
|
shift
|
|
command -v $1 ;;
|
|
--log | -log) ;; # noop
|
|
--verbose | -verbose) ;; # noop
|
|
--no-cache | -no-cache) ;; # noop
|
|
--kill-cache | -kill-cache) ;; # noop
|
|
--show-sdk-path | -show-sdk-path)
|
|
echo ${sdks}/${sdkName}.sdk ;;
|
|
--show-sdk-platform-path | -show-sdk-platform-path)
|
|
echo ${platforms}/${xcodePlatform}.platform ;;
|
|
--show-sdk-version | -show-sdk-version)
|
|
echo ${sdkVer} ;;
|
|
--show-sdk-build-version | -show-sdk-build-version)
|
|
echo ${sdkBuildVersion} ;;
|
|
*) break ;;
|
|
esac
|
|
shift
|
|
done
|
|
if ! [[ -z "$@" ]]; then
|
|
exec "$@"
|
|
fi
|
|
'';
|
|
|
|
in
|
|
|
|
runCommand "xcodebuild-${xcbuild.version}" {
|
|
nativeBuildInputs = [ makeWrapper ];
|
|
inherit (xcbuild) meta;
|
|
|
|
# ensure that the toolchain goes in PATH
|
|
propagatedBuildInputs = [ "${toolchains}/XcodeDefault.xctoolchain" ];
|
|
|
|
passthru = {
|
|
inherit xcbuild;
|
|
toolchain = "${toolchains}/XcodeDefault.xctoolchain";
|
|
sdk = "${sdks}/${sdkName}";
|
|
platform = "${platforms}/${xcodePlatform}.platform";
|
|
};
|
|
|
|
preferLocalBuild = true;
|
|
} ''
|
|
mkdir -p $out/bin
|
|
|
|
ln -s $out $out/usr
|
|
|
|
mkdir -p $out/Library/Xcode
|
|
ln -s ${xcbuild}/Library/Xcode/Specifications $out/Library/Xcode/Specifications
|
|
|
|
ln -s ${platforms} $out/Platforms
|
|
ln -s ${toolchains} $out/Toolchains
|
|
|
|
makeWrapper ${xcbuild}/bin/xcodebuild $out/bin/xcodebuild \
|
|
--add-flags "-xcconfig ${xcconfig}" \
|
|
--add-flags "DERIVED_DATA_DIR=." \
|
|
--set DEVELOPER_DIR "$out" \
|
|
--set SDKROOT ${sdkName} \
|
|
--run '[ "$1" = "-version" ] && [ "$#" -eq 1 ] && (echo Xcode ${xcodeVer}; echo Build version ${sdkBuildVersion}) && exit 0' \
|
|
--run '[ "$1" = "-license" ] && exit 0'
|
|
|
|
substitute ${xcode-select} $out/bin/xcode-select \
|
|
--subst-var-by DEVELOPER_DIR $out
|
|
chmod +x $out/bin/xcode-select
|
|
|
|
substitute ${xcrun} $out/bin/xcrun
|
|
chmod +x $out/bin/xcrun
|
|
|
|
for bin in PlistBuddy actool builtin-copy builtin-copyPlist \
|
|
builtin-copyStrings builtin-copyTiff \
|
|
builtin-embeddedBinaryValidationUtility \
|
|
builtin-infoPlistUtility builtin-lsRegisterURL \
|
|
builtin-productPackagingUtility builtin-validationUtility \
|
|
lsbom plutil; do
|
|
ln -s ${xcbuild}/bin/$bin $out/bin/$bin
|
|
done
|
|
|
|
fixupPhase
|
|
''
|