summary refs log tree commit diff
path: root/pkgs/stdenv
diff options
context:
space:
mode:
authorhappysalada <raphael@megzari.com>2021-06-02 13:25:56 +0900
committerRaphael Megzari <raphael@megzari.com>2021-06-02 19:03:48 +0900
commit1c1c7685d97440593afb9e7aa2c46ce6a746ac35 (patch)
treea6cb0c3fa2c1040deaf0295f415892b0b4571d97 /pkgs/stdenv
parent99febc68c9bc7fe470233f7c116b8083abab6880 (diff)
downloadnixpkgs-1c1c7685d97440593afb9e7aa2c46ce6a746ac35.tar
nixpkgs-1c1c7685d97440593afb9e7aa2c46ce6a746ac35.tar.gz
nixpkgs-1c1c7685d97440593afb9e7aa2c46ce6a746ac35.tar.bz2
nixpkgs-1c1c7685d97440593afb9e7aa2c46ce6a746ac35.tar.lz
nixpkgs-1c1c7685d97440593afb9e7aa2c46ce6a746ac35.tar.xz
nixpkgs-1c1c7685d97440593afb9e7aa2c46ce6a746ac35.tar.zst
nixpkgs-1c1c7685d97440593afb9e7aa2c46ce6a746ac35.zip
stdenv.darwin: nixpkgs-fmt
Diffstat (limited to 'pkgs/stdenv')
-rw-r--r--pkgs/stdenv/darwin/default.nix762
1 files changed, 439 insertions, 323 deletions
diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix
index efa19d2783e..4ff512386e8 100644
--- a/pkgs/stdenv/darwin/default.nix
+++ b/pkgs/stdenv/darwin/default.nix
@@ -1,33 +1,38 @@
 { lib
-, localSystem, crossSystem, config, overlays, crossOverlays ? []
-# Allow passing in bootstrap files directly so we can test the stdenv bootstrap process when changing the bootstrap tools
-, bootstrapFiles ?
-  if localSystem.isAarch64 then
+, localSystem
+, crossSystem
+, config
+, overlays
+, crossOverlays ? [ ]
+  # Allow passing in bootstrap files directly so we can test the stdenv bootstrap process when changing the bootstrap tools
+, bootstrapFiles ? if localSystem.isAarch64 then
     let
       fetch = { file, sha256, executable ? true }: import <nix/fetchurl.nix> {
         url = "http://tarballs.nixos.org/stdenv-darwin/aarch64/20acd4c4f14040485f40e55c0a76c186aa8ca4f3/${file}";
         inherit (localSystem) system;
         inherit sha256 executable;
-      }; in {
-        sh      = fetch { file = "sh";    sha256 = "17m3xrlbl99j3vm7rzz3ghb47094dyddrbvs2a6jalczvmx7spnj"; };
-        bzip2   = fetch { file = "bzip2"; sha256 = "1khs8s5klf76plhlvlc1ma838r8pc1qigk9f5bdycwgbn0nx240q"; };
-        mkdir   = fetch { file = "mkdir"; sha256 = "1m9nk90paazl93v43myv2ay68c1arz39pqr7lk5ddbgb177hgg8a"; };
-        cpio    = fetch { file = "cpio";  sha256 = "17pxq61yjjvyd738fy9f392hc9cfzkl612sdr9rxr3v0dgvm8y09"; };
-        tarball = fetch { file = "bootstrap-tools.cpio.bz2"; sha256 = "1v2332k33akm6mrm4bj749rxnnmc2pkbgcslmd0bbkf76bz2ildy"; executable = false; };
-      }
+      }; in
+    {
+      sh = fetch { file = "sh"; sha256 = "17m3xrlbl99j3vm7rzz3ghb47094dyddrbvs2a6jalczvmx7spnj"; };
+      bzip2 = fetch { file = "bzip2"; sha256 = "1khs8s5klf76plhlvlc1ma838r8pc1qigk9f5bdycwgbn0nx240q"; };
+      mkdir = fetch { file = "mkdir"; sha256 = "1m9nk90paazl93v43myv2ay68c1arz39pqr7lk5ddbgb177hgg8a"; };
+      cpio = fetch { file = "cpio"; sha256 = "17pxq61yjjvyd738fy9f392hc9cfzkl612sdr9rxr3v0dgvm8y09"; };
+      tarball = fetch { file = "bootstrap-tools.cpio.bz2"; sha256 = "1v2332k33akm6mrm4bj749rxnnmc2pkbgcslmd0bbkf76bz2ildy"; executable = false; };
+    }
   else
     let
       fetch = { file, sha256, executable ? true }: import <nix/fetchurl.nix> {
         url = "http://tarballs.nixos.org/stdenv-darwin/x86_64/5ab5783e4f46c373c6de84deac9ad59b608bb2e6/${file}";
         inherit (localSystem) system;
         inherit sha256 executable;
-      }; in {
-        sh      = fetch { file = "sh";    sha256 = "sha256-nbb4XEk3go7ttiWrQyKQMLzPr+qUnwnHkWMtVCZsMCs="; };
-        bzip2   = fetch { file = "bzip2"; sha256 = "sha256-ybnA+JWrKhXSfn20+GVKXkHFTp2Zt79hat8hAVmsUOc="; };
-        mkdir   = fetch { file = "mkdir"; sha256 = "sha256-nmvMxmfcY41/60Z/E8L9u0vgePW5l30Dqw1z+Nr02Hk="; };
-        cpio    = fetch { file = "cpio";  sha256 = "sha256-cB36rN3NLj19Tk37Kc5bodMFMO+mCpEQkKKo0AEMkaU="; };
-        tarball = fetch { file = "bootstrap-tools.cpio.bz2"; sha256 = "sha256-kh2vKmjCr/HvR06czZbxUxV5KDRxSF27M6nN3cyofRI="; executable = false; };
-      }
+      }; in
+    {
+      sh = fetch { file = "sh"; sha256 = "sha256-nbb4XEk3go7ttiWrQyKQMLzPr+qUnwnHkWMtVCZsMCs="; };
+      bzip2 = fetch { file = "bzip2"; sha256 = "sha256-ybnA+JWrKhXSfn20+GVKXkHFTp2Zt79hat8hAVmsUOc="; };
+      mkdir = fetch { file = "mkdir"; sha256 = "sha256-nmvMxmfcY41/60Z/E8L9u0vgePW5l30Dqw1z+Nr02Hk="; };
+      cpio = fetch { file = "cpio"; sha256 = "sha256-cB36rN3NLj19Tk37Kc5bodMFMO+mCpEQkKKo0AEMkaU="; };
+      tarball = fetch { file = "bootstrap-tools.cpio.bz2"; sha256 = "sha256-kh2vKmjCr/HvR06czZbxUxV5KDRxSF27M6nN3cyofRI="; executable = false; };
+    }
 }:
 
 assert crossSystem == localSystem;
@@ -51,7 +56,8 @@ let
     "/usr/lib/system/libunc.dylib" # This dependency is "hidden", so our scanning code doesn't pick it up
   ];
 
-in rec {
+in
+rec {
   commonPreHook = ''
     export NIX_ENFORCE_NO_NATIVE=''${NIX_ENFORCE_NO_NATIVE-1}
     export NIX_ENFORCE_PURITY=''${NIX_ENFORCE_PURITY-1}
@@ -67,9 +73,9 @@ in rec {
   bootstrapTools = derivation ({
     inherit system;
 
-    name    = "bootstrap-tools";
+    name = "bootstrap-tools";
     builder = bootstrapFiles.sh; # Not a filename! Attribute 'sh' on bootstrapFiles
-    args    = if localSystem.isAarch64 then [ ./unpack-bootstrap-tools-aarch64.sh ] else [ ./unpack-bootstrap-tools.sh ];
+    args = if localSystem.isAarch64 then [ ./unpack-bootstrap-tools-aarch64.sh ] else [ ./unpack-bootstrap-tools.sh ];
 
     inherit (bootstrapFiles) mkdir bzip2 cpio tarball;
 
@@ -80,13 +86,14 @@ in rec {
     outputHashMode = "recursive";
   });
 
-  stageFun = step: last: {shell             ? "${bootstrapTools}/bin/bash",
-                          overrides         ? (self: super: {}),
-                          extraPreHook      ? "",
-                          extraNativeBuildInputs,
-                          extraBuildInputs,
-                          libcxx,
-                          allowedRequisites ? null}:
+  stageFun = step: last: { shell ? "${bootstrapTools}/bin/bash"
+                         , overrides ? (self: super: { })
+                         , extraPreHook ? ""
+                         , extraNativeBuildInputs
+                         , extraBuildInputs
+                         , libcxx
+                         , allowedRequisites ? null
+                         }:
     let
       name = "bootstrap-stage${toString step}";
 
@@ -110,17 +117,19 @@ in rec {
           inherit lib shell;
           inherit (last) stdenvNoCC;
 
-          nativeTools  = false;
-          nativeLibc   = false;
+          nativeTools = false;
+          nativeLibc = false;
           inherit buildPackages libcxx;
           inherit (last.pkgs) coreutils gnugrep;
-          bintools     = last.pkgs.darwin.binutils;
-          libc         = last.pkgs.darwin.Libsystem;
-          isClang      = true;
-          cc           = last.pkgs."${finalLlvmPackages}".clang-unwrapped;
-        }; in args // (overrides args));
-
-      cc = if last == null then "/dev/null" else mkCC ({ cc, ... }: {
+          bintools = last.pkgs.darwin.binutils;
+          libc = last.pkgs.darwin.Libsystem;
+          isClang = true;
+          cc = last.pkgs."${finalLlvmPackages}".clang-unwrapped;
+        }; in args // (overrides args)
+      );
+
+      cc = if last == null then "/dev/null" else
+      mkCC ({ cc, ... }: {
         extraPackages = [
           last.pkgs."${finalLlvmPackages}".libcxxabi
           last.pkgs."${finalLlvmPackages}".compiler-rt
@@ -128,7 +137,8 @@ in rec {
         extraBuildCommands = mkExtraBuildCommands cc;
       });
 
-      ccNoLibcxx = if last == null then "/dev/null" else mkCC ({ cc, ... }: {
+      ccNoLibcxx = if last == null then "/dev/null" else
+      mkCC ({ cc, ... }: {
         libcxx = null;
         extraPackages = [
           last.pkgs."${finalLlvmPackages}".compiler-rt
@@ -146,13 +156,16 @@ in rec {
         inherit config shell extraBuildInputs;
 
         extraNativeBuildInputs = extraNativeBuildInputs ++ lib.optionals doUpdateAutoTools [
-          last.pkgs.updateAutotoolsGnuConfigScriptsHook last.pkgs.gnu-config
+          last.pkgs.updateAutotoolsGnuConfigScriptsHook
+          last.pkgs.gnu-config
         ];
 
         allowedRequisites = if allowedRequisites == null then null else allowedRequisites ++ [
-          cc.expand-response-params cc.bintools
+          cc.expand-response-params
+          cc.bintools
         ] ++ lib.optionals doUpdateAutoTools [
-          last.pkgs.updateAutotoolsGnuConfigScriptsHook last.pkgs.gnu-config
+          last.pkgs.updateAutotoolsGnuConfigScriptsHook
+          last.pkgs.gnu-config
         ] ++ lib.optionals doSign [
           last.pkgs.darwin.postLinkSignHook
           last.pkgs.darwin.sigtool
@@ -173,7 +186,7 @@ in rec {
           ${commonPreHook}
           ${extraPreHook}
         '';
-        initialPath  = [ bootstrapTools ];
+        initialPath = [ bootstrapTools ];
 
         fetchurlBoot = import ../../build-support/fetchurl {
           inherit lib;
@@ -185,13 +198,14 @@ in rec {
         __stdenvImpureHostDeps = commonImpureHostDeps;
         __extraImpureHostDeps = commonImpureHostDeps;
 
-        overrides  = self: super: (overrides self super) // {
+        overrides = self: super: (overrides self super) // {
           inherit ccNoLibcxx;
           fetchurl = thisStdenv.fetchurlBoot;
         };
       };
 
-    in {
+    in
+    {
       inherit config overlays;
       stdenv = thisStdenv;
     };
@@ -289,11 +303,11 @@ in rec {
           inherit lib;
           inherit (self) stdenvNoCC;
 
-          nativeTools  = false;
-          nativeLibc   = false;
+          nativeTools = false;
+          nativeLibc = false;
           inherit (self) buildPackages coreutils gnugrep;
-          libc         = selfDarwin.Libsystem;
-          bintools     = selfDarwin.binutils-unwrapped;
+          libc = selfDarwin.Libsystem;
+          bintools = selfDarwin.binutils-unwrapped;
           inherit (selfDarwin) postLinkSignHook signingUtils;
         };
       } // lib.optionalAttrs (! useAppleSDKLibs) {
@@ -374,317 +388,419 @@ in rec {
       };
     };
 
-    extraNativeBuildInputs = [];
-    extraBuildInputs = [];
+    extraNativeBuildInputs = [ ];
+    extraBuildInputs = [ ];
     libcxx = null;
   };
 
-  stage1 = prevStage: let
-    persistent = self: super: with prevStage; {
-      cmake = super.cmakeMinimal;
-
-      inherit pbzx cpio;
+  stage1 = prevStage:
+    let
+      persistent = self: super: with prevStage; {
+        cmake = super.cmakeMinimal;
 
-      python3 = super.python3Minimal;
+        inherit pbzx cpio;
 
-      ninja = super.ninja.override { buildDocs = false; };
+        python3 = super.python3Minimal;
 
-      "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (let
-        tools = super."${finalLlvmPackages}".tools.extend (_: _: {
-          inherit (pkgs."${finalLlvmPackages}") clang-unwrapped;
-        });
-        libraries = super."${finalLlvmPackages}".libraries.extend (_: _: {
-          inherit (pkgs."${finalLlvmPackages}") compiler-rt libcxx libcxxabi;
-        });
-      in { inherit tools libraries; } // tools // libraries);
+        ninja = super.ninja.override { buildDocs = false; };
 
-      darwin = super.darwin.overrideScope (selfDarwin: _: {
-        inherit (darwin) rewrite-tbd binutils-unwrapped;
+        "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (
+          let
+            tools = super."${finalLlvmPackages}".tools.extend (_: _: {
+              inherit (pkgs."${finalLlvmPackages}") clang-unwrapped;
+            });
+            libraries = super."${finalLlvmPackages}".libraries.extend (_: _: {
+              inherit (pkgs."${finalLlvmPackages}") compiler-rt libcxx libcxxabi;
+            });
+          in
+          { inherit tools libraries; } // tools // libraries
+        );
 
-        signingUtils = darwin.signingUtils.override {
-          inherit (selfDarwin) sigtool;
-        };
+        darwin = super.darwin.overrideScope (selfDarwin: _: {
+          inherit (darwin) rewrite-tbd binutils-unwrapped;
 
-        binutils = darwin.binutils.override {
-          coreutils = self.coreutils;
-          libc = selfDarwin.Libsystem;
-          inherit (selfDarwin) postLinkSignHook signingUtils;
-        };
-      });
-    };
-  in with prevStage; stageFun 1 prevStage {
-    extraPreHook = "export NIX_CFLAGS_COMPILE+=\" -F${bootstrapTools}/Library/Frameworks\"";
-    extraNativeBuildInputs = [];
-    extraBuildInputs = [ pkgs.darwin.CF ];
-    libcxx = pkgs."${finalLlvmPackages}".libcxx;
-
-    allowedRequisites =
-      [ bootstrapTools ] ++
-      (with pkgs; [ coreutils gnugrep ]) ++
-      (with pkgs."${finalLlvmPackages}"; [ libcxx libcxxabi compiler-rt clang-unwrapped ]) ++
-      (with pkgs.darwin; [ Libsystem CF ] ++ lib.optional useAppleSDKLibs objc4);
-
-    overrides = persistent;
-  };
+          signingUtils = darwin.signingUtils.override {
+            inherit (selfDarwin) sigtool;
+          };
 
-  stage2 = prevStage: let
-    persistent = self: super: with prevStage; {
-      inherit
-        zlib patchutils m4 scons flex perl bison unifdef unzip openssl python3
-        libxml2 gettext sharutils gmp libarchive ncurses pkg-config libedit groff
-        openssh sqlite sed serf openldap db cyrus-sasl expat apr-util subversion xz
-        findfreetype libssh curl cmake autoconf automake libtool ed cpio coreutils
-        libssh2 nghttp2 libkrb5 ninja brotli;
-
-      "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (let
-        tools = super."${finalLlvmPackages}".tools.extend (_: _: {
-          inherit (pkgs."${finalLlvmPackages}") clang-unwrapped;
-        });
-        libraries = super."${finalLlvmPackages}".libraries.extend (_: libSuper: {
-          inherit (pkgs."${finalLlvmPackages}") compiler-rt;
-          libcxx = libSuper.libcxx.override {
-            stdenv = overrideCC self.stdenv self.ccNoLibcxx;
+          binutils = darwin.binutils.override {
+            coreutils = self.coreutils;
+            libc = selfDarwin.Libsystem;
+            inherit (selfDarwin) postLinkSignHook signingUtils;
           };
-          libcxxabi = libSuper.libcxxabi.override ({
-            stdenv = overrideCC self.stdenv self.ccNoLibcxx;
-          } // lib.optionalAttrs (finalLlvmVersion == "7") {
-            # TODO: the bootstrapping of llvm packages isn't consistent.
-            # `standalone` may be redundant if darwin behaves like useLLVM (or
-            # has useLLVM = true).
-            standalone = true;
-          });
         });
-      in { inherit tools libraries; } // tools // libraries);
-
-      darwin = super.darwin.overrideScope (_: _: {
-        inherit (darwin)
-          binutils dyld Libsystem xnu configd ICU libdispatch libclosure
-          launchd CF objc4 darwin-stubs sigtool postLinkSignHook signingUtils;
-      });
+      };
+    in
+    with prevStage; stageFun 1 prevStage {
+      extraPreHook = "export NIX_CFLAGS_COMPILE+=\" -F${bootstrapTools}/Library/Frameworks\"";
+      extraNativeBuildInputs = [ ];
+      extraBuildInputs = [ pkgs.darwin.CF ];
+      libcxx = pkgs."${finalLlvmPackages}".libcxx;
+
+      allowedRequisites =
+        [ bootstrapTools ] ++
+        (with pkgs; [ coreutils gnugrep ]) ++
+        (with pkgs."${finalLlvmPackages}"; [ libcxx libcxxabi compiler-rt clang-unwrapped ]) ++
+        (with pkgs.darwin; [ Libsystem CF ] ++ lib.optional useAppleSDKLibs objc4);
+
+      overrides = persistent;
     };
-  in with prevStage; stageFun 2 prevStage {
-    extraPreHook = ''
-      export PATH_LOCALE=${pkgs.darwin.locale}/share/locale
-    '';
-
-    extraNativeBuildInputs = [ pkgs.xz ];
-    extraBuildInputs = [ pkgs.darwin.CF ];
-    libcxx = pkgs."${finalLlvmPackages}".libcxx;
-
-    allowedRequisites =
-      [ bootstrapTools ] ++
-      (with pkgs; [
-        xz.bin xz.out zlib libxml2.out curl.out openssl.out libssh2.out
-        nghttp2.lib coreutils gnugrep pcre.out gmp libiconv brotli.lib
-      ] ++ lib.optional haveKRB5 libkrb5) ++
-      (with pkgs."${finalLlvmPackages}"; [
-       libcxx libcxxabi compiler-rt clang-unwrapped
-      ]) ++
-      (with pkgs.darwin; [ dyld Libsystem CF ICU locale ] ++ lib.optional useAppleSDKLibs objc4);
-
-    overrides = persistent;
-  };
 
-  stage3 = prevStage: let
-    persistent = self: super: with prevStage; {
-      inherit
-        patchutils m4 scons flex perl bison unifdef unzip openssl python3
-        gettext sharutils libarchive pkg-config groff bash subversion
-        openssh sqlite sed serf openldap db cyrus-sasl expat apr-util
-        findfreetype libssh curl cmake autoconf automake libtool cpio
-        libssh2 nghttp2 libkrb5 ninja;
-
-      # Avoid pulling in a full python and its extra dependencies for the llvm/clang builds.
-      libxml2 = super.libxml2.override { pythonSupport = false; };
-
-      "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (let
-        libraries = super."${finalLlvmPackages}".libraries.extend (_: _: {
-          inherit (pkgs."${finalLlvmPackages}") libcxx libcxxabi;
+  stage2 = prevStage:
+    let
+      persistent = self: super: with prevStage; {
+        inherit
+          zlib patchutils m4 scons flex perl bison unifdef unzip openssl python3
+          libxml2 gettext sharutils gmp libarchive ncurses pkg-config libedit groff
+          openssh sqlite sed serf openldap db cyrus-sasl expat apr-util subversion xz
+          findfreetype libssh curl cmake autoconf automake libtool ed cpio coreutils
+          libssh2 nghttp2 libkrb5 ninja brotli;
+
+        "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (
+          let
+            tools = super."${finalLlvmPackages}".tools.extend (_: _: {
+              inherit (pkgs."${finalLlvmPackages}") clang-unwrapped;
+            });
+            libraries = super."${finalLlvmPackages}".libraries.extend (_: libSuper: {
+              inherit (pkgs."${finalLlvmPackages}") compiler-rt;
+              libcxx = libSuper.libcxx.override {
+                stdenv = overrideCC self.stdenv self.ccNoLibcxx;
+              };
+              libcxxabi = libSuper.libcxxabi.override ({
+                stdenv = overrideCC self.stdenv self.ccNoLibcxx;
+              } // lib.optionalAttrs (finalLlvmVersion == "7") {
+                # TODO: the bootstrapping of llvm packages isn't consistent.
+                # `standalone` may be redundant if darwin behaves like useLLVM (or
+                # has useLLVM = true).
+                standalone = true;
+              });
+            });
+          in
+          { inherit tools libraries; } // tools // libraries
+        );
+
+        darwin = super.darwin.overrideScope (_: _: {
+          inherit (darwin)
+            binutils dyld Libsystem xnu configd ICU libdispatch libclosure
+            launchd CF objc4 darwin-stubs sigtool postLinkSignHook signingUtils;
         });
-      in { inherit libraries; } // libraries);
+      };
+    in
+    with prevStage; stageFun 2 prevStage {
+      extraPreHook = ''
+        export PATH_LOCALE=${pkgs.darwin.locale}/share/locale
+      '';
 
-      darwin = super.darwin.overrideScope (_: _: {
-        inherit (darwin)
-          dyld Libsystem xnu configd libdispatch libclosure launchd libiconv
-          locale darwin-stubs sigtool;
-      });
+      extraNativeBuildInputs = [ pkgs.xz ];
+      extraBuildInputs = [ pkgs.darwin.CF ];
+      libcxx = pkgs."${finalLlvmPackages}".libcxx;
+
+      allowedRequisites =
+        [ bootstrapTools ] ++
+        (with pkgs; [
+          xz.bin
+          xz.out
+          zlib
+          libxml2.out
+          curl.out
+          openssl.out
+          libssh2.out
+          nghttp2.lib
+          coreutils
+          gnugrep
+          pcre.out
+          gmp
+          libiconv
+          brotli.lib
+        ] ++ lib.optional haveKRB5 libkrb5) ++
+        (with pkgs."${finalLlvmPackages}"; [
+          libcxx
+          libcxxabi
+          compiler-rt
+          clang-unwrapped
+        ]) ++
+        (with pkgs.darwin; [ dyld Libsystem CF ICU locale ] ++ lib.optional useAppleSDKLibs objc4);
+
+      overrides = persistent;
     };
-  in with prevStage; stageFun 3 prevStage {
-    shell = "${pkgs.bash}/bin/bash";
-
-    # We have a valid shell here (this one has no bootstrap-tools runtime deps) so stageFun
-    # enables patchShebangs above. Unfortunately, patchShebangs ignores our $SHELL setting
-    # and instead goes by $PATH, which happens to contain bootstrapTools. So it goes and
-    # patches our shebangs back to point at bootstrapTools. This makes sure bash comes first.
-    extraNativeBuildInputs = with pkgs; [ xz ];
-    extraBuildInputs = [ pkgs.darwin.CF pkgs.bash ];
-    libcxx = pkgs."${finalLlvmPackages}".libcxx;
-
-    extraPreHook = ''
-      export PATH=${pkgs.bash}/bin:$PATH
-      export PATH_LOCALE=${pkgs.darwin.locale}/share/locale
-    '';
-
-    allowedRequisites =
-      [ bootstrapTools ] ++
-      (with pkgs; [
-        xz.bin xz.out bash zlib libxml2.out curl.out openssl.out libssh2.out
-        nghttp2.lib coreutils gnugrep pcre.out gmp libiconv brotli.lib
-      ] ++ lib.optional haveKRB5 libkrb5) ++
-      (with pkgs."${finalLlvmPackages}"; [
-       libcxx libcxx.dev libcxxabi libcxxabi.dev compiler-rt clang-unwrapped
-      ]) ++
-      (with pkgs.darwin; [ dyld ICU Libsystem locale ] ++ lib.optional useAppleSDKLibs objc4);
-
-    overrides = persistent;
-  };
 
-  stage4 = prevStage: let
-    persistent = self: super: with prevStage; {
-      inherit
-        gnumake gzip gnused bzip2 gawk ed xz patch bash python3
-        ncurses libffi zlib gmp pcre gnugrep cmake
-        coreutils findutils diffutils patchutils ninja libxml2;
-
-      # Hack to make sure we don't link ncurses in bootstrap tools. The proper
-      # solution is to avoid passing -L/nix-store/...-bootstrap-tools/lib,
-      # quite a sledgehammer just to get the C runtime.
-      gettext = super.gettext.overrideAttrs (drv: {
-        configureFlags = drv.configureFlags ++ [
-          "--disable-curses"
-        ];
-      });
-
-      "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (let
-        tools = super."${finalLlvmPackages}".tools.extend (llvmSelf: _: {
-          clang-unwrapped-all-outputs = pkgs."${finalLlvmPackages}".clang-unwrapped-all-outputs.override { llvm = llvmSelf.llvm; };
-          libllvm = pkgs."${finalLlvmPackages}".libllvm.override { inherit libxml2; };
-        });
-        libraries = super."${finalLlvmPackages}".libraries.extend (llvmSelf: _: {
-          inherit (pkgs."${finalLlvmPackages}") libcxx libcxxabi compiler-rt;
+  stage3 = prevStage:
+    let
+      persistent = self: super: with prevStage; {
+        inherit
+          patchutils m4 scons flex perl bison unifdef unzip openssl python3
+          gettext sharutils libarchive pkg-config groff bash subversion
+          openssh sqlite sed serf openldap db cyrus-sasl expat apr-util
+          findfreetype libssh curl cmake autoconf automake libtool cpio
+          libssh2 nghttp2 libkrb5 ninja;
+
+        # Avoid pulling in a full python and its extra dependencies for the llvm/clang builds.
+        libxml2 = super.libxml2.override { pythonSupport = false; };
+
+        "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (
+          let
+            libraries = super."${finalLlvmPackages}".libraries.extend (_: _: {
+              inherit (pkgs."${finalLlvmPackages}") libcxx libcxxabi;
+            });
+          in
+          { inherit libraries; } // libraries
+        );
+
+        darwin = super.darwin.overrideScope (_: _: {
+          inherit (darwin)
+            dyld Libsystem xnu configd libdispatch libclosure launchd libiconv
+            locale darwin-stubs sigtool;
         });
-      in { inherit tools libraries; } // tools // libraries);
-
-      darwin = super.darwin.overrideScope (_: superDarwin: {
-        inherit (darwin) dyld Libsystem libiconv locale darwin-stubs;
+      };
+    in
+    with prevStage; stageFun 3 prevStage {
+      shell = "${pkgs.bash}/bin/bash";
+
+      # We have a valid shell here (this one has no bootstrap-tools runtime deps) so stageFun
+      # enables patchShebangs above. Unfortunately, patchShebangs ignores our $SHELL setting
+      # and instead goes by $PATH, which happens to contain bootstrapTools. So it goes and
+      # patches our shebangs back to point at bootstrapTools. This makes sure bash comes first.
+      extraNativeBuildInputs = with pkgs; [ xz ];
+      extraBuildInputs = [ pkgs.darwin.CF pkgs.bash ];
+      libcxx = pkgs."${finalLlvmPackages}".libcxx;
+
+      extraPreHook = ''
+        export PATH=${pkgs.bash}/bin:$PATH
+        export PATH_LOCALE=${pkgs.darwin.locale}/share/locale
+      '';
 
-        # See useAppleSDKLibs in darwin-packages.nix
-        CF = if useAppleSDKLibs then super.darwin.CF else superDarwin.CF.override {
-          inherit libxml2;
-          python3 = prevStage.python3;
-        };
-      });
+      allowedRequisites =
+        [ bootstrapTools ] ++
+        (with pkgs; [
+          xz.bin
+          xz.out
+          bash
+          zlib
+          libxml2.out
+          curl.out
+          openssl.out
+          libssh2.out
+          nghttp2.lib
+          coreutils
+          gnugrep
+          pcre.out
+          gmp
+          libiconv
+          brotli.lib
+        ] ++ lib.optional haveKRB5 libkrb5) ++
+        (with pkgs."${finalLlvmPackages}"; [
+          libcxx
+          libcxx.dev
+          libcxxabi
+          libcxxabi.dev
+          compiler-rt
+          clang-unwrapped
+        ]) ++
+        (with pkgs.darwin; [ dyld ICU Libsystem locale ] ++ lib.optional useAppleSDKLibs objc4);
+
+      overrides = persistent;
     };
-  in with prevStage; stageFun 4 prevStage {
-    shell = "${pkgs.bash}/bin/bash";
-    extraNativeBuildInputs = with pkgs; [ xz ];
-    extraBuildInputs = [ pkgs.darwin.CF pkgs.bash ];
-    libcxx = pkgs."${finalLlvmPackages}".libcxx;
-
-    extraPreHook = ''
-      export PATH_LOCALE=${pkgs.darwin.locale}/share/locale
-    '';
-    overrides = persistent;
-  };
-
-  stdenvDarwin = prevStage: let
-    doSign = localSystem.isAarch64;
-    pkgs = prevStage;
-    persistent = self: super: with prevStage; {
-      inherit
-        gnumake gzip gnused bzip2 gawk ed xz patch bash
-        ncurses libffi zlib gmp pcre gnugrep
-        coreutils findutils diffutils patchutils pbzx;
-
-      darwin =  super.darwin.overrideScope (_: _: {
-        inherit (darwin) dyld ICU Libsystem Csu libiconv rewrite-tbd;
-      } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
-        inherit (darwin) binutils binutils-unwrapped cctools;
-      });
-    } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
-      inherit llvm;
 
-      # Need to get rid of these when cross-compiling.
-      "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (let
-        tools = super."${finalLlvmPackages}".tools.extend (_: super: {
-          inherit (pkgs."${finalLlvmPackages}") llvm clang-unwrapped;
-        });
-        libraries = super."${finalLlvmPackages}".libraries.extend (_: _: {
-          inherit (pkgs."${finalLlvmPackages}") compiler-rt libcxx libcxxabi;
+  stage4 = prevStage:
+    let
+      persistent = self: super: with prevStage; {
+        inherit
+          gnumake gzip gnused bzip2 gawk ed xz patch bash python3
+          ncurses libffi zlib gmp pcre gnugrep cmake
+          coreutils findutils diffutils patchutils ninja libxml2;
+
+        # Hack to make sure we don't link ncurses in bootstrap tools. The proper
+        # solution is to avoid passing -L/nix-store/...-bootstrap-tools/lib,
+        # quite a sledgehammer just to get the C runtime.
+        gettext = super.gettext.overrideAttrs (drv: {
+          configureFlags = drv.configureFlags ++ [
+            "--disable-curses"
+          ];
         });
-      in { inherit tools libraries; } // tools // libraries);
 
-      inherit binutils binutils-unwrapped;
+        "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (
+          let
+            tools = super."${finalLlvmPackages}".tools.extend (llvmSelf: _: {
+              clang-unwrapped-all-outputs = pkgs."${finalLlvmPackages}".clang-unwrapped-all-outputs.override { llvm = llvmSelf.llvm; };
+              libllvm = pkgs."${finalLlvmPackages}".libllvm.override { inherit libxml2; };
+            });
+            libraries = super."${finalLlvmPackages}".libraries.extend (llvmSelf: _: {
+              inherit (pkgs."${finalLlvmPackages}") libcxx libcxxabi compiler-rt;
+            });
+          in
+          { inherit tools libraries; } // tools // libraries
+        );
+
+        darwin = super.darwin.overrideScope (_: superDarwin: {
+          inherit (darwin) dyld Libsystem libiconv locale darwin-stubs;
+
+          # See useAppleSDKLibs in darwin-packages.nix
+          CF = if useAppleSDKLibs then super.darwin.CF else
+          superDarwin.CF.override {
+            inherit libxml2;
+            python3 = prevStage.python3;
+          };
+        });
+      };
+    in
+    with prevStage; stageFun 4 prevStage {
+      shell = "${pkgs.bash}/bin/bash";
+      extraNativeBuildInputs = with pkgs; [ xz ];
+      extraBuildInputs = [ pkgs.darwin.CF pkgs.bash ];
+      libcxx = pkgs."${finalLlvmPackages}".libcxx;
+
+      extraPreHook = ''
+        export PATH_LOCALE=${pkgs.darwin.locale}/share/locale
+      '';
+      overrides = persistent;
     };
-  in import ../generic rec {
-    name = "stdenv-darwin";
 
-    inherit config;
-    inherit (pkgs.stdenv) fetchurlBoot;
+  stdenvDarwin = prevStage:
+    let
+      doSign = localSystem.isAarch64;
+      pkgs = prevStage;
+      persistent = self: super: with prevStage; {
+        inherit
+          gnumake gzip gnused bzip2 gawk ed xz patch bash
+          ncurses libffi zlib gmp pcre gnugrep
+          coreutils findutils diffutils patchutils pbzx;
+
+        darwin = super.darwin.overrideScope (_: _: {
+          inherit (darwin) dyld ICU Libsystem Csu libiconv rewrite-tbd;
+        } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
+          inherit (darwin) binutils binutils-unwrapped cctools;
+        });
+      } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
+        inherit llvm;
+
+        # Need to get rid of these when cross-compiling.
+        "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (
+          let
+            tools = super."${finalLlvmPackages}".tools.extend (_: super: {
+              inherit (pkgs."${finalLlvmPackages}") llvm clang-unwrapped;
+            });
+            libraries = super."${finalLlvmPackages}".libraries.extend (_: _: {
+              inherit (pkgs."${finalLlvmPackages}") compiler-rt libcxx libcxxabi;
+            });
+          in
+          { inherit tools libraries; } // tools // libraries
+        );
+
+        inherit binutils binutils-unwrapped;
+      };
+    in
+    import ../generic rec {
+      name = "stdenv-darwin";
 
-    buildPlatform = localSystem;
-    hostPlatform = localSystem;
-    targetPlatform = localSystem;
+      inherit config;
+      inherit (pkgs.stdenv) fetchurlBoot;
 
-    preHook = commonPreHook + ''
-      export NIX_COREFOUNDATION_RPATH=${pkgs.darwin.CF}/Library/Frameworks
-      export PATH_LOCALE=${pkgs.darwin.locale}/share/locale
-    '';
+      buildPlatform = localSystem;
+      hostPlatform = localSystem;
+      targetPlatform = localSystem;
 
-    __stdenvImpureHostDeps = commonImpureHostDeps;
-    __extraImpureHostDeps = commonImpureHostDeps;
+      preHook = commonPreHook + ''
+        export NIX_COREFOUNDATION_RPATH=${pkgs.darwin.CF}/Library/Frameworks
+        export PATH_LOCALE=${pkgs.darwin.locale}/share/locale
+      '';
 
-    initialPath = import ../common-path.nix { inherit pkgs; };
-    shell       = "${pkgs.bash}/bin/bash";
+      __stdenvImpureHostDeps = commonImpureHostDeps;
+      __extraImpureHostDeps = commonImpureHostDeps;
 
-    cc = pkgs."${finalLlvmPackages}".libcxxClang;
+      initialPath = import ../common-path.nix { inherit pkgs; };
+      shell = "${pkgs.bash}/bin/bash";
 
-    extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
-      pkgs.updateAutotoolsGnuConfigScriptsHook
-    ];
+      cc = pkgs."${finalLlvmPackages}".libcxxClang;
 
-    extraBuildInputs = [ pkgs.darwin.CF ];
+      extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
+        pkgs.updateAutotoolsGnuConfigScriptsHook
+      ];
 
-    extraAttrs = {
-      libc = pkgs.darwin.Libsystem;
-      shellPackage = pkgs.bash;
-      inherit bootstrapTools;
-    };
+      extraBuildInputs = [ pkgs.darwin.CF ];
 
-    allowedRequisites = (with pkgs; [
-      xz.out xz.bin gmp.out gnumake findutils bzip2.out
-      bzip2.bin
-      zlib.out zlib.dev libffi.out coreutils ed diffutils gnutar
-      gzip ncurses.out ncurses.dev ncurses.man gnused bash gawk
-      gnugrep patch pcre.out gettext
-      binutils.bintools darwin.binutils darwin.binutils.bintools
-      curl.out openssl.out libssh2.out nghttp2.lib brotli.lib
-      cc.expand-response-params libxml2.out
-    ] ++ lib.optional haveKRB5 libkrb5
-    ++ lib.optionals localSystem.isAarch64 [
-      pkgs.updateAutotoolsGnuConfigScriptsHook pkgs.gnu-config
-    ])
-    ++ (with pkgs."${finalLlvmPackages}"; [
-      libcxx libcxx.dev libcxxabi libcxxabi.dev
-      llvm llvm.lib compiler-rt compiler-rt.dev
-      clang-unwrapped libclang.dev libclang.lib
-    ])
-    ++ (with pkgs.darwin; [
-      dyld Libsystem CF cctools ICU libiconv locale libtapi
-    ] ++ lib.optional useAppleSDKLibs objc4
-    ++ lib.optionals doSign [ postLinkSignHook sigtool signingUtils ]);
-
-    overrides = lib.composeExtensions persistent (self: super: {
-      darwin = super.darwin.overrideScope (_: superDarwin: {
-        inherit (prevStage.darwin) CF darwin-stubs;
-        xnu = superDarwin.xnu.override { inherit (prevStage) python3; };
+      extraAttrs = {
+        libc = pkgs.darwin.Libsystem;
+        shellPackage = pkgs.bash;
+        inherit bootstrapTools;
+      };
+
+      allowedRequisites = (with pkgs; [
+        xz.out
+        xz.bin
+        gmp.out
+        gnumake
+        findutils
+        bzip2.out
+        bzip2.bin
+        zlib.out
+        zlib.dev
+        libffi.out
+        coreutils
+        ed
+        diffutils
+        gnutar
+        gzip
+        ncurses.out
+        ncurses.dev
+        ncurses.man
+        gnused
+        bash
+        gawk
+        gnugrep
+        patch
+        pcre.out
+        gettext
+        binutils.bintools
+        darwin.binutils
+        darwin.binutils.bintools
+        curl.out
+        openssl.out
+        libssh2.out
+        nghttp2.lib
+        brotli.lib
+        cc.expand-response-params
+        libxml2.out
+      ] ++ lib.optional haveKRB5 libkrb5
+      ++ lib.optionals localSystem.isAarch64 [
+        pkgs.updateAutotoolsGnuConfigScriptsHook
+        pkgs.gnu-config
+      ])
+      ++ (with pkgs."${finalLlvmPackages}"; [
+        libcxx
+        libcxx.dev
+        libcxxabi
+        libcxxabi.dev
+        llvm
+        llvm.lib
+        compiler-rt
+        compiler-rt.dev
+        clang-unwrapped
+        libclang.dev
+        libclang.lib
+      ])
+      ++ (with pkgs.darwin; [
+        dyld
+        Libsystem
+        CF
+        cctools
+        ICU
+        libiconv
+        locale
+        libtapi
+      ] ++ lib.optional useAppleSDKLibs objc4
+      ++ lib.optionals doSign [ postLinkSignHook sigtool signingUtils ]);
+
+      overrides = lib.composeExtensions persistent (self: super: {
+        darwin = super.darwin.overrideScope (_: superDarwin: {
+          inherit (prevStage.darwin) CF darwin-stubs;
+          xnu = superDarwin.xnu.override { inherit (prevStage) python3; };
+        });
+      } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
+        clang = cc;
+        llvmPackages = super.llvmPackages // { clang = cc; };
+        inherit cc;
       });
-    } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
-      clang = cc;
-      llvmPackages = super.llvmPackages // { clang = cc; };
-      inherit cc;
-    });
-  };
+    };
 
   stagesDarwin = [
     ({}: stage0)