2.5 KiB
Platform Notes
Darwin (macOS)
Some common issues when packaging software for Darwin:
-
The Darwin
stdenvuses clang instead of gcc. When referring to the compiler$CCorccwill 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_nameat 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 -idduring thefixupPhase.stdenv.mkDerivation { name = "libfoo-1.2.3"; # ... makeFlags = lib.optional stdenv.isDarwin "LDFLAGS=-Wl,-install_name,$(out)/lib/libfoo.dylib"; } -
Even if the libraries are linked using absolute paths and resolved via their
install_namecorrectly, tests can sometimes fail to run binaries. This happens because thecheckPhaseruns before the libraries are installed.This can usually be solved by running the tests after the
installPhaseor 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: 6stdenv.mkDerivation { name = "libfoo-1.2.3"; # ... doInstallCheck = true; installCheckTarget = "check"; } -
Some packages assume xcode is available and use
xcrunto 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 '/usr/bin/xcrun clang' clang ''; }The package
xcbuildcan be used to build projects that really depend on Xcode. However, this replacement is not 100% compatible with Xcode and can occasionally cause issues.