about summary refs log tree commit diff
path: root/pkgs/stdenv/darwin/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/stdenv/darwin/default.nix')
-rw-r--r--pkgs/stdenv/darwin/default.nix494
1 files changed, 205 insertions, 289 deletions
diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix
index 753cf96af757b..5cc0b88bc709c 100644
--- a/pkgs/stdenv/darwin/default.nix
+++ b/pkgs/stdenv/darwin/default.nix
@@ -25,7 +25,7 @@ assert crossSystem == localSystem;
 let
   inherit (localSystem) system;
 
-  useAppleSDKLibs = localSystem.isAarch64;
+  useAppleSDKLibs = lib.versionAtLeast localSystem.darwinSdkVersion "11";
 
   commonImpureHostDeps = [
     "/bin/sh"
@@ -174,9 +174,6 @@ let
         overrides = self: super: (overrides self super) // {
           fetchurl = thisStdenv.fetchurlBoot;
           fetchpatch = super.fetchpatch.override { inherit (self) fetchurl; };
-          fetchgit = super.fetchgit.override {
-            git = super.git.override { curl = bootstrapTools; };
-          };
           fetchzip = super.fetchzip.override { inherit (self) fetchurl; };
         };
       };
@@ -192,6 +189,9 @@ in
   ({}: {
     __raw = true;
 
+    cctools = true;
+    ld64 = true;
+
     coreutils = null;
     gnugrep = null;
 
@@ -202,7 +202,6 @@ in
       apple_sdk.sdkRoot = null;
       binutils = null;
       binutils-unwrapped = null;
-      cctools = null;
       print-reexports = null;
       rewrite-tbd = null;
       sigtool = null;
@@ -242,6 +241,97 @@ in
       gnugrep = bootstrapTools;
       pbzx = bootstrapTools;
 
+      cctools = super.stdenv.mkDerivation {
+        pname = "bootstrap-stage0-cctools";
+        version = "boot";
+
+        buildCommand = ''
+          declare -a cctools=(
+            ar
+            bitcode_strip
+            check_dylib
+            checksyms
+            cmpdylib
+            codesign_allocate
+            ctf_insert
+            depinfo
+            diagtest
+            gas
+            gprof
+            install_name_tool
+            libtool
+            lipo
+            mtoc
+            mtor
+            nm
+            nmedit
+            otool
+            pagestuff
+            ranlib
+            redo_prebinding
+            seg_addr_table
+            seg_hack
+            segedit
+            size
+            strings
+            strip
+            vtool
+          )
+
+          mkdir -p "$out/bin"
+          for tool in "''${cctools[@]}"; do
+            toolsrc="${bootstrapTools}/bin/$tool"
+            if [ -e "$toolsrc" ]; then
+              ln -s "$toolsrc" "$out/bin"
+            fi
+          done
+
+          # Copy only the required headers to avoid accidentally linking headers that belong to other packages,
+          # which can cause problems when building Libsystem in the source-based SDK.
+          declare -a machohdrs=(
+            arch.h
+            fat.h
+            fixup-chains.h
+            getsect.h
+            ldsyms.h
+            loader.h
+            nlist.h
+            ranlib.h
+            reloc.h
+            stab.h
+            swap.h
+            arm
+            arm64
+            hppa
+            i386
+            i860
+            m68k
+            m88k
+            ppc
+            sparc
+            x86_64
+          )
+
+          mkdir -p "$out/include/mach-o"
+          for header in "''${machohdrs[@]}"; do
+            machosrc="${bootstrapTools}/include-Libsystem/mach-o/$header"
+            if [ -e "$machosrc" ]; then
+              cp -r "$machosrc" "$out/include/mach-o/$header"
+            fi
+          done
+        '';
+
+        passthru = {
+          isFromBootstrapFiles = true;
+          targetPrefix = "";
+        };
+      };
+
+      ld64 = bootstrapTools // {
+        targetPrefix = "";
+        version = "boot";
+      };
+
       darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
         # Prevent CF from being propagated to the initial stdenv. Packages that require it
         # will have to manually add it to their build inputs.
@@ -262,7 +352,21 @@ in
 
           bintools = selfDarwin.binutils-unwrapped;
 
-          inherit (selfDarwin) postLinkSignHook signingUtils;
+          # Bootstrap tools cctools needs the hook and wrappers to make sure things are signed properly.
+          # This can be dropped once the bootstrap tools cctools has been updated to 1010.6.
+          extraBuildCommands = ''
+            echo 'source ${selfDarwin.postLinkSignHook}' >> $out/nix-support/post-link-hook
+
+            export signingUtils=${selfDarwin.signingUtils}
+
+            wrap \
+              install_name_tool ${../../build-support/bintools-wrapper/darwin-install_name_tool-wrapper.sh} \
+              "${selfDarwin.binutils-unwrapped}/bin/install_name_tool"
+
+            wrap \
+              strip ${../../build-support/bintools-wrapper/darwin-strip-wrapper.sh} \
+              "${selfDarwin.binutils-unwrapped}/bin/strip"
+          '';
         };
 
         binutils-unwrapped = (superDarwin.binutils-unwrapped.overrideAttrs (old: {
@@ -272,93 +376,6 @@ in
           };
         })).override { enableManpages = false; };
 
-        cctools = super.stdenv.mkDerivation {
-          pname = "bootstrap-stage0-cctools";
-          version = "boot";
-
-          buildCommand = ''
-            declare -a cctools=(
-              ar
-              bitcode_strip
-              check_dylib
-              checksyms
-              cmpdylib
-              codesign_allocate
-              ctf_insert
-              depinfo
-              diagtest
-              ld
-              gas
-              gprof
-              install_name_tool
-              libtool
-              lipo
-              mtoc
-              mtor
-              nm
-              nmedit
-              otool
-              pagestuff
-              ranlib
-              redo_prebinding
-              seg_addr_table
-              seg_hack
-              segedit
-              size
-              strings
-              strip
-              vtool
-            )
-
-            mkdir -p "$out/bin"
-            for tool in "''${cctools[@]}"; do
-              toolsrc="${bootstrapTools}/bin/$tool"
-              if [ -e "$toolsrc" ]; then
-                ln -s "$toolsrc" "$out/bin"
-              fi
-            done
-
-            # Copy only the required headers to avoid accidentally linking headers that belong to other packages,
-            # which can cause problems when building Libsystem in the source-based SDK.
-            declare -a machohdrs=(
-              arch.h
-              fat.h
-              fixup-chains.h
-              getsect.h
-              ldsyms.h
-              loader.h
-              nlist.h
-              ranlib.h
-              reloc.h
-              stab.h
-              swap.h
-              arm
-              arm64
-              hppa
-              i386
-              i860
-              m68k
-              m88k
-              ppc
-              sparc
-              x86_64
-            )
-
-            mkdir -p "$out/include/mach-o"
-            for header in "''${machohdrs[@]}"; do
-              machosrc="${bootstrapTools}/include-Libsystem/mach-o/$header"
-              if [ -e "$machosrc" ]; then
-                cp -r "$machosrc" "$out/include/mach-o/$header"
-              fi
-            done
-          '';
-
-          passthru = {
-            isFromBootstrapFiles = true;
-            targetPrefix = "";
-          };
-        };
-
         locale = self.stdenv.mkDerivation {
           name = "bootstrap-stage0-locale";
           buildCommand = ''
@@ -468,11 +485,8 @@ in
       );
     };
 
-    # The bootstrap tools may use `strip` from cctools, so use a compatible set of flags until LLVM
-    # is rebuilt, and darwin.binutils can use its implementation instead.
     extraPreHook = ''
-      stripAllFlags=" "    # the cctools "strip" command doesn't know "-s"
-      stripDebugFlags="-S" # the cctools "strip" command does something odd with "-p"
+      stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
     '';
   })
 
@@ -482,11 +496,11 @@ in
   (prevStage:
     # previous stage0 stdenv:
     assert lib.all isFromBootstrapFiles (
-      with prevStage; [ bash coreutils cpio gnugrep ] ++ lib.optionals useAppleSDKLibs [ pbzx ]
+      with prevStage; [ bash cctools coreutils cpio gnugrep ld64 ] ++ lib.optionals useAppleSDKLibs [ pbzx ]
     );
 
     assert lib.all isFromBootstrapFiles (with prevStage.darwin; [
-      binutils-unwrapped cctools print-reexports rewrite-tbd sigtool
+      binutils-unwrapped print-reexports rewrite-tbd sigtool
     ]);
 
     assert (! useAppleSDKLibs) -> lib.all isFromBootstrapFiles (with prevStage.darwin; [ Libsystem ]);
@@ -503,9 +517,10 @@ in
 
     overrides = self: super: {
       inherit (prevStage) ccWrapperStdenv
-        coreutils gnugrep;
+        cctools coreutils gnugrep ld64;
 
-      binutils-unwrapped = builtins.throw "nothing in the bootstrap should depend on GNU binutils";
+      binutils-unwrapped = builtins.throw "nothing in the Darwin bootstrap should depend on GNU binutils";
+      curl = builtins.throw "nothing in the Darwin bootstrap can depend on curl";
 
       # Use this stage’s CF to build CMake. It’s required but can’t be included in the stdenv.
       cmake = self.cmakeMinimal;
@@ -532,9 +547,9 @@ in
         buildInputs = old.buildInputs or [ ] ++ [ self.darwin.CF ];
       });
 
-      darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
-        inherit (prevStage.darwin) cctools;
+      scons = super.scons.override { python3Packages = self.python3Minimal.pkgs; };
 
+      darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
         apple_sdk = superDarwin.apple_sdk // {
           inherit (prevStage.darwin.apple_sdk) sdkRoot;
         };
@@ -555,17 +570,31 @@ in
         # Rewrap binutils with the real Libsystem
         binutils = superDarwin.binutils.override {
           inherit (self) coreutils;
-          inherit (selfDarwin) postLinkSignHook signingUtils;
-
           bintools = selfDarwin.binutils-unwrapped;
           libc = selfDarwin.Libsystem;
           # TODO(@sternenseemann): can this be removed?
           runtimeShell = "${bootstrapTools}/bin/bash";
+
+          # Bootstrap tools cctools needs the hook to make sure things are signed properly.
+          # This can be dropped once the bootstrap tools cctools has been updated to 1010.6.
+          extraBuildCommands = ''
+            echo 'source ${selfDarwin.postLinkSignHook}' >> $out/nix-support/post-link-hook
+
+            export signingUtils=${selfDarwin.signingUtils}
+
+            wrap \
+              install_name_tool ${../../build-support/bintools-wrapper/darwin-install_name_tool-wrapper.sh} \
+              "${selfDarwin.binutils-unwrapped}/bin/install_name_tool"
+
+            wrap \
+              strip ${../../build-support/bintools-wrapper/darwin-strip-wrapper.sh} \
+              "${selfDarwin.binutils-unwrapped}/bin/strip"
+          '';
         };
 
         # Avoid building unnecessary Python dependencies due to building LLVM manpages.
         binutils-unwrapped = superDarwin.binutils-unwrapped.override {
-          inherit (selfDarwin) cctools;
+          inherit (self) cctools ld64;
           enableManpages = false;
         };
       });
@@ -588,21 +617,16 @@ in
       prevStage.gnu-config
     ];
 
-    # The bootstrap tools may use `strip` from cctools, so use a compatible set of flags until LLVM
-    # is rebuilt, and darwin.binutils can use its implementation instead.
-    extraPreHook = ''
-      stripAllFlags=" "    # the cctools "strip" command doesn't know "-s"
-      stripDebugFlags="-S" # the cctools "strip" command does something odd with "-p"
 
-      # Don’t assume the ld64 in bootstrap tools supports response files. Only recent versions do.
-      export NIX_LD_USE_RESPONSE_FILE=0
+    extraPreHook = ''
+      stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
     '';
   })
 
   # Build sysctl for use by LLVM’s check phase. It must be built separately to avoid an infinite recursion.
   (prevStage:
     # previous stage1 stdenv:
-    assert lib.all isFromBootstrapFiles (with prevStage; [ coreutils gnugrep ]);
+    assert lib.all isFromBootstrapFiles (with prevStage; [ cctools coreutils gnugrep ld64 ]);
 
     assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
       autoconf automake bash bison brotli cmake cpio cyrus_sasl db
@@ -612,9 +636,8 @@ in
       subversion texinfo unzip which xz zlib zstd
     ]);
 
-    assert lib.all isFromBootstrapFiles (with prevStage.darwin; [ cctools ]);
     assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [
-      locale libtapi print-reexports rewrite-tbd sigtool
+      locale print-reexports rewrite-tbd sigtool
     ]);
 
     assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ Libsystem configd ]);
@@ -633,8 +656,8 @@ in
 
     overrides = self: super: {
       inherit (prevStage) ccWrapperStdenv
-        autoconf automake bash binutils binutils-unwrapped bison brotli cmake cmakeMinimal
-        coreutils cpio cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu
+        autoconf automake bash binutils-unwrapped bison brotli cctools cmake cmakeMinimal
+        coreutils cpio curl cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu ld64
         libedit libffi libidn2 libkrb5 libssh2 libtool libunistring libxml2 m4
         ncurses nghttp2 ninja openldap openssh openssl patchutils pbzx perl pkg-config
         python3Minimal scons sed serf sharutils sqlite subversion texinfo unzip which xz
@@ -655,7 +678,7 @@ in
 
       darwin = super.darwin.overrideScope (_: superDarwin: {
         inherit (prevStage.darwin)
-          CF sdkRoot Libsystem binutils-unwrapped cctools cctools-port configd darwin-stubs dyld
+          CF sdkRoot Libsystem binutils binutils-unwrapped configd darwin-stubs dtrace dyld
           launchd libclosure libdispatch libobjc locale objc4 postLinkSignHook
           print-reexports rewrite-tbd signingUtils sigtool;
 
@@ -683,10 +706,8 @@ in
       prevStage.gnu-config
     ];
 
-    # Until LLVM is rebuilt, assume `strip` is the one from cctools.
     extraPreHook = ''
-      stripAllFlags=" "    # the cctools "strip" command doesn't know "-s"
-      stripDebugFlags="-S" # the cctools "strip" command does something odd with "-p"
+      stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
     '';
   })
 
@@ -695,21 +716,23 @@ in
   # but those libraries will be used in the final stdenv.
   #
   # Rebuild coreutils and gnugrep to avoid unwanted references to the bootstrap tools on `PATH`.
+  #
+  # The first build of cctools is deferred until this stage because it depends on LLVM headers
+  # that are not included in the bootstrap tools tarball.
   (prevStage:
     # previous stage-sysctl stdenv:
-    assert lib.all isFromBootstrapFiles (with prevStage; [ coreutils gnugrep ]);
+    assert lib.all isFromBootstrapFiles (with prevStage; [ cctools coreutils gnugrep ld64 ]);
 
     assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
       atf autoconf automake bash bison brotli cmake cpio cyrus_sasl db
       ed expat flex gettext gmp groff icu kyua libedit libffi libiconv libidn2 libkrb5 libssh2
-      libtool libunistring libxml2 m4 meson ncurses nghttp2 ninja openldap openssh openssl
+      libtapi libtool libunistring libxml2 m4 meson ncurses nghttp2 ninja openldap openssh openssl
       patchutils pbzx perl pkg-config.pkg-config python3 python3Minimal scons serf sqlite
       subversion sysctl.provider texinfo unzip which xz zlib zstd
     ]);
 
-    assert lib.all isFromBootstrapFiles (with prevStage.darwin; [ cctools ]);
     assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [
-      locale libtapi print-reexports rewrite-tbd sigtool
+      locale print-reexports rewrite-tbd sigtool
     ]);
 
     assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ Libsystem configd ]);
@@ -726,12 +749,15 @@ in
 
     overrides = self: super: {
       inherit (prevStage) ccWrapperStdenv
-        atf autoconf automake bash binutils binutils-unwrapped bison brotli cmake cmakeMinimal
-        cpio cyrus_sasl db ed expat flex gettext gmp groff icu kyua libedit libffi libiconv
+        atf autoconf automake bash binutils-unwrapped bison brotli cmake cmakeMinimal
+        cpio curl cyrus_sasl db ed expat flex gettext gmp groff icu kyua libedit libffi libiconv
         libidn2 libkrb5 libssh2 libtool libunistring libxml2 m4 meson ncurses nghttp2 ninja
         openldap openssh openssl patchutils pbzx perl pkg-config python3 python3Minimal
         scons sed serf sharutils sqlite subversion sysctl texinfo unzip which xz zlib zstd;
 
+      # Disable ld64’s install check phase because the required LTO libraries are not built yet.
+      ld64 = super.ld64.overrideAttrs { doInstallCheck = false; };
+
       darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
         inherit (prevStage.darwin)
           CF Libsystem configd darwin-stubs dyld launchd libclosure libdispatch libobjc
@@ -787,8 +813,7 @@ in
     ];
 
     extraPreHook = ''
-      stripAllFlags=" "    # the cctools "strip" command doesn't know "-s"
-      stripDebugFlags="-S" # the cctools "strip" command does something odd with "-p"
+      stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
     '';
   })
 
@@ -797,8 +822,8 @@ in
   (prevStage:
     # previous stage-xclang stdenv:
     assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
-      atf autoconf automake bash bison cmake cmakeMinimal coreutils cpio
-      cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu kyua libedit libtool m4 meson ninja
+      atf autoconf automake bash bison cctools cmake cmakeMinimal coreutils cpio
+      cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu kyua ld64 libedit libtapi libtool m4 meson ninja
       openbsm openldap openpam openssh patchutils pbzx perl pkg-config.pkg-config python3
       python3Minimal scons serf sqlite subversion sysctl.provider texinfo unzip which xz
     ]);
@@ -809,7 +834,7 @@ in
     ]);
 
     assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [
-      cctools locale libtapi print-reexports rewrite-tbd sigtool
+      locale print-reexports rewrite-tbd sigtool
     ]);
 
     assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ Libsystem configd ]);
@@ -825,13 +850,13 @@ in
 
     stageFun prevStage {
 
-    name = "bootstrap-stage2-Libsystem";
+    name = "bootstrap-stage2";
 
     overrides = self: super: {
       inherit (prevStage) ccWrapperStdenv
-        atf autoconf automake binutils-unwrapped bison brotli cmake cmakeMinimal coreutils
-        cpio cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu kyua libedit libffi
-        libiconv libidn2 libkrb5 libssh2 libtool libunistring libxml2 m4 meson ncurses nghttp2
+        atf autoconf automake binutils-unwrapped bison brotli cctools cmake cmakeMinimal coreutils
+        cpio curl cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu kyua ld64 libedit libffi
+        libiconv libidn2 libkrb5 libssh2 libtapi libtool libunistring libxml2 m4 meson ncurses nghttp2
         ninja openbsm openldap openpam openssh openssl patchutils pbzx perl pkg-config
         python3 python3Minimal scons serf sqlite subversion sysctl texinfo unzip which xz
         zlib zstd;
@@ -844,106 +869,12 @@ in
 
       darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
         inherit (prevStage.darwin)
-          CF binutils-unwrapped cctools configd darwin-stubs launchd libobjc libtapi locale
-          objc4 print-reexports rewrite-tbd signingUtils sigtool;
+          binutils-unwrapped configd darwin-stubs launchd locale postLinkSignHook
+          print-reexports rewrite-tbd signingUtils sigtool;
 
         apple_sdk = superDarwin.apple_sdk // {
           inherit (prevStage.darwin.apple_sdk) sdkRoot;
         };
-      });
-
-      llvmPackages = super.llvmPackages // (
-        let
-          tools = super.llvmPackages.tools.extend (_: _: {
-            inherit (prevStage.llvmPackages) clang-unwrapped clangNoCompilerRtWithLibc libclang libllvm llvm;
-          });
-
-          libraries = super.llvmPackages.libraries.extend (selfLib: superLib: {
-            inherit (prevStage.llvmPackages) compiler-rt libcxx;
-          });
-        in
-        { inherit tools libraries; inherit (prevStage.llvmPackages) release_version; } // tools // libraries
-      );
-
-      # Don’t link anything in this stage against CF to prevent propagating CF from prior stages to
-      # the final stdenv, which happens because of the rpath hook.
-      stdenv =
-        let
-          stdenvNoCF = super.stdenv.override {
-            extraBuildInputs = [ ];
-          };
-        in
-        self.overrideCC stdenvNoCF (self.llvmPackages.clangNoCompilerRtWithLibc.override {
-          inherit (self.llvmPackages) libcxx;
-        });
-    };
-
-    extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
-      prevStage.updateAutotoolsGnuConfigScriptsHook
-      prevStage.gnu-config
-    ];
-
-    extraPreHook = ''
-      stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
-    '';
-  })
-
-  # This stage rebuilds CF, compiler-rt, and the sdkRoot derivation.
-  #
-  # CF requires:
-  # - aarch64-darwin: libobjc (due to being apple_sdk.frameworks.CoreFoundation instead of swift-corefoundation)
-  # - x86_64-darwin: libiconv libxml2 icu zlib
-  (prevStage:
-    # previous stage2-Libsystem stdenv:
-    assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
-      atf autoconf automake bison brotli cmake cmakeMinimal coreutils
-      cpio cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu kyua libedit libidn2
-      libkrb5 libssh2 libtool libunistring m4 meson nghttp2 ninja openbsm openldap openpam openssh
-      openssl patchutils pbzx perl pkg-config.pkg-config python3 python3Minimal scons serf
-      sqlite subversion sysctl.provider texinfo unzip which xz zstd
-    ]);
-
-    assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [ bash ]);
-
-    assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
-      libffi libiconv libxml2 ncurses zlib zstd
-    ]);
-
-    assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [
-      cctools locale libtapi print-reexports rewrite-tbd sigtool
-    ]);
-
-    assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ configd ]);
-    assert (! useAppleSDKLibs) -> lib.all        isBuiltByNixpkgsCompiler (with prevStage.darwin; [ Libsystem ]);
-    assert (! useAppleSDKLibs) -> lib.all                   isFromNixpkgs (with prevStage.darwin; [ CF ]);
-    assert    useAppleSDKLibs  -> lib.all                   isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc ]);
-    assert lib.all isFromNixpkgs (with prevStage.darwin; [ binutils-unwrapped  dyld launchd libclosure libdispatch xnu ]);
-
-    assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.llvmPackages; [
-      clang-unwrapped libclang libllvm llvm
-    ]);
-    assert lib.all isBuiltByNixpkgsCompiler (with prevStage.llvmPackages; [ libcxx ]);
-    assert prevStage.llvmPackages.compiler-rt == null;
-
-    stageFun prevStage {
-
-    name = "bootstrap-stage2-CF";
-
-    overrides = self: super: {
-      inherit (prevStage) ccWrapperStdenv
-        atf autoconf automake bash bison brotli cmake cmakeMinimal coreutils cpio
-        cyrus_sasl db ed expat flex gettext gmp gnugrep groff kyua libedit libidn2 libkrb5
-        libssh2 libtool libunistring m4 meson ncurses nghttp2 ninja openbsm openldap openpam
-        openssh openssl patchutils pbzx perl pkg-config python3 python3Minimal scons serf
-        sqlite subversion sysctl texinfo unzip which xz zstd;
-
-      # Avoid pulling in a full python and its extra dependencies for the llvm/clang builds.
-      libxml2 = super.libxml2.override { pythonSupport = false; };
-
-      darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
-        inherit (prevStage.darwin)
-          Libsystem configd darwin-stubs launchd locale print-reexports rewrite-tbd
-          signingUtils sigtool;
 
         # Rewrap binutils so it uses the rebuilt Libsystem.
         binutils = superDarwin.binutils.override {
@@ -958,7 +889,6 @@ in
         let
           tools = super.llvmPackages.tools.extend (_: _: {
             inherit (prevStage.llvmPackages) clang-unwrapped clangNoCompilerRtWithLibc libclang lld libllvm llvm;
-            clang = prevStage.stdenv.cc;
           });
 
           libraries = super.llvmPackages.libraries.extend (selfLib: superLib: {
@@ -978,8 +908,7 @@ in
       );
 
       # Don’t link anything in this stage against CF to prevent propagating CF from prior stages to
-      # the final stdenv, which happens because of the rpath hook. Also don’t use a stdenv with
-      # compiler-rt because it needs to be built in this stage.
+      # the final stdenv, which happens because of the rpath hook.
       stdenv =
         let
           stdenvNoCF = super.stdenv.override {
@@ -988,12 +917,6 @@ in
         in
         self.overrideCC stdenvNoCF (self.llvmPackages.clangNoCompilerRtWithLibc.override {
           inherit (self.llvmPackages) libcxx;
-
-          # Make sure the stdenv is using the Libsystem that will be propagated to the final stdenv.
-          libc = self.darwin.Libsystem;
-          bintools = self.llvmPackages.clangNoCompilerRtWithLibc.bintools.override {
-            libc = self.darwin.Libsystem;
-          };
         });
     };
 
@@ -1009,26 +932,21 @@ in
 
   # Rebuild LLVM with LLVM. This stage also rebuilds certain dependencies needed by LLVM.
   #
-  # LLVM requires: libcxx libffi libiconv libxml2 ncurses zlib
+  # LLVM requires: libcxx libffi libiconv libxml2 ncurses python3 zlib
   (prevStage:
-    # previous stage2-CF stdenv:
+    # previous stage2 stdenv:
     assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
-      autoconf automake bison brotli cmake cmakeMinimal coreutils cpio cyrus_sasl
-      db ed expat flex gettext gmp gnugrep groff libedit libidn2 libkrb5 libssh2 libtool
-      libunistring m4 meson ncurses nghttp2 ninja openbsm openldap openpam openssh openssl
+      autoconf automake bison brotli cctools cmake cmakeMinimal coreutils cpio cyrus_sasl
+      db ed expat flex gettext gmp gnugrep groff icu ld64 libedit libffi libiconv libidn2 libkrb5 libssh2 libtool
+      libtapi libunistring libxml2 m4 meson ncurses nghttp2 ninja openbsm openldap openpam openssh openssl
       patchutils pbzx perl pkg-config.pkg-config python3 python3Minimal scons serf sqlite
-      subversion sysctl.provider texinfo unzip which xz zstd
-    ]);
-    assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [
-      bash icu libffi libiconv libxml2 zlib
+      subversion sysctl.provider texinfo unzip which xz zstd zlib
     ]);
+    assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [ bash ]);
 
     assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [
       locale print-reexports rewrite-tbd sigtool
     ]);
-    assert lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [
-      cctools libtapi
-    ]);
 
     assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ configd ]);
     assert (! useAppleSDKLibs) -> lib.all        isBuiltByNixpkgsCompiler (with prevStage.darwin; [ Libsystem ]);
@@ -1047,22 +965,22 @@ in
 
     overrides = self: super: {
       inherit (prevStage) ccWrapperStdenv
-        autoconf automake bash binutils binutils-unwrapped bison brotli cmake cmakeMinimal
-        coreutils cpio cyrus_sasl db ed expat flex gettext gmp gnugrep groff libedit
+        autoconf automake bash binutils-unwrapped bison brotli cmake cmakeMinimal
+        coreutils cpio curl cyrus_sasl db ed expat flex gettext gmp gnugrep groff libedit
         libidn2 libkrb5 libssh2 libtool libunistring m4 meson nghttp2 ninja openbsm openldap
         openpam openssh openssl patchutils pbzx perl pkg-config python3 python3Minimal scons
-        sed serf sharutils sqlite subversion sysctl texinfo unzip which xz zstd
-
-        # CF dependencies - don’t rebuild them.
-        icu libiconv libiconv-darwin libxml2 zlib;
+        sed serf sharutils sqlite subversion sysctl texinfo unzip which xz zstd;
 
       # Disable tests because they use dejagnu, which fails to run.
       libffi = super.libffi.override { doCheck = false; };
 
+      # Avoid pulling in a full python and its extra dependencies for the llvm/clang builds.
+      libxml2 = super.libxml2.override { pythonSupport = false; };
+
       darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
         inherit (prevStage.darwin)
-          CF Libsystem binutils binutils-unwrapped cctools cctools-port configd
-          darwin-stubs dyld launchd libclosure libdispatch libobjc libtapi locale objc4
+          CF Libsystem binutils binutils-unwrapped configd
+          darwin-stubs dyld launchd libclosure libdispatch libobjc locale objc4
           postLinkSignHook print-reexports rewrite-tbd signingUtils sigtool;
 
         apple_sdk = superDarwin.apple_sdk // {
@@ -1103,15 +1021,12 @@ in
     ]);
 
     assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [
-      bash icu libffi libiconv libxml2 zlib
+      bash cctools icu ld64 libtapi libffi libiconv libxml2 zlib
     ]);
 
     assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [
       locale print-reexports rewrite-tbd sigtool
     ]);
-    assert lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [
-      cctools libtapi
-    ]);
 
     assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ configd ]);
     assert (! useAppleSDKLibs) -> lib.all        isBuiltByNixpkgsCompiler (with prevStage.darwin; [ Libsystem ]);
@@ -1129,8 +1044,8 @@ in
 
     overrides = self: super: {
       inherit (prevStage) ccWrapperStdenv
-        autoconf automake bash bison cmake cmakeMinimal cyrus_sasl db expat flex groff
-        libedit libtool m4 meson ninja openldap openssh patchutils perl pkg-config python3 scons
+        autoconf automake bash binutils-unwrapped bison cmake cmakeMinimal curl cyrus_sasl db expat flex groff
+        libedit libtool m4 meson ninja openldap openssh patchutils perl pkg-config python3 python3Minimal scons
         serf sqlite subversion sysctl texinfo unzip which
 
         # CF dependencies - don’t rebuild them.
@@ -1258,15 +1173,13 @@ in
   (prevStage:
     # previous stage4 stdenv:
     assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [
-      bash brotli bzip2 cpio diffutils ed file findutils gawk
-      gettext gmp gnugrep gnumake gnused gnutar gzip icu libffi libiconv libidn2 libkrb5
-      libssh2 libunistring libxml2 libyaml ncurses nghttp2 openbsm openpam openssl patch
-      pbzx pcre python3Minimal xar xz zlib zstd
+      bash brotli bzip2 cctools cpio diffutils ed file findutils gawk
+      gettext gmp gnugrep gnumake gnused gnutar gzip icu ld64 libffi libiconv libidn2 libkrb5
+      libssh2 libtapi libunistring libxml2 libyaml ncurses nghttp2 openbsm openpam openssl patch
+      pbzx pcre xar xz zlib zstd
     ]);
 
-    assert lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [
-      cctools libtapi locale print-reexports rewrite-tbd sigtool
-    ]);
+    assert lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ locale print-reexports rewrite-tbd sigtool ]);
 
     assert (! useAppleSDKLibs) -> lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ Libsystem configd ]);
     assert (! useAppleSDKLibs) -> lib.all            isFromNixpkgs (with prevStage.darwin; [ CF ]);
@@ -1279,13 +1192,11 @@ in
 
     assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
       autoconf automake bison cmake cmakeMinimal cyrus_sasl db expat flex groff libedit
-      libtool m4 meson ninja openldap openssh patchutils perl pkg-config.pkg-config python3 scons
+      libtool m4 meson ninja openldap openssh patchutils perl pkg-config.pkg-config python3 python3Minimal scons
       serf sqlite subversion sysctl.provider texinfo unzip which
     ]);
 
     let
-      doSign = localSystem.isAarch64;
-
       cc = prevStage.llvmPackages.clang;
     in
     {
@@ -1337,6 +1248,10 @@ in
         bzip2.bin
         bzip2.out
         cc.expand-response-params
+        cctools
+        ld64.out
+        ld64.lib
+        libtapi.out
         coreutils
         darwin.binutils
         darwin.binutils.bintools
@@ -1363,13 +1278,14 @@ in
         ncurses.out
         openbsm
         openpam
+        openssl.out
         patch
+        xar
         xz.bin
         xz.out
         zlib.dev
         zlib.out
-      ]
-      ++ lib.optionals doSign [ openssl.out ])
+      ])
       ++ lib.optionals localSystem.isAarch64 [
         prevStage.updateAutotoolsGnuConfigScriptsHook
         prevStage.gnu-config
@@ -1389,36 +1305,34 @@ in
       ++ (with prevStage.darwin; [
         CF
         Libsystem
-        cctools-port
         dyld
-        libtapi
         locale
         apple_sdk.sdkRoot
       ]
-      ++ lib.optional useAppleSDKLibs [ objc4 ]
-      ++ lib.optionals doSign [ postLinkSignHook sigtool signingUtils ]);
+      ++ lib.optionals useAppleSDKLibs [ objc4 ]);
 
       __stdenvImpureHostDeps = commonImpureHostDeps;
       __extraImpureHostDeps = commonImpureHostDeps;
 
       overrides = self: super: {
         inherit (prevStage)
-          bash binutils brotli bzip2 coreutils cpio diffutils ed file findutils gawk
+          bash brotli bzip2 coreutils cpio diffutils ed file findutils gawk
           gettext gmp gnugrep gnumake gnused gnutar gzip icu libffi libiconv libiconv-darwin
           libidn2 libssh2 libunistring libxml2 libyaml ncurses nghttp2 openbsm openpam
           openssl patch pbzx pcre python3Minimal xar xz zlib zstd;
 
         darwin = super.darwin.overrideScope (_: superDarwin: {
           inherit (prevStage.darwin)
-            CF ICU Libsystem darwin-stubs dyld locale libobjc libtapi rewrite-tbd xnu;
+            CF Libsystem darwin-stubs dyld locale libobjc rewrite-tbd xnu;
 
           apple_sdk = superDarwin.apple_sdk // {
             inherit (prevStage.darwin.apple_sdk) sdkRoot;
           };
         } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
-          inherit (prevStage.darwin) binutils binutils-unwrapped cctools-port;
+          inherit (prevStage.darwin) binutils binutils-unwrapped;
         });
       } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
+        inherit (prevStage) cctools ld64 libtapi;
         inherit (prevStage.llvmPackages) clang llvm;
 
         # Need to get rid of these when cross-compiling.
@@ -1437,13 +1351,14 @@ in
     };
   })
 
-  # This "no-op" stage is just a place to put the assertions about stage6.
+  # This "no-op" stage is just a place to put the assertions about the final stage.
   (prevStage:
     # previous final stage stdenv:
+    assert isBuiltByNixpkgsCompiler prevStage.cctools;
+    assert isBuiltByNixpkgsCompiler prevStage.ld64;
     assert isBuiltByNixpkgsCompiler prevStage.darwin.sigtool;
     assert isBuiltByNixpkgsCompiler prevStage.darwin.print-reexports;
     assert isBuiltByNixpkgsCompiler prevStage.darwin.rewrite-tbd;
-    assert isBuiltByNixpkgsCompiler prevStage.darwin.cctools;
 
     assert            isFromNixpkgs prevStage.darwin.CF;
     assert            isFromNixpkgs prevStage.darwin.Libsystem;
@@ -1457,6 +1372,7 @@ in
     # Make sure these evaluate since they were disabled explicitly in the bootstrap.
     assert isBuiltByNixpkgsCompiler prevStage.binutils-unwrapped;
     assert            isFromNixpkgs prevStage.binutils-unwrapped.src;
+    assert isBuiltByNixpkgsCompiler prevStage.curl;
 
     { inherit (prevStage) config overlays stdenv; })
 ]