1 # This file contains the standard build environment for Darwin. It is based on LLVM and is patterned
2 # after the Linux stdenv. It shares similar goals to the Linux standard environment in that the
3 # resulting environment should be built purely and not contain any references to it.
5 # For more on the design of the stdenv and updating it, see `README.md`.
7 # See also the top comments of the Linux stdenv `../linux/default.nix` for a good overview of
8 # the bootstrap process and working with it.
17 # Allow passing in bootstrap files directly so we can test the stdenv bootstrap process when changing the bootstrap tools
18 bootstrapFiles ? (config.replaceBootstrapFiles or lib.id) (
19 if localSystem.isAarch64 then
20 import ./bootstrap-files/aarch64-apple-darwin.nix
22 import ./bootstrap-files/x86_64-apple-darwin.nix
26 assert crossSystem == localSystem;
29 inherit (localSystem) system;
31 sdkMajorVersion = lib.versions.major localSystem.darwinSdkVersion;
33 commonImpureHostDeps = [
35 "/usr/lib/libSystem.B.dylib"
36 "/usr/lib/system/libunc.dylib" # This dependency is "hidden", so our scanning code doesn't pick it up
39 isFromNixpkgs = pkg: !(isFromBootstrapFiles pkg);
40 isFromBootstrapFiles = pkg: pkg.passthru.isFromBootstrapFiles or false;
41 isBuiltByNixpkgsCompiler = pkg: isFromNixpkgs pkg && isFromNixpkgs pkg.stdenv.cc.cc;
42 isBuiltByBootstrapFilesCompiler = pkg: isFromNixpkgs pkg && isFromBootstrapFiles pkg.stdenv.cc.cc;
44 # Dependencies in dependency sets should be mutually exclusive.
45 mergeDisjointAttrs = lib.foldl' lib.attrsets.unionOfDisjoint { };
48 export NIX_ENFORCE_NO_NATIVE=''${NIX_ENFORCE_NO_NATIVE-1}
49 export NIX_ENFORCE_PURITY=''${NIX_ENFORCE_PURITY-1}
50 export NIX_IGNORE_LD_THROUGH_GCC=1
58 name = "bootstrap-tools";
59 builder = "${bootstrapFiles.unpack}/bin/bash";
62 "${bootstrapFiles.unpack}/bootstrap-tools-unpack.sh"
63 bootstrapFiles.bootstrapTools
66 PATH = lib.makeBinPath [
71 __impureHostDeps = commonImpureHostDeps;
73 // lib.optionalAttrs config.contentAddressedByDefault {
74 __contentAddressed = true;
75 outputHashAlgo = "sha256";
76 outputHashMode = "recursive";
80 passthru.isFromBootstrapFiles = true;
87 overrides ? (self: super: { }),
88 extraNativeBuildInputs ? [ ],
94 if prevStage.llvmPackages.clang-unwrapped == null then
97 prevStage.wrapCCWith {
98 name = "${name}-clang-wrapper";
103 expand-response-params = lib.optionalString (
104 prevStage.stdenv.hasCC or false && prevStage.stdenv.cc != "/dev/null"
105 ) prevStage.expand-response-params;
107 extraPackages = [ prevStage.llvmPackages.compiler-rt ];
111 inherit (prevStage.llvmPackages) clang-unwrapped compiler-rt;
114 function clangResourceRootIncludePath() {
115 clangLib="$1/lib/clang"
116 if (( $(ls "$clangLib" | wc -l) > 1 )); then
117 echo "Multiple LLVM versions were found at "$clangLib", but there must only be one used when building the stdenv." >&2
120 echo "$clangLib/$(ls -1 "$clangLib")/include"
123 rsrc="$out/resource-root"
125 ln -s "$(clangResourceRootIncludePath "${lib.getLib clang-unwrapped}")" "$rsrc"
126 ln -s "${compiler-rt.out}/lib" "$rsrc/lib"
127 ln -s "${compiler-rt.out}/share" "$rsrc/share"
128 echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
130 + lib.optionalString (isFromBootstrapFiles prevStage.llvmPackages.clang-unwrapped) ''
131 # Work around the `-nostdlibinc` patch in the bootstrap tools.
132 # TODO: Remove after the bootstrap tools have been updated.
133 substituteAll ${builtins.toFile "add-flags-extra.sh" ''
134 if [ "@darwinMinVersion@" ]; then
135 NIX_CFLAGS_COMPILE_@suffixSalt@+=" -idirafter $SDKROOT/usr/include"
136 NIX_CFLAGS_COMPILE_@suffixSalt@+=" -iframework $SDKROOT/System/Library/Frameworks"
138 ''} add-flags-extra.sh
139 cat add-flags-extra.sh >> $out/nix-support/add-flags.sh
142 cc = prevStage.llvmPackages.clang-unwrapped;
143 bintools = prevStage.darwin.binutils;
146 libc = prevStage.darwin.libSystem;
147 inherit (prevStage.llvmPackages) libcxx;
150 inherit (prevStage) coreutils gnugrep;
152 stdenvNoCC = prevStage.ccWrapperStdenv;
153 runtimeShell = prevStage.ccWrapperStdenv.shell;
156 bash = prevStage.bash or bootstrapTools;
158 thisStdenv = import ../generic {
159 name = "${name}-stdenv-darwin";
161 buildPlatform = localSystem;
162 hostPlatform = localSystem;
163 targetPlatform = localSystem;
167 extraBuildInputs = [ prevStage.apple-sdk ];
168 inherit extraNativeBuildInputs;
171 lib.optionalString (!isBuiltByNixpkgsCompiler bash) ''
172 # Don't patch #!/interpreter because it leads to retained
173 # dependencies on the bootstrapTools in the final stdenv.
180 + lib.optionalString (prevStage.darwin ? locale) ''
181 export PATH_LOCALE=${prevStage.darwin.locale}/share/locale
184 shell = bash + "/bin/bash";
191 fetchurlBoot = import ../../build-support/fetchurl {
193 stdenvNoCC = prevStage.ccWrapperStdenv or thisStdenv;
194 curl = bootstrapTools;
199 # The stdenvs themselves don't use mkDerivation, so I need to specify this here
200 __stdenvImpureHostDeps = commonImpureHostDeps;
201 __extraImpureHostDeps = commonImpureHostDeps;
203 # Using the bootstrap tools curl for fetchers allows the stdenv bootstrap to avoid
204 # having a dependency on curl, allowing curl to be updated without triggering a
205 # new stdenv bootstrap on Darwin.
208 (overrides self super)
210 fetchurl = thisStdenv.fetchurlBoot;
211 fetchpatch = super.fetchpatch.override { inherit (self) fetchurl; };
212 fetchzip = super.fetchzip.override { inherit (self) fetchurl; };
218 inherit config overlays;
222 # Dependencies - these are packages that are rebuilt together in groups. Defining them here ensures they are
223 # asserted and overlayed together. It also removes a lot of clutter from the stage definitions.
225 # When multiple dependency sets share a dependency, it should be put in the one that will be (re)built first.
226 # That makes sure everything else will share the same dependency in the final stdenv.
231 sets' = mergeDisjointAttrs sets;
232 result = lib.all checkFn (lib.attrValues sets');
233 resultDetails = lib.mapAttrs (_: checkFn) sets';
235 lib.traceIf (!result) (lib.deepSeq resultDetails resultDetails) result;
237 # These packages are built in stage 1 then never built again. They must not be included in the final overlay
238 # or as dependencies to packages that are in the final overlay. They are mostly tools used as native build inputs.
239 # Any libraries in the list must only be used as dependencies of packages in this list.
240 stage1Packages = prevStage: {
281 # These packages include both the core bintools (other than LLVM) packages as well as their dependencies.
282 bintoolsPackages = prevStage: {
298 darwinPackages = prevStage: { inherit (prevStage.darwin) sigtool; };
299 darwinPackagesNoCC = prevStage: {
300 inherit (prevStage.darwin)
308 # These packages are not allowed to be used in the Darwin bootstrap
309 disallowedPackages = prevStage: { inherit (prevStage) binutils-unwrapped curl; };
311 # LLVM tools packages are staged separately (xclang, stage3) from LLVM libs (xclang).
312 llvmLibrariesPackages = prevStage: { inherit (prevStage.llvmPackages) compiler-rt libcxx; };
313 llvmLibrariesDeps = _: { };
315 llvmToolsPackages = prevStage: {
316 inherit (prevStage.llvmPackages)
326 llvmToolsDeps = prevStage: { inherit (prevStage) libffi; };
328 # SDK packages include propagated packages and source release packages built during the bootstrap.
329 sdkPackages = prevStage: {
342 sdkDarwinPackages = prevStage: {
343 inherit (prevStage.darwin)
354 sdkPackagesNoCC = prevStage: { inherit (prevStage) apple-sdk; };
357 assert bootstrapTools.passthru.isFromBootstrapFiles or false; # sanity check
380 binutils-unwrapped = null;
386 clang-unwrapped = null;
394 # Create a stage with the bootstrap tools. This will be used to build the subsequent stages and
395 # build up the standard environment.
397 # Note: Each stage depends only on the the packages in `prevStage`. If a package is not to be
398 # rebuilt, it should be passed through by inheriting it.
402 name = "bootstrap-stage0";
404 overrides = self: super: {
405 # We thread stage0's stdenv through under this name so downstream stages
406 # can use it for wrapping gcc too. This way, downstream stages don't need
407 # to refer to this stage directly, which violates the principle that each
408 # stage should only access the stage that came before it.
409 ccWrapperStdenv = self.stdenv;
411 bash = bootstrapTools // {
412 shellPath = "/bin/bash";
415 coreutils = bootstrapTools;
416 cpio = bootstrapTools;
418 gnugrep = bootstrapTools;
419 pbzx = bootstrapTools;
423 cctools = bootstrapTools // {
424 libtool = bootstrapTools;
429 ld64 = bootstrapTools // {
434 darwin = super.darwin.overrideScope (
435 selfDarwin: superDarwin: {
436 binutils = super.wrapBintoolsWith {
437 name = "bootstrap-stage0-binutils-wrapper";
442 expand-response-params = "";
443 libc = selfDarwin.libSystem;
446 inherit (self) stdenvNoCC coreutils gnugrep;
447 runtimeShell = self.stdenvNoCC.shell;
449 bintools = selfDarwin.binutils-unwrapped;
451 # Bootstrap tools cctools needs the hook and wrappers to make sure things are signed properly,
452 # and additional linker flags to work around a since‐removed patch.
453 # This can be dropped once the bootstrap tools cctools has been updated to 1010.6.
454 extraBuildCommands = ''
455 printf %s ${lib.escapeShellArg ''
456 extraBefore+=("-F$DEVELOPER_DIR/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks")
457 extraBefore+=("-L$DEVELOPER_DIR/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib")
458 ''} >> $out/nix-support/add-local-ldflags-before.sh
460 echo 'source ${selfDarwin.postLinkSignHook}' >> $out/nix-support/post-link-hook
462 export signingUtils=${selfDarwin.signingUtils}
465 install_name_tool ${../../build-support/bintools-wrapper/darwin-install_name_tool-wrapper.sh} \
466 "${selfDarwin.binutils-unwrapped}/bin/install_name_tool"
469 strip ${../../build-support/bintools-wrapper/darwin-strip-wrapper.sh} \
470 "${selfDarwin.binutils-unwrapped}/bin/strip"
475 (superDarwin.binutils-unwrapped.override { enableManpages = false; }).overrideAttrs
478 passthru = (old.passthru or { }) // {
479 isFromBootstrapFiles = true;
483 locale = self.stdenv.mkDerivation {
484 name = "bootstrap-stage0-locale";
486 mkdir -p $out/share/locale
490 sigtool = bootstrapTools;
498 tools = super.llvmPackages.tools.extend (
500 libclang = self.stdenv.mkDerivation {
501 name = "bootstrap-stage0-clang";
510 ln -s ${bootstrapTools}/bin $out/bin
511 ln -s ${bootstrapTools}/lib/clang $out/lib
512 ln -s ${bootstrapTools}/include $out
515 isFromBootstrapFiles = true;
516 hardeningUnsupportedFlags = [
519 "stackclashprotection"
524 libllvm = self.stdenv.mkDerivation {
525 name = "bootstrap-stage0-llvm";
531 mkdir -p $out/bin $out/lib
533 for tool in ${toString super.darwin.binutils-unwrapped.llvm_cmds}; do
534 cctoolsTool=''${tool//-/_}
535 toolsrc="${bootstrapTools}/bin/$cctoolsTool"
536 if [ -e "$toolsrc" ]; then
537 ln -s "$toolsrc" $out/bin/llvm-$tool
540 ln -s ${bootstrapTools}/bin/dsymutil $out/bin/dsymutil
541 ln -s ${bootstrapTools}/lib/libLLVM* $out/lib
543 passthru.isFromBootstrapFiles = true;
545 llvm-manpages = self.llvmPackages.libllvm;
546 lld = self.stdenv.mkDerivation {
547 name = "bootstrap-stage0-lld";
551 isFromBootstrapFiles = true;
556 libraries = super.llvmPackages.libraries.extend (
558 compiler-rt = self.stdenv.mkDerivation {
559 name = "bootstrap-stage0-compiler-rt";
561 mkdir -p $out/lib $out/share
562 ln -s ${bootstrapTools}/lib/libclang_rt* $out/lib
563 ln -s ${bootstrapTools}/lib/darwin $out/lib
565 passthru.isFromBootstrapFiles = true;
567 libcxx = self.stdenv.mkDerivation {
568 name = "bootstrap-stage0-libcxx";
570 mkdir -p $out/lib $out/include
571 ln -s ${bootstrapTools}/lib/libc++.dylib $out/lib
572 ln -s ${bootstrapTools}/include/c++ $out/include
576 isFromBootstrapFiles = true;
582 { inherit tools libraries; } // tools // libraries
587 stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
592 # This stage is primarily responsible for setting up versions of certain dependencies needed
593 # by the rest of the build process. This stage also builds CF and Libsystem to simplify assertions
594 # and assumptions for later by making sure both packages are present on x86_64-darwin and aarch64-darwin.
597 # previous stage0 stdenv:
598 assert allDeps isFromBootstrapFiles [
599 (llvmToolsPackages prevStage)
600 (llvmLibrariesPackages prevStage)
611 inherit (prevStage.darwin) binutils-unwrapped sigtool;
615 assert allDeps isFromNixpkgs [
616 (sdkPackagesNoCC prevStage)
617 { inherit (prevStage.darwin) binutils libSystem; }
621 name = "bootstrap-stage1";
623 overrides = self: super: {
624 inherit (prevStage) ccWrapperStdenv cctools ld64;
626 binutils-unwrapped = builtins.throw "nothing in the Darwin bootstrap should depend on GNU binutils";
627 curl = builtins.throw "nothing in the Darwin bootstrap can depend on curl";
629 # Use this stage’s CF to build CMake. It’s required but can’t be included in the stdenv.
630 cmake = self.cmakeMinimal;
632 # Use libiconvReal with gettext to break an infinite recursion.
633 gettext = super.gettext.override { libiconv = super.libiconvReal; };
635 # Disable tests because they use dejagnu, which fails to run.
636 libffi = super.libffi.override { doCheck = false; };
638 # Avoid pulling in a full python and its extra dependencies for the llvm/clang builds.
639 libxml2 = super.libxml2.override { pythonSupport = false; };
641 # Avoid pulling in openldap just to run Meson’s tests.
642 meson = super.meson.overrideAttrs { doInstallCheck = false; };
643 ninja = super.ninja.override { buildDocs = false; };
645 # pkg-config builds glib, which checks for `arpa/nameser.h` and fails to build if it can’t find it.
646 # libresolv is normally propagated by the SDK, but propagation is disabled early in the bootstrap.
647 # Trying to add libresolv as a dependency causes an infinite recursion. Use pkgconf instead.
649 (super.pkg-config.override {
650 pkg-config = self.libpkgconf.override {
651 removeReferencesTo = self.removeReferencesTo.override {
652 # Avoid an infinite recursion by using the previous stage‘s sigtool.
653 signingUtils = prevStage.darwin.signingUtils.override { inherit (prevStage.darwin) sigtool; };
656 baseBinName = "pkgconf";
658 # Passthru the wrapped pkgconf’s stdenv to make the bootstrap assertions happy.
661 passthru = old.passthru or { } // {
662 inherit (self) stdenv;
667 # Use a full Python for the bootstrap. This allows Meson to be built in stage 1 and makes it easier to build
668 # packages that have Python dependencies.
669 python3 = self.python3-bootstrap;
670 python3-bootstrap = super.python3.override {
671 self = self.python3-bootstrap;
672 pythonAttr = "python3-bootstrap";
676 scons = super.scons.override { python3Packages = self.python3.pkgs; };
678 xar = super.xarMinimal;
680 darwin = super.darwin.overrideScope (
681 selfDarwin: superDarwin: {
682 signingUtils = prevStage.darwin.signingUtils.override { inherit (selfDarwin) sigtool; };
684 postLinkSignHook = prevStage.darwin.postLinkSignHook.override { inherit (selfDarwin) sigtool; };
686 # Rewrap binutils with the real libSystem
687 binutils = superDarwin.binutils.override {
688 inherit (self) coreutils;
689 bintools = selfDarwin.binutils-unwrapped;
690 libc = selfDarwin.libSystem;
692 # Bootstrap tools cctools needs the hook and wrappers to make sure things are signed properly.
693 # This can be dropped once the bootstrap tools cctools has been updated to 1010.6.
694 extraBuildCommands = ''
695 printf %s ${lib.escapeShellArg ''
696 extraBefore+=("-F$DEVELOPER_DIR/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks")
697 extraBefore+=("-L$DEVELOPER_DIR/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib")
698 ''} >> $out/nix-support/add-local-ldflags-before.sh
700 echo 'source ${selfDarwin.postLinkSignHook}' >> $out/nix-support/post-link-hook
702 export signingUtils=${selfDarwin.signingUtils}
705 install_name_tool ${../../build-support/bintools-wrapper/darwin-install_name_tool-wrapper.sh} \
706 "${selfDarwin.binutils-unwrapped}/bin/install_name_tool"
709 strip ${../../build-support/bintools-wrapper/darwin-strip-wrapper.sh} \
710 "${selfDarwin.binutils-unwrapped}/bin/strip"
714 # Avoid building unnecessary Python dependencies due to building LLVM manpages.
715 binutils-unwrapped = superDarwin.binutils-unwrapped.override {
716 inherit (self) cctools ld64;
717 enableManpages = false;
724 tools = super.llvmPackages.tools.extend (_: _: llvmToolsPackages prevStage);
725 libraries = super.llvmPackages.libraries.extend (_: _: llvmLibrariesPackages prevStage);
727 super.llvmPackages // { inherit tools libraries; } // tools // libraries;
730 extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
731 prevStage.updateAutotoolsGnuConfigScriptsHook
736 stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
741 # First rebuild of LLVM. While this LLVM is linked to a bunch of junk from the bootstrap tools,
742 # the compiler-rt, libc++, and libc++abi it produces are not. The compiler will be
743 # rebuilt in a later stage, but those libraries will be used in the final stdenv.
746 # previous stage1 stdenv:
747 assert allDeps isFromBootstrapFiles [
748 (llvmLibrariesPackages prevStage)
749 (llvmToolsPackages prevStage)
750 { inherit (prevStage) ld64; }
753 assert allDeps isBuiltByBootstrapFilesCompiler [
754 (stage1Packages prevStage)
755 (darwinPackages prevStage)
756 (llvmLibrariesDeps prevStage)
757 (llvmToolsDeps prevStage)
758 (sdkPackages prevStage)
759 (sdkDarwinPackages prevStage)
762 assert allDeps isFromNixpkgs [
763 (darwinPackagesNoCC prevStage)
764 (sdkPackagesNoCC prevStage)
768 name = "bootstrap-stage-xclang";
773 (stage1Packages prevStage)
774 (disallowedPackages prevStage)
775 # Only cctools and ld64 are rebuilt from `bintoolsPackages` to avoid rebuilding their dependencies
776 # again in this stage after building them in stage 1.
777 (lib.filterAttrs (name: _: name != "ld64" && name != "cctools") (bintoolsPackages prevStage))
778 (llvmToolsDeps prevStage)
779 (sdkPackages prevStage)
780 (sdkPackagesNoCC prevStage)
782 inherit (prevStage) ccWrapperStdenv;
784 # Disable ld64’s install check phase because the required LTO libraries are not built yet.
785 ld64 = super.ld64.overrideAttrs { doInstallCheck = false; };
787 darwin = super.darwin.overrideScope (
788 selfDarwin: superDarwin:
789 darwinPackages prevStage
790 // sdkDarwinPackages prevStage
792 inherit (prevStage.darwin) libSystem;
793 binutils-unwrapped = superDarwin.binutils-unwrapped.override { enableManpages = false; };
799 extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
800 prevStage.updateAutotoolsGnuConfigScriptsHook
805 stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
810 # This stage rebuilds the SDK. It also rebuilds bash, which will be needed in later stages
811 # to use in patched shebangs (e.g., to make sure `icu-config` uses bash from nixpkgs).
814 # previous stage-xclang stdenv:
815 assert allDeps isBuiltByBootstrapFilesCompiler [
816 (stage1Packages prevStage)
817 (bintoolsPackages prevStage)
818 (darwinPackages prevStage)
819 (llvmToolsDeps prevStage)
820 (llvmToolsPackages prevStage)
821 (sdkPackages prevStage)
822 (sdkDarwinPackages prevStage)
825 assert allDeps isBuiltByNixpkgsCompiler [
826 (llvmLibrariesDeps prevStage)
827 (llvmLibrariesPackages prevStage)
830 assert allDeps isFromNixpkgs [
831 (darwinPackagesNoCC prevStage)
832 (sdkPackagesNoCC prevStage)
836 name = "bootstrap-stage2";
841 (stage1Packages prevStage)
842 (disallowedPackages prevStage)
843 (bintoolsPackages prevStage)
844 (llvmLibrariesDeps prevStage)
845 (llvmToolsDeps prevStage)
847 inherit (prevStage) ccWrapperStdenv;
849 # Avoid an infinite recursion due to the SDK’s including ncurses, which depends on bash in its `dev` output.
850 bash = super.bash.override { stdenv = self.darwin.bootstrapStdenv; };
852 # Avoid pulling in a full python and its extra dependencies for the llvm/clang builds.
853 libxml2 = super.libxml2.override { pythonSupport = false; };
855 # Use Bash from this stage to avoid propagating Bash from a previous stage to the final stdenv.
856 ncurses = super.ncurses.override {
857 stdenv = self.darwin.bootstrapStdenv.override { shell = lib.getExe self.bash; };
860 darwin = super.darwin.overrideScope (
861 selfDarwin: superDarwin:
862 darwinPackages prevStage
864 inherit (prevStage.darwin) binutils-unwrapped;
865 # Rewrap binutils so it uses the rebuilt Libsystem.
866 binutils = superDarwin.binutils.override {
867 inherit (prevStage) expand-response-params;
868 libc = selfDarwin.libSystem;
875 tools = super.llvmPackages.tools.extend (
876 _: _: llvmToolsPackages prevStage // { inherit (prevStage.llvmPackages) clangNoCompilerRtWithLibc; }
878 libraries = super.llvmPackages.libraries.extend (_: _: llvmLibrariesPackages prevStage);
880 super.llvmPackages // { inherit tools libraries; } // tools // libraries;
884 extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
885 prevStage.updateAutotoolsGnuConfigScriptsHook
890 stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
895 # Rebuild LLVM with LLVM. This stage also rebuilds certain dependencies needed by LLVM.
896 # The SDK (but not its other inputs) is also rebuilt this stage to pick up the rebuilt cctools for `libtool`.
899 # previous stage2 stdenv:
900 assert allDeps isBuiltByBootstrapFilesCompiler [
901 (stage1Packages prevStage)
902 (bintoolsPackages prevStage)
903 (darwinPackages prevStage)
904 (llvmToolsPackages prevStage)
905 (llvmToolsDeps prevStage)
908 assert allDeps isBuiltByNixpkgsCompiler [
909 (llvmLibrariesDeps prevStage)
910 (llvmLibrariesPackages prevStage)
911 (sdkPackages prevStage)
912 (sdkDarwinPackages prevStage)
915 assert allDeps isFromNixpkgs [
916 (darwinPackagesNoCC prevStage)
917 (sdkPackagesNoCC prevStage)
921 name = "bootstrap-stage3";
926 (stage1Packages prevStage)
927 (disallowedPackages prevStage)
928 (llvmLibrariesDeps prevStage)
929 (sdkPackages prevStage)
931 inherit (prevStage) ccWrapperStdenv;
933 # Disable tests because they use dejagnu, which fails to run.
934 libffi = super.libffi.override { doCheck = false; };
936 xar = super.xarMinimal;
938 darwin = super.darwin.overrideScope (
939 selfDarwin: superDarwin:
940 darwinPackages prevStage
941 // sdkDarwinPackages prevStage
942 # Rebuild darwin.binutils with the new LLVM, so only inherit libSystem from the previous stage.
944 inherit (prevStage.darwin) libSystem;
950 tools = super.llvmPackages.tools.extend (
952 # darwin.binutils-unwrapped needs to build the LLVM man pages, which requires a lot of Python stuff
953 # that ultimately ends up depending on git. Fortunately, the git dependency is only for check
954 # inputs. The following set of overrides allow the LLVM documentation to be built without
955 # pulling curl (and other packages like ffmpeg) into the stdenv bootstrap.
957 # However, even without darwin.binutils-unwrapped, this has to be overriden in the LLVM package set
958 # because otherwise llvmPackages.llvm-manpages on its own is broken.
959 llvm-manpages = superTools.llvm-manpages.override {
960 python3Packages = self.python3.pkgs.overrideScope (
962 hatch-vcs = superPython.hatch-vcs.overrideAttrs { doInstallCheck = false; };
963 markdown-it-py = superPython.markdown-it-py.overrideAttrs { doInstallCheck = false; };
964 mdit-py-plugins = superPython.mdit-py-plugins.overrideAttrs { doInstallCheck = false; };
965 myst-parser = superPython.myst-parser.overrideAttrs { doInstallCheck = false; };
971 libraries = super.llvmPackages.libraries.extend (_: _: llvmLibrariesPackages prevStage);
973 super.llvmPackages // { inherit tools libraries; } // tools // libraries;
977 extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
978 prevStage.updateAutotoolsGnuConfigScriptsHook
983 stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
988 # Construct a standard environment with the new clang. Also use the new compiler to rebuild
989 # everything that will be part of the final stdenv and isn’t required by it, CF, or Libsystem.
992 # previous stage3 stdenv:
993 assert allDeps isBuiltByBootstrapFilesCompiler [
994 (stage1Packages prevStage)
995 (darwinPackages prevStage)
998 assert allDeps isBuiltByNixpkgsCompiler [
999 (bintoolsPackages prevStage)
1000 (llvmLibrariesDeps prevStage)
1001 (llvmLibrariesPackages prevStage)
1002 (llvmToolsDeps prevStage)
1003 (llvmToolsPackages prevStage)
1004 (sdkPackages prevStage)
1005 (sdkDarwinPackages prevStage)
1008 assert allDeps isFromNixpkgs [
1009 (darwinPackagesNoCC prevStage)
1010 (sdkPackagesNoCC prevStage)
1013 stageFun prevStage {
1014 name = "bootstrap-stage4";
1018 mergeDisjointAttrs [
1019 (bintoolsPackages prevStage)
1020 (disallowedPackages prevStage)
1021 (llvmLibrariesDeps prevStage)
1022 (llvmToolsDeps prevStage)
1023 (sdkPackages prevStage)
1024 (sdkPackagesNoCC prevStage)
1026 inherit (prevStage) ccWrapperStdenv;
1028 # Rebuild locales and sigtool with the new clang.
1029 darwin = super.darwin.overrideScope (
1031 sdkDarwinPackages prevStage
1033 inherit (prevStage.darwin) binutils-unwrapped libSystem;
1034 binutils = superDarwin.binutils.override {
1035 # Build expand-response-params with last stage like below
1036 inherit (prevStage) expand-response-params;
1038 # Avoid rebuilding bmake (and Python) just for locales
1039 locale = superDarwin.locale.override { inherit (prevStage) bmake; };
1045 tools = super.llvmPackages.tools.extend (
1047 llvmToolsPackages prevStage
1049 libcxxClang = super.wrapCCWith rec {
1050 nativeTools = false;
1053 inherit (prevStage) expand-response-params;
1055 extraPackages = [ self.llvmPackages.compiler-rt ];
1057 extraBuildCommands = ''
1058 rsrc="$out/resource-root"
1060 ln -s "${lib.getLib cc}/lib/clang/${lib.versions.major (lib.getVersion cc)}/include" "$rsrc"
1061 echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
1062 ln -s "${prevStage.llvmPackages.compiler-rt.out}/lib" "$rsrc/lib"
1063 ln -s "${prevStage.llvmPackages.compiler-rt.out}/share" "$rsrc/share"
1066 cc = self.llvmPackages.clang-unwrapped;
1067 bintools = self.darwin.binutils;
1070 libc = self.darwin.libSystem;
1071 inherit (self.llvmPackages) libcxx;
1083 libraries = super.llvmPackages.libraries.extend (_: _: llvmLibrariesPackages prevStage);
1085 super.llvmPackages // { inherit tools libraries; } // tools // libraries;
1089 extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
1090 prevStage.updateAutotoolsGnuConfigScriptsHook
1091 prevStage.gnu-config
1095 stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
1100 # Construct the final stdenv. The version of LLVM provided should match the one defined in
1101 # `all-packages.nix` for Darwin. Nothing should depend on the bootstrap tools or originate from
1102 # the bootstrap tools.
1104 # When updating the Darwin stdenv, make sure that the result has no dependency (`nix-store -qR`)
1105 # on `bootstrapTools` or the binutils built in stage 1.
1108 # previous stage4 stdenv:
1110 assert allDeps isBuiltByNixpkgsCompiler [
1111 (lib.filterAttrs (_: pkg: lib.getName pkg != "pkg-config-wrapper") (stage1Packages prevStage)) # pkg-config is a wrapper
1112 (bintoolsPackages prevStage)
1113 (darwinPackages prevStage)
1114 (llvmLibrariesDeps prevStage)
1115 (llvmLibrariesPackages prevStage)
1116 (llvmToolsDeps prevStage)
1117 (llvmToolsPackages prevStage)
1118 (sdkPackages prevStage)
1119 (sdkDarwinPackages prevStage)
1120 { inherit (prevStage.pkg-config) pkg-config; }
1123 assert allDeps isFromNixpkgs [
1124 (darwinPackagesNoCC prevStage)
1125 (sdkPackagesNoCC prevStage)
1129 cc = prevStage.llvmPackages.clang;
1132 inherit config overlays;
1133 stdenv = import ../generic {
1134 name = "stdenv-darwin";
1136 buildPlatform = localSystem;
1137 hostPlatform = localSystem;
1138 targetPlatform = localSystem;
1144 stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
1145 export PATH_LOCALE=${prevStage.darwin.locale}/share/locale
1148 initialPath = ((import ../generic/common-path.nix) { pkgs = prevStage; });
1150 extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
1151 prevStage.updateAutotoolsGnuConfigScriptsHook
1154 extraBuildInputs = [ prevStage.apple-sdk ];
1160 inherit (prevStage.stdenv) fetchurlBoot;
1163 inherit bootstrapTools;
1164 libc = prevStage.darwin.libSystem;
1165 shellPackage = prevStage.bash;
1168 disallowedRequisites = [ bootstrapTools.out ];
1178 cc.expand-response-params
1183 darwin.binutils.bintools
1217 ++ apple-sdk.propagatedBuildInputs
1219 ++ lib.optionals localSystem.isAarch64 [
1220 prevStage.updateAutotoolsGnuConfigScriptsHook
1221 prevStage.gnu-config
1223 ++ lib.optionals localSystem.isx86_64 [ prevStage.darwin.Csu ]
1224 ++ (with prevStage.darwin; [
1231 ++ (with prevStage.llvmPackages; [
1234 (lib.getLib clang-unwrapped)
1244 __stdenvImpureHostDeps = commonImpureHostDeps;
1245 __extraImpureHostDeps = commonImpureHostDeps;
1249 mergeDisjointAttrs [
1250 (llvmLibrariesDeps prevStage)
1251 (llvmToolsDeps prevStage)
1252 (sdkPackages prevStage)
1253 (sdkPackagesNoCC prevStage)
1269 # TODO: Simplify when dropping support for macOS < 11.
1270 "apple-sdk_${builtins.replaceStrings [ "." ] [ "_" ] sdkMajorVersion}" = self.apple-sdk;
1272 darwin = super.darwin.overrideScope (
1274 sdkDarwinPackages prevStage
1276 inherit (prevStage.darwin) libSystem locale sigtool;
1278 // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
1279 inherit (prevStage.darwin) binutils binutils-unwrapped;
1283 # These have to be dropped from the overlay when cross-compiling. Wrappers are obviously target-specific.
1284 # darwin.binutils is not yet ready to be target-independent.
1286 lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) (bintoolsPackages prevStage)
1288 inherit (prevStage.llvmPackages) clang;
1291 # Since LLVM should be the same regardless of target platform, overlay it to avoid an unnecessary
1292 # rebuild when cross-compiling from Darwin to another platform using clang.
1295 "llvmPackages_${lib.versions.major prevStage.llvmPackages.release_version}" =
1297 llvmVersion = lib.versions.major prevStage.llvmPackages.release_version;
1298 tools = super."llvmPackages_${llvmVersion}".tools.extend (_: _: llvmToolsPackages prevStage);
1299 libraries = super."llvmPackages_${llvmVersion}".libraries.extend (
1301 llvmLibrariesPackages prevStage
1302 // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
1303 inherit (prevStage.llvmPackages) clang;
1307 super."llvmPackages_${llvmVersion}" // { inherit tools libraries; } // tools // libraries;
1314 # This "no-op" stage is just a place to put the assertions about the final stage.
1317 # previous final stage stdenv:
1318 assert isBuiltByNixpkgsCompiler prevStage.cctools;
1319 assert isBuiltByNixpkgsCompiler prevStage.ld64;
1320 assert isBuiltByNixpkgsCompiler prevStage.darwin.sigtool;
1322 assert isFromNixpkgs prevStage.darwin.libSystem;
1323 assert isFromNixpkgs prevStage.darwin.binutils-unwrapped;
1325 assert isBuiltByNixpkgsCompiler prevStage.llvmPackages.clang-unwrapped;
1326 assert isBuiltByNixpkgsCompiler prevStage.llvmPackages.libllvm;
1327 assert isBuiltByNixpkgsCompiler prevStage.llvmPackages.libcxx;
1328 assert isBuiltByNixpkgsCompiler prevStage.llvmPackages.compiler-rt;
1330 # Make sure these evaluate since they were disabled explicitly in the bootstrap.
1331 assert isBuiltByNixpkgsCompiler prevStage.binutils-unwrapped;
1332 assert isFromNixpkgs prevStage.binutils-unwrapped.src;
1333 assert isBuiltByNixpkgsCompiler prevStage.curl;
1335 # libiconv should be an alias for darwin.libiconv
1336 assert prevStage.libiconv == prevStage.darwin.libiconv;
1339 inherit (prevStage) config overlays stdenv;