summary refs log tree commit diff
path: root/pkgs/stdenv
diff options
context:
space:
mode:
authorAndrew Childs <lorne@cons.org.nz>2020-11-19 17:28:20 +0900
committerAndrew Childs <lorne@cons.org.nz>2021-05-17 00:27:02 +0900
commit768aae66efcb50672f0ed728f218f18348193e27 (patch)
tree277df7a920c76a168231c18ae10f587f7551eb6d /pkgs/stdenv
parent3eacdfe24aef2d6aef539172b172bf0439bef74f (diff)
downloadnixpkgs-768aae66efcb50672f0ed728f218f18348193e27.tar
nixpkgs-768aae66efcb50672f0ed728f218f18348193e27.tar.gz
nixpkgs-768aae66efcb50672f0ed728f218f18348193e27.tar.bz2
nixpkgs-768aae66efcb50672f0ed728f218f18348193e27.tar.lz
nixpkgs-768aae66efcb50672f0ed728f218f18348193e27.tar.xz
nixpkgs-768aae66efcb50672f0ed728f218f18348193e27.tar.zst
nixpkgs-768aae66efcb50672f0ed728f218f18348193e27.zip
stdenv/darwin: Apple Silicon support
Diffstat (limited to 'pkgs/stdenv')
-rw-r--r--pkgs/stdenv/darwin/default.nix356
-rw-r--r--pkgs/stdenv/darwin/unpack-bootstrap-tools-aarch64.sh52
-rw-r--r--pkgs/stdenv/default.nix1
3 files changed, 299 insertions, 110 deletions
diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix
index 6ccebd20ade..caa3cb8e201 100644
--- a/pkgs/stdenv/darwin/default.nix
+++ b/pkgs/stdenv/darwin/default.nix
@@ -1,18 +1,33 @@
 { 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 ? 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; };
-  }
+, bootstrapFiles ?
+  if localSystem.isAarch64 then
+    let
+      fetch = { file, sha256, executable ? true }: import <nix/fetchurl.nix> {
+        url = null; # to be built by hydra and injected here
+        inherit (localSystem) system;
+        inherit sha256 executable;
+      }; in {
+        sh      = fetch { file = "sh";    sha256 = "0000000000000000000000000000000000000000000000000000"; };
+        bzip2   = fetch { file = "bzip2"; sha256 = "0000000000000000000000000000000000000000000000000000"; };
+        mkdir   = fetch { file = "mkdir"; sha256 = "0000000000000000000000000000000000000000000000000000"; };
+        cpio    = fetch { file = "cpio";  sha256 = "0000000000000000000000000000000000000000000000000000"; };
+        tarball = fetch { file = "bootstrap-tools.cpio.bz2"; sha256 = "0000000000000000000000000000000000000000000000000000"; 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; };
+      }
 }:
 
 assert crossSystem == localSystem;
@@ -20,13 +35,22 @@ assert crossSystem == localSystem;
 let
   inherit (localSystem) system;
 
-  bootstrapClangVersion = "7.1.0";
+  # Bootstrap version needs to be known to reference headers included in the bootstrap tools
+  bootstrapLlvmVersion = if localSystem.isAarch64 then "11.1.0" else "7.1.0";
+
+  useAppleSDKLibs = localSystem.isAarch64;
+  haveKRB5 = localSystem.isx86_64;
+
+  # final toolchain is injected into llvmPackages_${finalLlvmVersion}
+  finalLlvmVersion = if localSystem.isAarch64 then "11" else "7";
+  finalLlvmPackages = "llvmPackages_${finalLlvmVersion}";
 
   commonImpureHostDeps = [
     "/bin/sh"
     "/usr/lib/libSystem.B.dylib"
     "/usr/lib/system/libunc.dylib" # This dependency is "hidden", so our scanning code doesn't pick it up
   ];
+
 in rec {
   commonPreHook = ''
     export NIX_ENFORCE_NO_NATIVE=''${NIX_ENFORCE_NO_NATIVE-1}
@@ -45,7 +69,7 @@ in rec {
 
     name    = "bootstrap-tools";
     builder = bootstrapFiles.sh; # Not a filename! Attribute 'sh' on bootstrapFiles
-    args    = [ ./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;
 
@@ -70,11 +94,14 @@ in rec {
         inherit (last) stdenv;
       };
 
+      doSign = localSystem.isAarch64 && last != null;
+      doUpdateAutoTools = localSystem.isAarch64 && last != null;
+
       mkExtraBuildCommands = cc: ''
         rsrc="$out/resource-root"
         mkdir "$rsrc"
         ln -s "${cc.lib or cc}/lib/clang/${cc.version}/include" "$rsrc"
-        ln -s "${last.pkgs.llvmPackages_7.compiler-rt.out}/lib" "$rsrc/lib"
+        ln -s "${last.pkgs."${finalLlvmPackages}".compiler-rt.out}/lib" "$rsrc/lib"
         echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
       '';
 
@@ -90,13 +117,13 @@ in rec {
           bintools     = last.pkgs.darwin.binutils;
           libc         = last.pkgs.darwin.Libsystem;
           isClang      = true;
-          cc           = last.pkgs.llvmPackages_7.clang-unwrapped;
+          cc           = last.pkgs."${finalLlvmPackages}".clang-unwrapped;
         }; in args // (overrides args));
 
       cc = if last == null then "/dev/null" else mkCC ({ cc, ... }: {
         extraPackages = [
-          last.pkgs.llvmPackages_7.libcxxabi
-          last.pkgs.llvmPackages_7.compiler-rt
+          last.pkgs."${finalLlvmPackages}".libcxxabi
+          last.pkgs."${finalLlvmPackages}".compiler-rt
         ];
         extraBuildCommands = mkExtraBuildCommands cc;
       });
@@ -104,11 +131,11 @@ in rec {
       ccNoLibcxx = if last == null then "/dev/null" else mkCC ({ cc, ... }: {
         libcxx = null;
         extraPackages = [
-          last.pkgs.llvmPackages_7.compiler-rt
+          last.pkgs."${finalLlvmPackages}".compiler-rt
         ];
         extraBuildCommands = ''
           echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags
-          echo "-B${last.pkgs.llvmPackages_7.compiler-rt}/lib" >> $out/nix-support/cc-cflags
+          echo "-B${last.pkgs."${finalLlvmPackages}".compiler-rt}/lib" >> $out/nix-support/cc-cflags
           echo "-nostdlib++" >> $out/nix-support/cc-cflags
         '' + mkExtraBuildCommands cc;
       });
@@ -116,9 +143,20 @@ in rec {
       thisStdenv = import ../generic {
         name = "${name}-stdenv-darwin";
 
-        inherit config shell extraNativeBuildInputs extraBuildInputs;
+        inherit config shell extraBuildInputs;
+
+        extraNativeBuildInputs = extraNativeBuildInputs ++ lib.optionals doUpdateAutoTools [
+          last.pkgs.updateAutotoolsGnuConfigScriptsHook last.pkgs.gnu-config
+        ];
+
         allowedRequisites = if allowedRequisites == null then null else allowedRequisites ++ [
           cc.expand-response-params cc.bintools
+        ] ++ lib.optionals doUpdateAutoTools [
+          last.pkgs.updateAutotoolsGnuConfigScriptsHook last.pkgs.gnu-config
+        ] ++ lib.optionals doSign [
+          last.pkgs.darwin.postLinkSignHook
+          last.pkgs.darwin.sigtool
+          last.pkgs.darwin.signingUtils
         ];
 
         buildPlatform = localSystem;
@@ -176,7 +214,97 @@ in rec {
         '';
       };
 
+      pbzx = stdenv.mkDerivation {
+        name = "bootstrap-stage0-pbzx";
+        phases = [ "installPhase" ];
+        installPhase = ''
+          mkdir -p $out/bin
+          ln -s ${bootstrapTools}/bin/pbzx $out/bin
+        '';
+      };
+
+      cpio = stdenv.mkDerivation {
+        name = "bootstrap-stage0-cpio";
+        phases = [ "installPhase" ];
+        installPhase = ''
+          mkdir -p $out/bin
+          ln -s ${bootstrapFiles.cpio} $out/bin/cpio
+        '';
+      };
+
       darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
+        darwin-stubs = superDarwin.darwin-stubs.override { inherit (self) stdenvNoCC fetchurl; };
+
+        dyld = {
+          name = "bootstrap-stage0-dyld";
+          buildCommand = ''
+            mkdir -p $out
+            ln -s ${bootstrapTools}/lib     $out/lib
+            ln -s ${bootstrapTools}/include $out/include
+          '';
+        };
+
+        sigtool = stdenv.mkDerivation {
+          name = "bootstrap-stage0-sigtool";
+          phases = [ "installPhase" ];
+          installPhase = ''
+            mkdir -p $out/bin
+            ln -s ${bootstrapTools}/bin/sigtool $out/bin
+
+            # Rewrite nuked references
+            sed -e "s|[^( ]*\bsigtool\b|$out/bin/sigtool|g" \
+              ${bootstrapTools}/bin/codesign > $out/bin/codesign
+            chmod a+x $out/bin/codesign
+          '';
+        };
+
+        print-reexports = stdenv.mkDerivation {
+          name = "bootstrap-stage0-print-reexports";
+          phases = [ "installPhase" ];
+          installPhase = ''
+            mkdir -p $out/bin
+            ln -s ${bootstrapTools}/bin/print-reexports $out/bin
+          '';
+        };
+
+        rewrite-tbd = stdenv.mkDerivation {
+          name = "bootstrap-stage0-rewrite-tbd";
+          phases = [ "installPhase" ];
+          installPhase = ''
+            mkdir -p $out/bin
+            ln -s ${bootstrapTools}/bin/rewrite-tbd $out/bin
+          '';
+        };
+
+        binutils-unwrapped = { name = "bootstrap-stage0-binutils"; outPath = bootstrapTools; };
+
+        cctools = {
+          name = "bootstrap-stage0-cctools";
+          outPath = bootstrapTools;
+          targetPrefix = "";
+        };
+
+        binutils = lib.makeOverridable (import ../../build-support/bintools-wrapper) {
+          shell = "${bootstrapTools}/bin/bash";
+          inherit lib;
+          inherit (self) stdenvNoCC;
+
+          nativeTools  = false;
+          nativeLibc   = false;
+          inherit (self) buildPackages coreutils gnugrep;
+          libc         = selfDarwin.Libsystem;
+          bintools     = selfDarwin.binutils-unwrapped;
+          inherit (selfDarwin) postLinkSignHook signingUtils;
+        };
+      } // lib.optionalAttrs (! useAppleSDKLibs) {
+        CF = stdenv.mkDerivation {
+          name = "bootstrap-stage0-CF";
+          buildCommand = ''
+            mkdir -p $out/Library/Frameworks
+            ln -s ${bootstrapTools}/Library/Frameworks/CoreFoundation.framework $out/Library/Frameworks
+          '';
+        };
+
         Libsystem = stdenv.mkDerivation {
           name = "bootstrap-stage0-Libsystem";
           buildCommand = ''
@@ -200,35 +328,12 @@ in rec {
             ln -s ${bootstrapTools}/include-Libsystem $out/include
           '';
         };
-
-        darwin-stubs = superDarwin.darwin-stubs.override { inherit (self) stdenvNoCC fetchurl; };
-
-        dyld = {
-          name = "bootstrap-stage0-dyld";
-          buildCommand = ''
-            mkdir -p $out
-            ln -s ${bootstrapTools}/lib     $out/lib
-            ln -s ${bootstrapTools}/include $out/include
-          '';
-        };
-
-        binutils = lib.makeOverridable (import ../../build-support/bintools-wrapper) {
-          shell = "${bootstrapTools}/bin/bash";
-          inherit lib;
-          inherit (self) stdenvNoCC;
-
-          nativeTools  = false;
-          nativeLibc   = false;
-          inherit (self) buildPackages coreutils gnugrep;
-          libc         = selfDarwin.Libsystem;
-          bintools     = { name = "bootstrap-stage0-binutils"; outPath = bootstrapTools; };
-        };
       });
 
-      llvmPackages_7 = {
+      "${finalLlvmPackages}" = {
         clang-unwrapped = stdenv.mkDerivation {
           name = "bootstrap-stage0-clang";
-          version = bootstrapClangVersion;
+          version = bootstrapLlvmVersion;
           buildCommand = ''
             mkdir -p $out/lib
             ln -s ${bootstrapTools}/bin $out/bin
@@ -278,36 +383,46 @@ in rec {
     persistent = self: super: with prevStage; {
       cmake = super.cmakeMinimal;
 
+      inherit pbzx cpio;
+
       python3 = super.python3Minimal;
 
       ninja = super.ninja.override { buildDocs = false; };
 
-      llvmPackages_7 = super.llvmPackages_7 // (let
-        tools = super.llvmPackages_7.tools.extend (_: _: {
-          inherit (llvmPackages_7) clang-unwrapped;
+      "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (let
+        tools = super."${finalLlvmPackages}".tools.extend (_: _: {
+          inherit (pkgs."${finalLlvmPackages}") clang-unwrapped;
         });
-        libraries = super.llvmPackages_7.libraries.extend (_: _: {
-          inherit (llvmPackages_7) compiler-rt libcxx libcxxabi;
+        libraries = super."${finalLlvmPackages}".libraries.extend (_: _: {
+          inherit (pkgs."${finalLlvmPackages}") compiler-rt libcxx libcxxabi;
         });
       in { inherit tools libraries; } // tools // libraries);
 
       darwin = super.darwin.overrideScope (selfDarwin: _: {
+        inherit (darwin) rewrite-tbd binutils-unwrapped;
+
+        signingUtils = darwin.signingUtils.override {
+          inherit (selfDarwin) sigtool;
+        };
+
         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 = [ ];
-    libcxx = pkgs.libcxx;
+    extraBuildInputs = [ pkgs.darwin.CF ];
+    libcxx = pkgs."${finalLlvmPackages}".libcxx;
 
     allowedRequisites =
       [ bootstrapTools ] ++
-      (with pkgs; [ coreutils gnugrep libcxx libcxxabi llvmPackages_7.clang-unwrapped llvmPackages_7.compiler-rt ]) ++
-      (with pkgs.darwin; [ darwin-stubs Libsystem ]);
+      (with pkgs; [ coreutils gnugrep ]) ++
+      (with pkgs."${finalLlvmPackages}"; [ libcxx libcxxabi compiler-rt clang-unwrapped ]) ++
+      (with pkgs.darwin; [ Libsystem CF ] ++ lib.optional useAppleSDKLibs objc4);
 
     overrides = persistent;
   };
@@ -321,26 +436,30 @@ in rec {
         findfreetype libssh curl cmake autoconf automake libtool ed cpio coreutils
         libssh2 nghttp2 libkrb5 ninja brotli;
 
-      llvmPackages_7 = super.llvmPackages_7 // (let
-        tools = super.llvmPackages_7.tools.extend (_: _: {
-          inherit (llvmPackages_7) clang-unwrapped;
+      "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (let
+        tools = super."${finalLlvmPackages}".tools.extend (_: _: {
+          inherit (pkgs."${finalLlvmPackages}") clang-unwrapped;
         });
-        libraries = super.llvmPackages_7.libraries.extend (_: libSuper: {
-          inherit (llvmPackages_7) compiler-rt;
+        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 {
+          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 darwin-stubs;
+          launchd CF objc4 darwin-stubs sigtool postLinkSignHook signingUtils;
       });
     };
   in with prevStage; stageFun 2 prevStage {
@@ -350,16 +469,18 @@ in rec {
 
     extraNativeBuildInputs = [ pkgs.xz ];
     extraBuildInputs = [ pkgs.darwin.CF ];
-    libcxx = pkgs.libcxx;
+    libcxx = pkgs."${finalLlvmPackages}".libcxx;
 
     allowedRequisites =
       [ bootstrapTools ] ++
       (with pkgs; [
-        xz.bin xz.out libcxx libcxxabi llvmPackages_7.compiler-rt
-        llvmPackages_7.clang-unwrapped zlib libxml2.out curl.out brotli.lib openssl.out
-        libssh2.out nghttp2.lib libkrb5 coreutils gnugrep pcre.out gmp libiconv
+        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 ]);
+      (with pkgs.darwin; [ dyld Libsystem CF ICU locale ] ++ lib.optional useAppleSDKLibs objc4);
 
     overrides = persistent;
   };
@@ -376,16 +497,16 @@ in rec {
       # Avoid pulling in a full python and its extra dependencies for the llvm/clang builds.
       libxml2 = super.libxml2.override { pythonSupport = false; };
 
-      llvmPackages_7 = super.llvmPackages_7 // (let
-        libraries = super.llvmPackages_7.libraries.extend (_: _: {
-          inherit (llvmPackages_7) libcxx libcxxabi;
+      "${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;
+          locale darwin-stubs sigtool;
       });
     };
   in with prevStage; stageFun 3 prevStage {
@@ -397,7 +518,7 @@ in rec {
     # 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.libcxx;
+    libcxx = pkgs."${finalLlvmPackages}".libcxx;
 
     extraPreHook = ''
       export PATH=${pkgs.bash}/bin:$PATH
@@ -407,11 +528,13 @@ in rec {
     allowedRequisites =
       [ bootstrapTools ] ++
       (with pkgs; [
-        xz.bin xz.out bash libcxx libcxx.dev libcxxabi libcxxabi.dev llvmPackages_7.compiler-rt
-        llvmPackages_7.clang-unwrapped zlib libxml2.out curl.out brotli.lib openssl.out
-        libssh2.out nghttp2.lib libkrb5 coreutils gnugrep pcre.out gmp libiconv
+        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 ]);
+      (with pkgs.darwin; [ dyld ICU Libsystem locale ] ++ lib.optional useAppleSDKLibs objc4);
 
     overrides = persistent;
   };
@@ -432,20 +555,21 @@ in rec {
         ];
       });
 
-      llvmPackages_7 = super.llvmPackages_7 // (let
-        tools = super.llvmPackages_7.tools.extend (llvmSelf: _: {
-          clang-unwrapped-all-outputs = llvmPackages_7.clang-unwrapped-all-outputs.override { llvm = llvmSelf.llvm; };
-          libllvm = llvmPackages_7.libllvm.override { inherit libxml2; };
+      "${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.llvmPackages_7.libraries.extend (llvmSelf: _: {
-          inherit (llvmPackages_7) libcxx libcxxabi compiler-rt;
+        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;
 
-        CF = superDarwin.CF.override {
+        # See useAppleSDKLibs in darwin-packages.nix
+        CF = if useAppleSDKLibs then super.darwin.CF else superDarwin.CF.override {
           inherit libxml2;
           python3 = prevStage.python3;
         };
@@ -455,7 +579,7 @@ in rec {
     shell = "${pkgs.bash}/bin/bash";
     extraNativeBuildInputs = with pkgs; [ xz ];
     extraBuildInputs = [ pkgs.darwin.CF pkgs.bash ];
-    libcxx = pkgs.libcxx;
+    libcxx = pkgs."${finalLlvmPackages}".libcxx;
 
     extraPreHook = ''
       export PATH_LOCALE=${pkgs.darwin.locale}/share/locale
@@ -464,29 +588,32 @@ in rec {
   };
 
   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 llvm gmp pcre gnugrep
-        coreutils findutils diffutils patchutils;
-
-      llvmPackages_7 = super.llvmPackages_7 // (let
-        tools = super.llvmPackages_7.tools.extend (_: super: {
-          inherit (llvmPackages_7) llvm clang-unwrapped;
-        });
-        libraries = super.llvmPackages_7.libraries.extend (_: _: {
-          inherit (llvmPackages_7) compiler-rt libcxx libcxxabi;
-        });
-      in { inherit tools libraries; } // tools // libraries);
+        ncurses libffi zlib gmp pcre gnugrep
+        coreutils findutils diffutils patchutils pbzx;
 
-      darwin = super.darwin.overrideScope (_: _: {
-        inherit (darwin) dyld ICU Libsystem libiconv;
+      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 {
@@ -510,11 +637,12 @@ in rec {
     initialPath = import ../common-path.nix { inherit pkgs; };
     shell       = "${pkgs.bash}/bin/bash";
 
-    cc = pkgs.llvmPackages.libcxxClang.override {
-      cc = pkgs.llvmPackages.clang-unwrapped;
-    };
+    cc = pkgs."${finalLlvmPackages}".libcxxClang;
+
+    extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
+      pkgs.updateAutotoolsGnuConfigScriptsHook
+    ];
 
-    extraNativeBuildInputs = [];
     extraBuildInputs = [ pkgs.darwin.CF ];
 
     extraAttrs = {
@@ -524,19 +652,27 @@ in rec {
     };
 
     allowedRequisites = (with pkgs; [
-      xz.out xz.bin libcxx libcxx.dev libcxxabi libcxxabi.dev gmp.out gnumake findutils bzip2.out
-      bzip2.bin llvmPackages.llvm llvmPackages.llvm.lib llvmPackages.compiler-rt llvmPackages.compiler-rt.dev
+      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 llvmPackages.clang-unwrapped
-      llvmPackages.libclang.dev llvmPackages.libclang.lib
-      patch pcre.out gettext
+      gnugrep patch pcre.out gettext
       binutils.bintools darwin.binutils darwin.binutils.bintools
-      curl.out brotli.lib openssl.out libssh2.out nghttp2.lib libkrb5
+      curl.out openssl.out libssh2.out nghttp2.lib brotli.lib
       cc.expand-response-params libxml2.out
-    ]) ++ (with pkgs.darwin; [
+    ] ++ 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: {
diff --git a/pkgs/stdenv/darwin/unpack-bootstrap-tools-aarch64.sh b/pkgs/stdenv/darwin/unpack-bootstrap-tools-aarch64.sh
new file mode 100644
index 00000000000..63b72972d71
--- /dev/null
+++ b/pkgs/stdenv/darwin/unpack-bootstrap-tools-aarch64.sh
@@ -0,0 +1,52 @@
+set -euo pipefail
+
+# Unpack the bootstrap tools tarball.
+echo Unpacking the bootstrap tools...
+$mkdir $out
+$bzip2 -d < $tarball | (cd $out && $cpio -i)
+
+export PATH=$out/bin
+
+# Fix codesign wrapper paths
+sed -i \
+  -e "1c\
+#!$out/bin/bash" \
+  -e "s|[^( ]*\bsigtool\b|$out/bin/sigtool|g" \
+  $out/bin/codesign
+
+updateInstallName() {
+  local path="$1"
+
+  cp "$path" "$path.new"
+  install_name_tool -id "$path" "$path.new"
+  codesign -f -i "$(basename "$path")" -s - "$path.new"
+  mv -f "$path.new" "$path"
+}
+
+find $out
+
+ln -s bash $out/bin/sh
+ln -s bzip2 $out/bin/bunzip2
+
+find $out/lib -type f -name '*.dylib' -print0 | while IFS= read -r -d $'\0' lib; do
+  updateInstallName "$lib"
+done
+
+# Provide a gunzip script.
+cat > $out/bin/gunzip <<EOF
+#!$out/bin/sh
+exec $out/bin/gzip -d "\$@"
+EOF
+chmod +x $out/bin/gunzip
+
+# Provide fgrep/egrep.
+echo "#! $out/bin/sh" > $out/bin/egrep
+echo "exec $out/bin/grep -E \"\$@\"" >> $out/bin/egrep
+echo "#! $out/bin/sh" > $out/bin/fgrep
+echo "exec $out/bin/grep -F \"\$@\"" >> $out/bin/fgrep
+
+cat >$out/bin/dsymutil << EOF
+#!$out/bin/sh
+EOF
+
+chmod +x $out/bin/egrep $out/bin/fgrep $out/bin/dsymutil
diff --git a/pkgs/stdenv/default.nix b/pkgs/stdenv/default.nix
index d9eadf26804..d6c59573f2a 100644
--- a/pkgs/stdenv/default.nix
+++ b/pkgs/stdenv/default.nix
@@ -57,6 +57,7 @@ in
     powerpc64-linux = stagesLinux;
     powerpc64le-linux = stagesLinux;
     x86_64-darwin = stagesDarwin;
+    aarch64-darwin = stagesDarwin;
     x86_64-solaris = stagesNix;
     i686-cygwin = stagesNative;
     x86_64-cygwin = stagesNative;