stdenv/darwin: Apple Silicon support

This commit is contained in:
Andrew Childs 2020-11-19 17:28:20 +09:00
parent 3eacdfe24a
commit 768aae66ef
3 changed files with 299 additions and 110 deletions

View File

@ -1,18 +1,33 @@
{ lib { lib
, localSystem, crossSystem, config, overlays, crossOverlays ? [] , localSystem, crossSystem, config, overlays, crossOverlays ? []
# Allow passing in bootstrap files directly so we can test the stdenv bootstrap process when changing the bootstrap tools # Allow passing in bootstrap files directly so we can test the stdenv bootstrap process when changing the bootstrap tools
, bootstrapFiles ? let , bootstrapFiles ?
fetch = { file, sha256, executable ? true }: import <nix/fetchurl.nix> { if localSystem.isAarch64 then
url = "http://tarballs.nixos.org/stdenv-darwin/x86_64/5ab5783e4f46c373c6de84deac9ad59b608bb2e6/${file}"; let
inherit (localSystem) system; fetch = { file, sha256, executable ? true }: import <nix/fetchurl.nix> {
inherit sha256 executable; url = null; # to be built by hydra and injected here
}; in { inherit (localSystem) system;
sh = fetch { file = "sh"; sha256 = "sha256-nbb4XEk3go7ttiWrQyKQMLzPr+qUnwnHkWMtVCZsMCs="; }; inherit sha256 executable;
bzip2 = fetch { file = "bzip2"; sha256 = "sha256-ybnA+JWrKhXSfn20+GVKXkHFTp2Zt79hat8hAVmsUOc="; }; }; in {
mkdir = fetch { file = "mkdir"; sha256 = "sha256-nmvMxmfcY41/60Z/E8L9u0vgePW5l30Dqw1z+Nr02Hk="; }; sh = fetch { file = "sh"; sha256 = "0000000000000000000000000000000000000000000000000000"; };
cpio = fetch { file = "cpio"; sha256 = "sha256-cB36rN3NLj19Tk37Kc5bodMFMO+mCpEQkKKo0AEMkaU="; }; bzip2 = fetch { file = "bzip2"; sha256 = "0000000000000000000000000000000000000000000000000000"; };
tarball = fetch { file = "bootstrap-tools.cpio.bz2"; sha256 = "sha256-kh2vKmjCr/HvR06czZbxUxV5KDRxSF27M6nN3cyofRI="; executable = false; }; 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; assert crossSystem == localSystem;
@ -20,13 +35,22 @@ assert crossSystem == localSystem;
let let
inherit (localSystem) system; 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 = [ commonImpureHostDeps = [
"/bin/sh" "/bin/sh"
"/usr/lib/libSystem.B.dylib" "/usr/lib/libSystem.B.dylib"
"/usr/lib/system/libunc.dylib" # This dependency is "hidden", so our scanning code doesn't pick it up "/usr/lib/system/libunc.dylib" # This dependency is "hidden", so our scanning code doesn't pick it up
]; ];
in rec { in rec {
commonPreHook = '' commonPreHook = ''
export NIX_ENFORCE_NO_NATIVE=''${NIX_ENFORCE_NO_NATIVE-1} export NIX_ENFORCE_NO_NATIVE=''${NIX_ENFORCE_NO_NATIVE-1}
@ -45,7 +69,7 @@ in rec {
name = "bootstrap-tools"; name = "bootstrap-tools";
builder = bootstrapFiles.sh; # Not a filename! Attribute 'sh' on bootstrapFiles 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; inherit (bootstrapFiles) mkdir bzip2 cpio tarball;
@ -70,11 +94,14 @@ in rec {
inherit (last) stdenv; inherit (last) stdenv;
}; };
doSign = localSystem.isAarch64 && last != null;
doUpdateAutoTools = localSystem.isAarch64 && last != null;
mkExtraBuildCommands = cc: '' mkExtraBuildCommands = cc: ''
rsrc="$out/resource-root" rsrc="$out/resource-root"
mkdir "$rsrc" mkdir "$rsrc"
ln -s "${cc.lib or cc}/lib/clang/${cc.version}/include" "$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 echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
''; '';
@ -90,13 +117,13 @@ in rec {
bintools = last.pkgs.darwin.binutils; bintools = last.pkgs.darwin.binutils;
libc = last.pkgs.darwin.Libsystem; libc = last.pkgs.darwin.Libsystem;
isClang = true; isClang = true;
cc = last.pkgs.llvmPackages_7.clang-unwrapped; cc = last.pkgs."${finalLlvmPackages}".clang-unwrapped;
}; in args // (overrides args)); }; in args // (overrides args));
cc = if last == null then "/dev/null" else mkCC ({ cc, ... }: { cc = if last == null then "/dev/null" else mkCC ({ cc, ... }: {
extraPackages = [ extraPackages = [
last.pkgs.llvmPackages_7.libcxxabi last.pkgs."${finalLlvmPackages}".libcxxabi
last.pkgs.llvmPackages_7.compiler-rt last.pkgs."${finalLlvmPackages}".compiler-rt
]; ];
extraBuildCommands = mkExtraBuildCommands cc; extraBuildCommands = mkExtraBuildCommands cc;
}); });
@ -104,11 +131,11 @@ in rec {
ccNoLibcxx = if last == null then "/dev/null" else mkCC ({ cc, ... }: { ccNoLibcxx = if last == null then "/dev/null" else mkCC ({ cc, ... }: {
libcxx = null; libcxx = null;
extraPackages = [ extraPackages = [
last.pkgs.llvmPackages_7.compiler-rt last.pkgs."${finalLlvmPackages}".compiler-rt
]; ];
extraBuildCommands = '' extraBuildCommands = ''
echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags 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 echo "-nostdlib++" >> $out/nix-support/cc-cflags
'' + mkExtraBuildCommands cc; '' + mkExtraBuildCommands cc;
}); });
@ -116,9 +143,20 @@ in rec {
thisStdenv = import ../generic { thisStdenv = import ../generic {
name = "${name}-stdenv-darwin"; 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 ++ [ 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; 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 = 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 { Libsystem = stdenv.mkDerivation {
name = "bootstrap-stage0-Libsystem"; name = "bootstrap-stage0-Libsystem";
buildCommand = '' buildCommand = ''
@ -200,35 +328,12 @@ in rec {
ln -s ${bootstrapTools}/include-Libsystem $out/include 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 { clang-unwrapped = stdenv.mkDerivation {
name = "bootstrap-stage0-clang"; name = "bootstrap-stage0-clang";
version = bootstrapClangVersion; version = bootstrapLlvmVersion;
buildCommand = '' buildCommand = ''
mkdir -p $out/lib mkdir -p $out/lib
ln -s ${bootstrapTools}/bin $out/bin ln -s ${bootstrapTools}/bin $out/bin
@ -278,36 +383,46 @@ in rec {
persistent = self: super: with prevStage; { persistent = self: super: with prevStage; {
cmake = super.cmakeMinimal; cmake = super.cmakeMinimal;
inherit pbzx cpio;
python3 = super.python3Minimal; python3 = super.python3Minimal;
ninja = super.ninja.override { buildDocs = false; }; ninja = super.ninja.override { buildDocs = false; };
llvmPackages_7 = super.llvmPackages_7 // (let "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (let
tools = super.llvmPackages_7.tools.extend (_: _: { tools = super."${finalLlvmPackages}".tools.extend (_: _: {
inherit (llvmPackages_7) clang-unwrapped; inherit (pkgs."${finalLlvmPackages}") clang-unwrapped;
}); });
libraries = super.llvmPackages_7.libraries.extend (_: _: { libraries = super."${finalLlvmPackages}".libraries.extend (_: _: {
inherit (llvmPackages_7) compiler-rt libcxx libcxxabi; inherit (pkgs."${finalLlvmPackages}") compiler-rt libcxx libcxxabi;
}); });
in { inherit tools libraries; } // tools // libraries); in { inherit tools libraries; } // tools // libraries);
darwin = super.darwin.overrideScope (selfDarwin: _: { darwin = super.darwin.overrideScope (selfDarwin: _: {
inherit (darwin) rewrite-tbd binutils-unwrapped;
signingUtils = darwin.signingUtils.override {
inherit (selfDarwin) sigtool;
};
binutils = darwin.binutils.override { binutils = darwin.binutils.override {
coreutils = self.coreutils; coreutils = self.coreutils;
libc = selfDarwin.Libsystem; libc = selfDarwin.Libsystem;
inherit (selfDarwin) postLinkSignHook signingUtils;
}; };
}); });
}; };
in with prevStage; stageFun 1 prevStage { in with prevStage; stageFun 1 prevStage {
extraPreHook = "export NIX_CFLAGS_COMPILE+=\" -F${bootstrapTools}/Library/Frameworks\""; extraPreHook = "export NIX_CFLAGS_COMPILE+=\" -F${bootstrapTools}/Library/Frameworks\"";
extraNativeBuildInputs = []; extraNativeBuildInputs = [];
extraBuildInputs = [ ]; extraBuildInputs = [ pkgs.darwin.CF ];
libcxx = pkgs.libcxx; libcxx = pkgs."${finalLlvmPackages}".libcxx;
allowedRequisites = allowedRequisites =
[ bootstrapTools ] ++ [ bootstrapTools ] ++
(with pkgs; [ coreutils gnugrep libcxx libcxxabi llvmPackages_7.clang-unwrapped llvmPackages_7.compiler-rt ]) ++ (with pkgs; [ coreutils gnugrep ]) ++
(with pkgs.darwin; [ darwin-stubs Libsystem ]); (with pkgs."${finalLlvmPackages}"; [ libcxx libcxxabi compiler-rt clang-unwrapped ]) ++
(with pkgs.darwin; [ Libsystem CF ] ++ lib.optional useAppleSDKLibs objc4);
overrides = persistent; overrides = persistent;
}; };
@ -321,26 +436,30 @@ in rec {
findfreetype libssh curl cmake autoconf automake libtool ed cpio coreutils findfreetype libssh curl cmake autoconf automake libtool ed cpio coreutils
libssh2 nghttp2 libkrb5 ninja brotli; libssh2 nghttp2 libkrb5 ninja brotli;
llvmPackages_7 = super.llvmPackages_7 // (let "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (let
tools = super.llvmPackages_7.tools.extend (_: _: { tools = super."${finalLlvmPackages}".tools.extend (_: _: {
inherit (llvmPackages_7) clang-unwrapped; inherit (pkgs."${finalLlvmPackages}") clang-unwrapped;
}); });
libraries = super.llvmPackages_7.libraries.extend (_: libSuper: { libraries = super."${finalLlvmPackages}".libraries.extend (_: libSuper: {
inherit (llvmPackages_7) compiler-rt; inherit (pkgs."${finalLlvmPackages}") compiler-rt;
libcxx = libSuper.libcxx.override { libcxx = libSuper.libcxx.override {
stdenv = overrideCC self.stdenv self.ccNoLibcxx; stdenv = overrideCC self.stdenv self.ccNoLibcxx;
}; };
libcxxabi = libSuper.libcxxabi.override { libcxxabi = libSuper.libcxxabi.override ({
stdenv = overrideCC self.stdenv self.ccNoLibcxx; 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; standalone = true;
}; });
}); });
in { inherit tools libraries; } // tools // libraries); in { inherit tools libraries; } // tools // libraries);
darwin = super.darwin.overrideScope (_: _: { darwin = super.darwin.overrideScope (_: _: {
inherit (darwin) inherit (darwin)
binutils dyld Libsystem xnu configd ICU libdispatch libclosure 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 { in with prevStage; stageFun 2 prevStage {
@ -350,16 +469,18 @@ in rec {
extraNativeBuildInputs = [ pkgs.xz ]; extraNativeBuildInputs = [ pkgs.xz ];
extraBuildInputs = [ pkgs.darwin.CF ]; extraBuildInputs = [ pkgs.darwin.CF ];
libcxx = pkgs.libcxx; libcxx = pkgs."${finalLlvmPackages}".libcxx;
allowedRequisites = allowedRequisites =
[ bootstrapTools ] ++ [ bootstrapTools ] ++
(with pkgs; [ (with pkgs; [
xz.bin xz.out libcxx libcxxabi llvmPackages_7.compiler-rt xz.bin xz.out zlib libxml2.out curl.out openssl.out libssh2.out
llvmPackages_7.clang-unwrapped zlib libxml2.out curl.out brotli.lib openssl.out nghttp2.lib coreutils gnugrep pcre.out gmp libiconv brotli.lib
libssh2.out nghttp2.lib libkrb5 coreutils gnugrep pcre.out gmp libiconv ] ++ 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; overrides = persistent;
}; };
@ -376,16 +497,16 @@ in rec {
# Avoid pulling in a full python and its extra dependencies for the llvm/clang builds. # Avoid pulling in a full python and its extra dependencies for the llvm/clang builds.
libxml2 = super.libxml2.override { pythonSupport = false; }; libxml2 = super.libxml2.override { pythonSupport = false; };
llvmPackages_7 = super.llvmPackages_7 // (let "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (let
libraries = super.llvmPackages_7.libraries.extend (_: _: { libraries = super."${finalLlvmPackages}".libraries.extend (_: _: {
inherit (llvmPackages_7) libcxx libcxxabi; inherit (pkgs."${finalLlvmPackages}") libcxx libcxxabi;
}); });
in { inherit libraries; } // libraries); in { inherit libraries; } // libraries);
darwin = super.darwin.overrideScope (_: _: { darwin = super.darwin.overrideScope (_: _: {
inherit (darwin) inherit (darwin)
dyld Libsystem xnu configd libdispatch libclosure launchd libiconv dyld Libsystem xnu configd libdispatch libclosure launchd libiconv
locale darwin-stubs; locale darwin-stubs sigtool;
}); });
}; };
in with prevStage; stageFun 3 prevStage { 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. # patches our shebangs back to point at bootstrapTools. This makes sure bash comes first.
extraNativeBuildInputs = with pkgs; [ xz ]; extraNativeBuildInputs = with pkgs; [ xz ];
extraBuildInputs = [ pkgs.darwin.CF pkgs.bash ]; extraBuildInputs = [ pkgs.darwin.CF pkgs.bash ];
libcxx = pkgs.libcxx; libcxx = pkgs."${finalLlvmPackages}".libcxx;
extraPreHook = '' extraPreHook = ''
export PATH=${pkgs.bash}/bin:$PATH export PATH=${pkgs.bash}/bin:$PATH
@ -407,11 +528,13 @@ in rec {
allowedRequisites = allowedRequisites =
[ bootstrapTools ] ++ [ bootstrapTools ] ++
(with pkgs; [ (with pkgs; [
xz.bin xz.out bash libcxx libcxx.dev libcxxabi libcxxabi.dev llvmPackages_7.compiler-rt xz.bin xz.out bash zlib libxml2.out curl.out openssl.out libssh2.out
llvmPackages_7.clang-unwrapped zlib libxml2.out curl.out brotli.lib openssl.out nghttp2.lib coreutils gnugrep pcre.out gmp libiconv brotli.lib
libssh2.out nghttp2.lib libkrb5 coreutils gnugrep pcre.out gmp libiconv ] ++ 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; overrides = persistent;
}; };
@ -432,20 +555,21 @@ in rec {
]; ];
}); });
llvmPackages_7 = super.llvmPackages_7 // (let "${finalLlvmPackages}" = super."${finalLlvmPackages}" // (let
tools = super.llvmPackages_7.tools.extend (llvmSelf: _: { tools = super."${finalLlvmPackages}".tools.extend (llvmSelf: _: {
clang-unwrapped-all-outputs = llvmPackages_7.clang-unwrapped-all-outputs.override { llvm = llvmSelf.llvm; }; clang-unwrapped-all-outputs = pkgs."${finalLlvmPackages}".clang-unwrapped-all-outputs.override { llvm = llvmSelf.llvm; };
libllvm = llvmPackages_7.libllvm.override { inherit libxml2; }; libllvm = pkgs."${finalLlvmPackages}".libllvm.override { inherit libxml2; };
}); });
libraries = super.llvmPackages_7.libraries.extend (llvmSelf: _: { libraries = super."${finalLlvmPackages}".libraries.extend (llvmSelf: _: {
inherit (llvmPackages_7) libcxx libcxxabi compiler-rt; inherit (pkgs."${finalLlvmPackages}") libcxx libcxxabi compiler-rt;
}); });
in { inherit tools libraries; } // tools // libraries); in { inherit tools libraries; } // tools // libraries);
darwin = super.darwin.overrideScope (_: superDarwin: { darwin = super.darwin.overrideScope (_: superDarwin: {
inherit (darwin) dyld Libsystem libiconv locale darwin-stubs; 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; inherit libxml2;
python3 = prevStage.python3; python3 = prevStage.python3;
}; };
@ -455,7 +579,7 @@ in rec {
shell = "${pkgs.bash}/bin/bash"; shell = "${pkgs.bash}/bin/bash";
extraNativeBuildInputs = with pkgs; [ xz ]; extraNativeBuildInputs = with pkgs; [ xz ];
extraBuildInputs = [ pkgs.darwin.CF pkgs.bash ]; extraBuildInputs = [ pkgs.darwin.CF pkgs.bash ];
libcxx = pkgs.libcxx; libcxx = pkgs."${finalLlvmPackages}".libcxx;
extraPreHook = '' extraPreHook = ''
export PATH_LOCALE=${pkgs.darwin.locale}/share/locale export PATH_LOCALE=${pkgs.darwin.locale}/share/locale
@ -464,29 +588,32 @@ in rec {
}; };
stdenvDarwin = prevStage: let stdenvDarwin = prevStage: let
doSign = localSystem.isAarch64;
pkgs = prevStage; pkgs = prevStage;
persistent = self: super: with prevStage; { persistent = self: super: with prevStage; {
inherit inherit
gnumake gzip gnused bzip2 gawk ed xz patch bash gnumake gzip gnused bzip2 gawk ed xz patch bash
ncurses libffi zlib llvm gmp pcre gnugrep ncurses libffi zlib gmp pcre gnugrep
coreutils findutils diffutils patchutils; coreutils findutils diffutils patchutils pbzx;
llvmPackages_7 = super.llvmPackages_7 // (let darwin = super.darwin.overrideScope (_: _: {
tools = super.llvmPackages_7.tools.extend (_: super: { inherit (darwin) dyld ICU Libsystem Csu libiconv rewrite-tbd;
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);
darwin = super.darwin.overrideScope (_: _: {
inherit (darwin) dyld ICU Libsystem libiconv;
} // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) { } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
inherit (darwin) binutils binutils-unwrapped cctools; inherit (darwin) binutils binutils-unwrapped cctools;
}); });
} // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) { } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
inherit llvm;
# Need to get rid of these when cross-compiling. # 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; inherit binutils binutils-unwrapped;
}; };
in import ../generic rec { in import ../generic rec {
@ -510,11 +637,12 @@ in rec {
initialPath = import ../common-path.nix { inherit pkgs; }; initialPath = import ../common-path.nix { inherit pkgs; };
shell = "${pkgs.bash}/bin/bash"; shell = "${pkgs.bash}/bin/bash";
cc = pkgs.llvmPackages.libcxxClang.override { cc = pkgs."${finalLlvmPackages}".libcxxClang;
cc = pkgs.llvmPackages.clang-unwrapped;
}; extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
pkgs.updateAutotoolsGnuConfigScriptsHook
];
extraNativeBuildInputs = [];
extraBuildInputs = [ pkgs.darwin.CF ]; extraBuildInputs = [ pkgs.darwin.CF ];
extraAttrs = { extraAttrs = {
@ -524,19 +652,27 @@ in rec {
}; };
allowedRequisites = (with pkgs; [ allowedRequisites = (with pkgs; [
xz.out xz.bin libcxx libcxx.dev libcxxabi libcxxabi.dev gmp.out gnumake findutils bzip2.out xz.out xz.bin gmp.out gnumake findutils bzip2.out
bzip2.bin llvmPackages.llvm llvmPackages.llvm.lib llvmPackages.compiler-rt llvmPackages.compiler-rt.dev bzip2.bin
zlib.out zlib.dev libffi.out coreutils ed diffutils gnutar zlib.out zlib.dev libffi.out coreutils ed diffutils gnutar
gzip ncurses.out ncurses.dev ncurses.man gnused bash gawk gzip ncurses.out ncurses.dev ncurses.man gnused bash gawk
gnugrep llvmPackages.clang-unwrapped gnugrep patch pcre.out gettext
llvmPackages.libclang.dev llvmPackages.libclang.lib
patch pcre.out gettext
binutils.bintools darwin.binutils darwin.binutils.bintools 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 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 dyld Libsystem CF cctools ICU libiconv locale libtapi
]); ] ++ lib.optional useAppleSDKLibs objc4
++ lib.optionals doSign [ postLinkSignHook sigtool signingUtils ]);
overrides = lib.composeExtensions persistent (self: super: { overrides = lib.composeExtensions persistent (self: super: {
darwin = super.darwin.overrideScope (_: superDarwin: { darwin = super.darwin.overrideScope (_: superDarwin: {

View File

@ -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

View File

@ -57,6 +57,7 @@ in
powerpc64-linux = stagesLinux; powerpc64-linux = stagesLinux;
powerpc64le-linux = stagesLinux; powerpc64le-linux = stagesLinux;
x86_64-darwin = stagesDarwin; x86_64-darwin = stagesDarwin;
aarch64-darwin = stagesDarwin;
x86_64-solaris = stagesNix; x86_64-solaris = stagesNix;
i686-cygwin = stagesNative; i686-cygwin = stagesNative;
x86_64-cygwin = stagesNative; x86_64-cygwin = stagesNative;