diff options
author | Alyssa Ross <hi@alyssa.is> | 2021-06-22 15:01:47 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2021-06-22 16:57:59 +0000 |
commit | 633cab0ecb07627706c6b523e219490f019eaab5 (patch) | |
tree | 4fb472bdfe2723037dad53dc1b8a87c939015f5e /nixpkgs/pkgs/stdenv/darwin | |
parent | ffb691c199e7e0cbc4e45e5310779c9e3f7c2a73 (diff) | |
parent | 432fc2d9a67f92e05438dff5fdc2b39d33f77997 (diff) | |
download | nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.gz nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.bz2 nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.lz nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.xz nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.zst nixlib-633cab0ecb07627706c6b523e219490f019eaab5.zip |
Merge commit '432fc2d9a67f92e05438dff5fdc2b39d33f77997'
# Conflicts: # nixpkgs/pkgs/applications/editors/emacs/elisp-packages/elpa-generated.nix # nixpkgs/pkgs/applications/networking/mailreaders/thunderbird/default.nix # nixpkgs/pkgs/applications/window-managers/sway/default.nix # nixpkgs/pkgs/build-support/rust/default.nix # nixpkgs/pkgs/development/go-modules/generic/default.nix
Diffstat (limited to 'nixpkgs/pkgs/stdenv/darwin')
-rw-r--r-- | nixpkgs/pkgs/stdenv/darwin/default.nix | 892 | ||||
-rw-r--r-- | nixpkgs/pkgs/stdenv/darwin/fixed-xnu-python3.patch | 41 | ||||
-rw-r--r-- | nixpkgs/pkgs/stdenv/darwin/make-bootstrap-tools.nix | 144 | ||||
-rw-r--r-- | nixpkgs/pkgs/stdenv/darwin/unpack-bootstrap-tools-aarch64.sh | 52 |
4 files changed, 784 insertions, 345 deletions
diff --git a/nixpkgs/pkgs/stdenv/darwin/default.nix b/nixpkgs/pkgs/stdenv/darwin/default.nix index e8b3ef6c10fd..4ff512386e82 100644 --- a/nixpkgs/pkgs/stdenv/darwin/default.nix +++ b/nixpkgs/pkgs/stdenv/darwin/default.nix @@ -1,18 +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 ? 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; }; - } +, 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; }; + } + 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,14 +40,24 @@ 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 { + +in +rec { commonPreHook = '' export NIX_ENFORCE_NO_NATIVE=''${NIX_ENFORCE_NO_NATIVE-1} export NIX_ENFORCE_PURITY=''${NIX_ENFORCE_PURITY-1} @@ -40,25 +70,30 @@ in rec { stripAllFlags=" " # the Darwin "strip" command doesn't know "-s" ''; - bootstrapTools = derivation { + bootstrapTools = derivation ({ inherit system; - name = "bootstrap-tools"; + 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; __impureHostDeps = commonImpureHostDeps; - }; - - stageFun = step: last: {shell ? "${bootstrapTools}/bin/bash", - overrides ? (self: super: {}), - extraPreHook ? "", - extraNativeBuildInputs, - extraBuildInputs, - libcxx, - allowedRequisites ? null}: + } // lib.optionalAttrs (config.contentAddressedByDefault or false) { + __contentAddressed = true; + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + }); + + stageFun = step: last: { shell ? "${bootstrapTools}/bin/bash" + , overrides ? (self: super: { }) + , extraPreHook ? "" + , extraNativeBuildInputs + , extraBuildInputs + , libcxx + , allowedRequisites ? null + }: let name = "bootstrap-stage${toString step}"; @@ -66,11 +101,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/clang/${cc.version}/include" "$rsrc" - ln -s "${last.pkgs.llvmPackages_7.compiler-rt.out}/lib" "$rsrc/lib" + ln -s "${cc.lib or cc}/lib/clang/${cc.version}/include" "$rsrc" + ln -s "${last.pkgs."${finalLlvmPackages}".compiler-rt.out}/lib" "$rsrc/lib" echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags ''; @@ -79,32 +117,35 @@ 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.llvmPackages_7.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.llvmPackages_7.libcxxabi - last.pkgs.llvmPackages_7.compiler-rt + last.pkgs."${finalLlvmPackages}".libcxxabi + last.pkgs."${finalLlvmPackages}".compiler-rt ]; 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.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; }); @@ -112,9 +153,23 @@ 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 + 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; @@ -131,7 +186,7 @@ in rec { ${commonPreHook} ${extraPreHook} ''; - initialPath = [ bootstrapTools ]; + initialPath = [ bootstrapTools ]; fetchurlBoot = import ../../build-support/fetchurl { inherit lib; @@ -143,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; }; @@ -172,13 +228,103 @@ in rec { ''; }; - darwin = super.darwin // { + 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 = '' mkdir -p $out - cp -r ${self.darwin.darwin-stubs}/usr/lib $out/lib + cp -r ${selfDarwin.darwin-stubs}/usr/lib $out/lib chmod -R +w $out/lib substituteInPlace $out/lib/libSystem.B.tbd --replace /usr/lib/system $out/lib/system @@ -196,35 +342,12 @@ in rec { ln -s ${bootstrapTools}/include-Libsystem $out/include ''; }; + }); - darwin-stubs = super.darwin.darwin-stubs.override { inherit (self) stdenv 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 = self.pkgs.darwin.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 @@ -265,284 +388,419 @@ in rec { }; }; - extraNativeBuildInputs = []; - extraBuildInputs = []; + extraNativeBuildInputs = [ ]; + extraBuildInputs = [ ]; libcxx = null; }; - stage1 = prevStage: let - persistent = self: super: with prevStage; { - cmake = super.cmakeMinimal; + 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; - llvmPackages_7 = super.llvmPackages_7 // (let - tools = super.llvmPackages_7.tools.extend (_: _: { - inherit (llvmPackages_7) clang-unwrapped; - }); - libraries = super.llvmPackages_7.libraries.extend (_: _: { - inherit (llvmPackages_7) compiler-rt libcxx libcxxabi; - }); - in { inherit tools libraries; } // tools // libraries); - - darwin = super.darwin // { - binutils = darwin.binutils.override { - coreutils = self.coreutils; - libc = self.darwin.Libsystem; - }; - }; - }; - in with prevStage; stageFun 1 prevStage { - extraPreHook = "export NIX_CFLAGS_COMPILE+=\" -F${bootstrapTools}/Library/Frameworks\""; - extraNativeBuildInputs = []; - extraBuildInputs = [ ]; - libcxx = pkgs.libcxx; + ninja = super.ninja.override { buildDocs = false; }; - allowedRequisites = - [ bootstrapTools ] ++ - (with pkgs; [ coreutils gnugrep libcxx libcxxabi llvmPackages_7.clang-unwrapped llvmPackages_7.compiler-rt ]) ++ - (with pkgs.darwin; [ darwin-stubs Libsystem ]); + "${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 + ); - overrides = persistent; - }; + darwin = super.darwin.overrideScope (selfDarwin: _: { + inherit (darwin) rewrite-tbd binutils-unwrapped; - 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; - - llvmPackages_7 = super.llvmPackages_7 // (let - tools = super.llvmPackages_7.tools.extend (_: _: { - inherit (llvmPackages_7) clang-unwrapped; - }); - libraries = super.llvmPackages_7.libraries.extend (_: libSuper: { - inherit (llvmPackages_7) compiler-rt; - libcxx = libSuper.libcxx.override { - stdenv = overrideCC self.stdenv self.ccNoLibcxx; + signingUtils = darwin.signingUtils.override { + inherit (selfDarwin) sigtool; }; - libcxxabi = libSuper.libcxxabi.override { - stdenv = overrideCC self.stdenv self.ccNoLibcxx; - standalone = true; + + binutils = darwin.binutils.override { + coreutils = self.coreutils; + libc = selfDarwin.Libsystem; + inherit (selfDarwin) postLinkSignHook signingUtils; }; }); - in { inherit tools libraries; } // tools // libraries); - - darwin = super.darwin // { - inherit (darwin) - binutils dyld Libsystem xnu configd ICU libdispatch libclosure - launchd CF darwin-stubs; }; + 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.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 - ]) ++ - (with pkgs.darwin; [ dyld Libsystem CF ICU locale ]); - - 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; }; - - llvmPackages_7 = super.llvmPackages_7 // (let - libraries = super.llvmPackages_7.libraries.extend (_: _: { - inherit (llvmPackages_7) 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); - - darwin = super.darwin // { - inherit (darwin) - dyld Libsystem xnu configd libdispatch libclosure launchd 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.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 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 - ]) ++ - (with pkgs.darwin; [ dyld ICU Libsystem locale ]); - - overrides = persistent; - }; + in + with prevStage; stageFun 2 prevStage { + extraPreHook = '' + export PATH_LOCALE=${pkgs.darwin.locale}/share/locale + ''; - 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" - ]; - }); + 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; + }; - llvmPackages_7 = super.llvmPackages_7 // (let - tools = super.llvmPackages_7.tools.extend (llvmSelf: _: { - clang-unwrapped = llvmPackages_7.clang-unwrapped.override { llvm = llvmSelf.llvm; }; - llvm = llvmPackages_7.llvm.override { inherit libxml2; }; - }); - libraries = super.llvmPackages_7.libraries.extend (llvmSelf: _: { - inherit (llvmPackages_7) 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 // rec { - inherit (darwin) dyld Libsystem libiconv locale darwin-stubs; - - CF = super.darwin.CF.override { - inherit libxml2; - python3 = prevStage.python3; - }; }; + 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; }; - in with prevStage; stageFun 4 prevStage { - shell = "${pkgs.bash}/bin/bash"; - extraNativeBuildInputs = with pkgs; [ xz ]; - extraBuildInputs = [ pkgs.darwin.CF pkgs.bash ]; - libcxx = pkgs.libcxx; - - extraPreHook = '' - export PATH_LOCALE=${pkgs.darwin.locale}/share/locale - ''; - overrides = persistent; - }; - stdenvDarwin = prevStage: let - 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; + 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" + ]; }); - libraries = super.llvmPackages_7.libraries.extend (_: _: { - inherit (llvmPackages_7) compiler-rt libcxx libcxxabi; + + "${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 { inherit tools libraries; } // tools // libraries); + }; + 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; + }; - darwin = super.darwin // { - inherit (darwin) dyld ICU Libsystem libiconv; + 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 (darwin) binutils binutils-unwrapped cctools; + 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; }; - } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) { - # Need to get rid of these when cross-compiling. - inherit binutils binutils-unwrapped; - }; - in import ../generic rec { - name = "stdenv-darwin"; + in + import ../generic rec { + name = "stdenv-darwin"; - inherit config; - inherit (pkgs.stdenv) fetchurlBoot; + inherit config; + inherit (pkgs.stdenv) fetchurlBoot; - buildPlatform = localSystem; - hostPlatform = localSystem; - targetPlatform = localSystem; + buildPlatform = localSystem; + hostPlatform = localSystem; + targetPlatform = localSystem; - preHook = commonPreHook + '' - export NIX_COREFOUNDATION_RPATH=${pkgs.darwin.CF}/Library/Frameworks - export PATH_LOCALE=${pkgs.darwin.locale}/share/locale - ''; + preHook = commonPreHook + '' + export NIX_COREFOUNDATION_RPATH=${pkgs.darwin.CF}/Library/Frameworks + export PATH_LOCALE=${pkgs.darwin.locale}/share/locale + ''; - __stdenvImpureHostDeps = commonImpureHostDeps; - __extraImpureHostDeps = commonImpureHostDeps; + __stdenvImpureHostDeps = commonImpureHostDeps; + __extraImpureHostDeps = commonImpureHostDeps; - initialPath = import ../common-path.nix { inherit pkgs; }; - shell = "${pkgs.bash}/bin/bash"; + 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 = []; - 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 libcxx libcxxabi gmp.out gnumake findutils bzip2.out - bzip2.bin llvmPackages.llvm llvmPackages.llvm.lib llvmPackages.compiler-rt llvmPackages.compiler-rt.dev - 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.clang-unwrapped.lib patch pcre.out gettext - binutils.bintools darwin.binutils darwin.binutils.bintools - curl.out brotli.lib openssl.out libssh2.out nghttp2.lib libkrb5 - cc.expand-response-params libxml2.out - ]) ++ (with pkgs.darwin; [ - dyld Libsystem CF cctools ICU libiconv locale libtapi - ]); - - overrides = lib.composeExtensions persistent (self: super: { - clang = cc; - llvmPackages = super.llvmPackages // { clang = cc; }; - inherit cc; - - darwin = super.darwin // { - inherit (prevStage.darwin) CF darwin-stubs; - xnu = super.darwin.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; + }); + }; stagesDarwin = [ ({}: stage0) diff --git a/nixpkgs/pkgs/stdenv/darwin/fixed-xnu-python3.patch b/nixpkgs/pkgs/stdenv/darwin/fixed-xnu-python3.patch new file mode 100644 index 000000000000..9f29376187f4 --- /dev/null +++ b/nixpkgs/pkgs/stdenv/darwin/fixed-xnu-python3.patch @@ -0,0 +1,41 @@ +diff --git a/bsd/kern/makekdebugevents.py b/bsd/kern/makekdebugevents.py +index 73b2db4..d354ba0 100755 +--- a/bsd/kern/makekdebugevents.py ++++ b/bsd/kern/makekdebugevents.py +@@ -5,7 +5,7 @@ + # named kd_events[] or these mappings. + # Required to generate a header file used by DEVELOPMENT and DEBUG kernels. + # +- ++ + import sys + import re + +@@ -21,18 +21,18 @@ code_table = [] + # scan file to generate internal table + with open(trace_code_file, 'rt') as codes: + for line in codes: +- m = id_name_pattern.match(line) +- if m: ++ m = id_name_pattern.match(line) ++ if m: + code_table += [(int(m.group(1),base=16), m.group(2))] + + # emit typedef: +-print "typedef struct {" +-print " uint32_t id;" +-print " const char *name;" +-print "} kd_event_t;" ++print("typedef struct {") ++print(" uint32_t id;") ++print(" const char *name;") ++print("} kd_event_t;") + # emit structure declaration and sorted initialization: +-print "kd_event_t kd_events[] = {" ++print("kd_event_t kd_events[] = {") + for mapping in sorted(code_table, key=lambda x: x[0]): +- print " {0x%x, \"%s\"}," % mapping +-print "};" ++ print(" {0x%x, \"%s\"}," % mapping) ++print("};") + diff --git a/nixpkgs/pkgs/stdenv/darwin/make-bootstrap-tools.nix b/nixpkgs/pkgs/stdenv/darwin/make-bootstrap-tools.nix index 7b68c877a6ef..08b4372a0a11 100644 --- a/nixpkgs/pkgs/stdenv/darwin/make-bootstrap-tools.nix +++ b/nixpkgs/pkgs/stdenv/darwin/make-bootstrap-tools.nix @@ -1,9 +1,21 @@ -{ pkgspath ? ../../.., test-pkgspath ? pkgspath, system ? builtins.currentSystem }: - -with import pkgspath { inherit system; }; +{ pkgspath ? ../../.., test-pkgspath ? pkgspath +, system ? builtins.currentSystem, crossSystem ? null, bootstrapFiles ? null +}: + +let cross = if crossSystem != null + then { inherit crossSystem; } + else {}; + custom-bootstrap = if bootstrapFiles != null + then { stdenvStages = args: + let args' = args // { bootstrapFiles = bootstrapFiles; }; + in (import "${pkgspath}/pkgs/stdenv/darwin" args').stagesDarwin; + } + else {}; +in with import pkgspath ({ inherit system; } // cross // custom-bootstrap); let - llvmPackages = llvmPackages_7; + llvmPackages = llvmPackages_11; + storePrefixLen = builtins.stringLength builtins.storeDir; in rec { coreutils_ = coreutils.override (args: { # We want coreutils without ACL support. @@ -20,26 +32,73 @@ in rec { # Avoid messing with libkrb5 and libnghttp2. curl_ = curlMinimal.override (args: { gssSupport = false; http2Support = false; }); + # Avoid stdenv rebuild. + Libsystem_ = (darwin.Libsystem.override (args: + { xnu = darwin.xnu.overrideAttrs (oldAttrs: + { patches = [ ./fixed-xnu-python3.patch ]; }); + })).overrideAttrs (oldAttrs: + { installPhase = oldAttrs.installPhase + '' + cat <<EOF > $out/include/TargetConditionals.h + #ifndef __TARGETCONDITIONALS__ + #define __TARGETCONDITIONALS__ + #define TARGET_OS_MAC 1 + #define TARGET_OS_WIN32 0 + #define TARGET_OS_UNIX 0 + #define TARGET_OS_OSX 1 + #define TARGET_OS_IPHONE 0 + #define TARGET_OS_IOS 0 + #define TARGET_OS_WATCH 0 + #define TARGET_OS_BRIDGE 0 + #define TARGET_OS_TV 0 + #define TARGET_OS_SIMULATOR 0 + #define TARGET_OS_EMBEDDED 0 + #define TARGET_OS_EMBEDDED_OTHER 0 /* Used in configd */ + #define TARGET_IPHONE_SIMULATOR TARGET_OS_SIMULATOR /* deprecated */ + #define TARGET_OS_NANO TARGET_OS_WATCH /* deprecated */ + + #define TARGET_CPU_PPC 0 + #define TARGET_CPU_PPC64 0 + #define TARGET_CPU_68K 0 + #define TARGET_CPU_X86 0 + #define TARGET_CPU_X86_64 1 + #define TARGET_CPU_ARM 0 + #define TARGET_CPU_ARM64 0 + #define TARGET_CPU_MIPS 0 + #define TARGET_CPU_SPARC 0 + #define TARGET_CPU_ALPHA 0 + #define TARGET_RT_MAC_CFM 0 + #define TARGET_RT_MAC_MACHO 1 + #define TARGET_RT_LITTLE_ENDIAN 1 + #define TARGET_RT_BIG_ENDIAN 0 + #define TARGET_RT_64_BIT 1 + #endif /* __TARGETCONDITIONALS__ */ + EOF + ''; + }); + build = stdenv.mkDerivation { name = "stdenv-bootstrap-tools"; - buildInputs = [nukeReferences cpio]; + nativeBuildInputs = [ buildPackages.nukeReferences buildPackages.cpio ] + ++ lib.optionals targetPlatform.isAarch64 [ buildPackages.darwin.sigtool ]; buildCommand = '' - mkdir -p $out/bin $out/lib $out/lib/system + mkdir -p $out/bin $out/lib $out/lib/system $out/lib/darwin - # Copy libSystem's .o files for various low-level boot stuff. - cp -d ${darwin.Libsystem}/lib/*.o $out/lib + ${lib.optionalString stdenv.targetPlatform.isx86_64 '' + # Copy libSystem's .o files for various low-level boot stuff. + cp -d ${Libsystem_}/lib/*.o $out/lib - # Resolv is actually a link to another package, so let's copy it properly - cp -L ${darwin.Libsystem}/lib/libresolv.9.dylib $out/lib + # Resolv is actually a link to another package, so let's copy it properly + cp -L ${Libsystem_}/lib/libresolv.9.dylib $out/lib - cp -rL ${darwin.Libsystem}/include $out - chmod -R u+w $out/include - cp -rL ${darwin.ICU}/include* $out/include - cp -rL ${libiconv}/include/* $out/include - cp -rL ${gnugrep.pcre.dev}/include/* $out/include - mv $out/include $out/include-Libsystem + cp -rL ${Libsystem_}/include $out + chmod -R u+w $out/include + cp -rL ${darwin.ICU}/include* $out/include + cp -rL ${libiconv}/include/* $out/include + cp -rL ${gnugrep.pcre.dev}/include/* $out/include + mv $out/include $out/include-Libsystem + ''} # Copy coreutils, bash, etc. cp ${coreutils_}/bin/* $out/bin @@ -76,16 +135,32 @@ in rec { # Copy what we need of clang cp -d ${llvmPackages.clang-unwrapped}/bin/clang* $out/bin - - cp -rL ${llvmPackages.clang-unwrapped}/lib/clang $out/lib + cp -rd ${llvmPackages.clang-unwrapped.lib}/lib/* $out/lib cp -d ${llvmPackages.libcxx}/lib/libc++*.dylib $out/lib cp -d ${llvmPackages.libcxxabi}/lib/libc++abi*.dylib $out/lib + cp -d ${llvmPackages.compiler-rt}/lib/darwin/libclang_rt* $out/lib/darwin + cp -d ${llvmPackages.compiler-rt}/lib/libclang_rt* $out/lib cp -d ${llvmPackages.llvm.lib}/lib/libLLVM.dylib $out/lib cp -d ${libffi}/lib/libffi*.dylib $out/lib mkdir $out/include - cp -rd ${llvmPackages.libcxx}/include/c++ $out/include + cp -rd ${llvmPackages.libcxx.dev}/include/c++ $out/include + + ${lib.optionalString targetPlatform.isAarch64 '' + # copy .tbd assembly utils + cp -d ${pkgs.darwin.rewrite-tbd}/bin/rewrite-tbd $out/bin + cp -d ${pkgs.libyaml}/lib/libyaml*.dylib $out/lib + + # copy package extraction tools + cp -d ${pkgs.pbzx}/bin/pbzx $out/bin + cp -d ${pkgs.xar}/lib/libxar*.dylib $out/lib + cp -d ${pkgs.bzip2.out}/lib/libbz2*.dylib $out/lib + + # copy sigtool + cp -d ${pkgs.darwin.sigtool}/bin/sigtool $out/bin + cp -d ${pkgs.darwin.sigtool}/bin/codesign $out/bin + ''} cp -d ${darwin.ICU}/lib/libicu*.dylib $out/lib cp -d ${zlib.out}/lib/libz.* $out/lib @@ -93,22 +168,25 @@ in rec { cp -d ${xz.out}/lib/liblzma*.* $out/lib # Copy binutils. - for i in as ld ar ranlib nm strip otool install_name_tool lipo; do + for i in as ld ar ranlib nm strip otool install_name_tool lipo codesign_allocate; do cp ${cctools_}/bin/$i $out/bin done cp -d ${darwin.libtapi}/lib/libtapi* $out/lib - cp -rd ${pkgs.darwin.CF}/Library $out + ${lib.optionalString targetPlatform.isx86_64 '' + cp -rd ${pkgs.darwin.CF}/Library $out + ''} chmod -R u+w $out nuke-refs $out/bin/* rpathify() { - local libs=$(${cctools_}/bin/otool -L "$1" | tail -n +2 | grep -o "$NIX_STORE.*-\S*") || true + local libs=$(${stdenv.cc.targetPrefix}otool -L "$1" | tail -n +2 | grep -o "$NIX_STORE.*-\S*") || true + local newlib for lib in $libs; do - ${cctools_}/bin/install_name_tool -change $lib "@rpath/$(basename $lib)" "$1" + ${stdenv.cc.targetPrefix}install_name_tool -change $lib "@rpath/$(basename "$lib")" "$1" done } @@ -116,20 +194,27 @@ in rec { for i in $out/bin/*; do if test -x $i -a ! -L $i; then chmod +w $i - strip $i || true + ${stdenv.cc.targetPrefix}strip $i || true fi done - for i in $out/bin/* $out/lib/*.dylib $out/lib/clang/*/lib/darwin/*.dylib $out/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation; do + for i in $out/bin/* $out/lib/*.dylib $out/lib/darwin/*.dylib $out/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation; do if test -x "$i" -a ! -L "$i"; then echo "Adding rpath to $i" rpathify $i fi done + for i in $out/bin/*; do + if test -x "$i" -a ! -L "$i" -a "$(basename $i)" != codesign; then + echo "Adding @executable_path to rpath in $i" + ${stdenv.cc.targetPrefix}install_name_tool -add_rpath '@executable_path/../lib' $i + fi + done + nuke-refs $out/lib/* nuke-refs $out/lib/system/* - nuke-refs $out/lib/clang/*/lib/darwin/* + nuke-refs $out/lib/darwin/* nuke-refs $out/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation mkdir $out/.pack @@ -143,7 +228,7 @@ in rec { cp ${bzip2_.bin}/bin/bzip2 $out/on-server chmod u+w $out/on-server/* - strip $out/on-server/* + ${stdenv.cc.targetPrefix}strip $out/on-server/* nuke-refs $out/on-server/* (cd $out/pack && (find | cpio -o -H newc)) | bzip2 > $out/on-server/bootstrap-tools.cpio.bz2 @@ -318,7 +403,10 @@ in rec { # The ultimate test: bootstrap a whole stdenv from the tools specified above and get a package set out of it test-pkgs = import test-pkgspath { - inherit system; + # if the bootstrap tools are for another platform, we should be testing + # that platform. + system = if crossSystem != null then crossSystem else system; + stdenvStages = args: let args' = args // { inherit bootstrapFiles; }; in (import (test-pkgspath + "/pkgs/stdenv/darwin") args').stagesDarwin; diff --git a/nixpkgs/pkgs/stdenv/darwin/unpack-bootstrap-tools-aarch64.sh b/nixpkgs/pkgs/stdenv/darwin/unpack-bootstrap-tools-aarch64.sh new file mode 100644 index 000000000000..63b72972d717 --- /dev/null +++ b/nixpkgs/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 |