From 768aae66efcb50672f0ed728f218f18348193e27 Mon Sep 17 00:00:00 2001 From: Andrew Childs Date: Thu, 19 Nov 2020 17:28:20 +0900 Subject: stdenv/darwin: Apple Silicon support --- pkgs/stdenv/darwin/default.nix | 356 ++++++++++++++------- .../darwin/unpack-bootstrap-tools-aarch64.sh | 52 +++ 2 files changed, 298 insertions(+), 110 deletions(-) create mode 100644 pkgs/stdenv/darwin/unpack-bootstrap-tools-aarch64.sh (limited to 'pkgs/stdenv/darwin') diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index 6ccebd20adefe..caa3cb8e201ed 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 { - 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 { + 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 { + 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 0000000000000..63b72972d7178 --- /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 < $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 -- cgit 1.4.1