Continuing e0464e4788
3.0 KiB
Platform Notes
Darwin (macOS)
Some common issues when packaging software for Darwin:
-
The Darwin
stdenv
uses clang instead of gcc. When referring to the compiler$CC
orcc
will work in both cases. Some builds hardcode gcc/g++ in their build scripts, that can usually be fixed with using something likemakeFlags = [ "CC=cc" ];
or by patching the build scripts.stdenv.mkDerivation { name = "libfoo-1.2.3"; # ... buildPhase = '' $CC -o hello hello.c ''; }
-
On Darwin, libraries are linked using absolute paths, libraries are resolved by their
install_name
at link time. Sometimes packages won’t set this correctly causing the library lookups to fail at runtime. This can be fixed by adding extra linker flags or by runninginstall_name_tool -id
during thefixupPhase
.stdenv.mkDerivation { name = "libfoo-1.2.3"; # ... makeFlags = lib.optional stdenv.hostPlatform.isDarwin "LDFLAGS=-Wl,-install_name,$(out)/lib/libfoo.dylib"; }
-
Even if the libraries are linked using absolute paths and resolved via their
install_name
correctly, tests can sometimes fail to run binaries. This happens because thecheckPhase
runs before the libraries are installed.This can usually be solved by running the tests after the
installPhase
or alternatively by usingDYLD_LIBRARY_PATH
. More information about this variable can be found in the dyld(1) manpage.dyld: Library not loaded: /nix/store/7hnmbscpayxzxrixrgxvvlifzlxdsdir-jq-1.5-lib/lib/libjq.1.dylib Referenced from: /private/tmp/nix-build-jq-1.5.drv-0/jq-1.5/tests/../jq Reason: image not found ./tests/jqtest: line 5: 75779 Abort trap: 6
stdenv.mkDerivation { name = "libfoo-1.2.3"; # ... doInstallCheck = true; installCheckTarget = "check"; }
-
Some packages assume xcode is available and use
xcrun
to resolve build tools likeclang
, etc. This causes errors likexcode-select: error: no developer tools were found at '/Applications/Xcode.app'
while the build doesn’t actually depend on xcode.stdenv.mkDerivation { name = "libfoo-1.2.3"; # ... prePatch = '' substituteInPlace Makefile \ --replace-fail '/usr/bin/xcrun clang' clang ''; }
The package
xcbuild
can be used to build projects that really depend on Xcode. However, this replacement is not 100% compatible with Xcode and can occasionally cause issues. -
x86_64-darwin uses the 10.12 SDK by default, but some software is not compatible with that version of the SDK. In that case, the 11.0 SDK used by aarch64-darwin is available for use on x86_64-darwin. To use it, reference
apple_sdk_11_0
instead ofapple_sdk
in your derivation and usepkgs.darwin.apple_sdk_11_0.callPackage
instead ofpkgs.callPackage
. On Linux, this will have the same effect aspkgs.callPackage
, so you can usepkgs.darwin.apple_sdk_11_0.callPackage
regardless of platform.