nixpkgs/pkgs/stdenv/darwin/default.nix

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

808 lines
26 KiB
Nix
Raw Normal View History

{ lib
2021-06-02 00:25:56 -04:00
, localSystem
, crossSystem
, config
, overlays
, crossOverlays ? [ ]
, bootstrapLlvmVersion ? "11.1.0"
2021-06-02 00:25:56 -04:00
# Allow passing in bootstrap files directly so we can test the stdenv bootstrap process when changing the bootstrap tools
, bootstrapFiles ? if localSystem.isAarch64 then
2020-11-19 03:28:20 -05:00
let
fetch = { file, sha256, executable ? true }: import <nix/fetchurl.nix> {
url = "http://tarballs.nixos.org/stdenv-darwin/aarch64/20acd4c4f14040485f40e55c0a76c186aa8ca4f3/${file}";
2020-11-19 03:28:20 -05:00
inherit (localSystem) system;
inherit sha256 executable;
2021-06-02 00:25:56 -04:00
}; 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; };
}
2020-11-19 03:28:20 -05:00
else
let
fetch = { file, sha256, executable ? true }: import <nix/fetchurl.nix> {
url = "http://tarballs.nixos.org/stdenv-darwin/x86_64/c253216595572930316f2be737dc288a1da22558/${file}";
2020-11-19 03:28:20 -05:00
inherit (localSystem) system;
inherit sha256 executable;
2021-06-02 00:25:56 -04:00
}; in
{
sh = fetch { file = "sh"; sha256 = "sha256-igMAVEfumFv/LUNTGfNi2nSehgTNIP4Sg+f3L7u6SMA="; };
bzip2 = fetch { file = "bzip2"; sha256 = "sha256-K3rhkJZipudT1Jgh+l41Y/fNsMkrPtiAsNRDha/lpZI="; };
mkdir = fetch { file = "mkdir"; sha256 = "sha256-VddFELwLDJGNADKB1fWwWPBtIAlEUgJv2hXRmC4NEeM="; };
cpio = fetch { file = "cpio"; sha256 = "sha256-SWkwvLaFyV44kLKL2nx720SvcL4ej/p2V/bX3uqAGO0="; };
tarball = fetch { file = "bootstrap-tools.cpio.bz2"; sha256 = "sha256-kRC/bhCmlD4L7KAvJQgcukk7AinkMz4IwmG1rqlh5tA="; executable = false; };
2021-06-02 00:25:56 -04:00
}
}:
assert crossSystem == localSystem;
let
inherit (localSystem) system;
2020-11-19 03:28:20 -05:00
useAppleSDKLibs = localSystem.isAarch64;
haveKRB5 = localSystem.isx86_64;
# final toolchain is injected into llvmPackages_${finalLlvmVersion}
finalLlvmVersion = lib.versions.major bootstrapLlvmVersion;
2020-11-19 03:28:20 -05:00
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
];
2020-11-19 03:28:20 -05:00
2021-06-02 00:25:56 -04:00
in
rec {
commonPreHook = ''
export NIX_ENFORCE_NO_NATIVE=''${NIX_ENFORCE_NO_NATIVE-1}
export NIX_ENFORCE_PURITY=''${NIX_ENFORCE_PURITY-1}
export NIX_IGNORE_LD_THROUGH_GCC=1
unset SDKROOT
stripAllFlags=" " # the Darwin "strip" command doesn't know "-s"
stripDebugFlags="-S" # the Darwin "strip" command does something odd with "-p"
'';
bootstrapTools = derivation ({
inherit system;
2021-06-02 00:25:56 -04:00
name = "bootstrap-tools";
builder = bootstrapFiles.sh; # Not a filename! Attribute 'sh' on bootstrapFiles
2021-06-02 00:25:56 -04:00
args = if localSystem.isAarch64 then [ ./unpack-bootstrap-tools-aarch64.sh ] else [ ./unpack-bootstrap-tools.sh ];
inherit (bootstrapFiles) mkdir bzip2 cpio tarball;
__impureHostDeps = commonImpureHostDeps;
} // lib.optionalAttrs config.contentAddressedByDefault {
__contentAddressed = true;
outputHashAlgo = "sha256";
outputHashMode = "recursive";
});
2021-06-02 00:25:56 -04:00
stageFun = step: last: { shell ? "${bootstrapTools}/bin/bash"
, overrides ? (self: super: { })
, extraPreHook ? ""
, extraNativeBuildInputs
, extraBuildInputs
, libcxx
, allowedRequisites ? null
}:
let
name = "bootstrap-stage${toString step}";
buildPackages = lib.optionalAttrs (last ? stdenv) {
inherit (last) stdenv;
};
2020-11-19 03:28:20 -05:00
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"
2020-11-19 03:28:20 -05:00
ln -s "${last.pkgs."${finalLlvmPackages}".compiler-rt.out}/lib" "$rsrc/lib"
echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
'';
mkCC = overrides: import ../../build-support/cc-wrapper (
let args = {
2021-01-23 22:02:59 -05:00
inherit lib shell;
inherit (last) stdenvNoCC;
2021-06-02 00:25:56 -04:00
nativeTools = false;
nativeLibc = false;
inherit buildPackages libcxx;
inherit (last.pkgs) coreutils gnugrep;
2021-06-02 00:25:56 -04:00
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 = [
2020-11-19 03:28:20 -05:00
last.pkgs."${finalLlvmPackages}".libcxxabi
last.pkgs."${finalLlvmPackages}".compiler-rt
];
extraBuildCommands = mkExtraBuildCommands cc;
});
2021-06-02 00:25:56 -04:00
ccNoLibcxx = if last == null then "/dev/null" else
mkCC ({ cc, ... }: {
libcxx = null;
extraPackages = [
2020-11-19 03:28:20 -05:00
last.pkgs."${finalLlvmPackages}".compiler-rt
];
extraBuildCommands = ''
echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags
2020-11-19 03:28:20 -05:00
echo "-B${last.pkgs."${finalLlvmPackages}".compiler-rt}/lib" >> $out/nix-support/cc-cflags
echo "-nostdlib++" >> $out/nix-support/cc-cflags
'' + mkExtraBuildCommands cc;
});
thisStdenv = import ../generic {
name = "${name}-stdenv-darwin";
2020-11-19 03:28:20 -05:00
inherit config shell extraBuildInputs;
extraNativeBuildInputs = extraNativeBuildInputs ++ lib.optionals doUpdateAutoTools [
2021-06-02 00:25:56 -04:00
last.pkgs.updateAutotoolsGnuConfigScriptsHook
last.pkgs.gnu-config
2020-11-19 03:28:20 -05:00
];
allowedRequisites = if allowedRequisites == null then null else allowedRequisites ++ [
2021-06-02 00:25:56 -04:00
cc.expand-response-params
cc.bintools
2020-11-19 03:28:20 -05:00
] ++ lib.optionals doUpdateAutoTools [
2021-06-02 00:25:56 -04:00
last.pkgs.updateAutotoolsGnuConfigScriptsHook
last.pkgs.gnu-config
2020-11-19 03:28:20 -05:00
] ++ lib.optionals doSign [
last.pkgs.darwin.postLinkSignHook
last.pkgs.darwin.sigtool
last.pkgs.darwin.signingUtils
];
buildPlatform = localSystem;
hostPlatform = localSystem;
targetPlatform = localSystem;
inherit cc;
preHook = lib.optionalString (shell == "${bootstrapTools}/bin/bash") ''
# Don't patch #!/interpreter because it leads to retained
# dependencies on the bootstrapTools in the final stdenv.
dontPatchShebangs=1
'' + ''
${commonPreHook}
${extraPreHook}
'';
2021-06-02 00:25:56 -04:00
initialPath = [ bootstrapTools ];
fetchurlBoot = import ../../build-support/fetchurl {
inherit lib;
stdenvNoCC = stage0.stdenv;
curl = bootstrapTools;
};
# The stdenvs themselves don't use mkDerivation, so I need to specify this here
__stdenvImpureHostDeps = commonImpureHostDeps;
__extraImpureHostDeps = commonImpureHostDeps;
2021-06-02 00:25:56 -04:00
overrides = self: super: (overrides self super) // {
inherit ccNoLibcxx;
fetchurl = thisStdenv.fetchurlBoot;
};
};
2021-06-02 00:25:56 -04:00
in
{
inherit config overlays;
stdenv = thisStdenv;
};
stage0 = stageFun 0 null {
2019-08-13 17:52:01 -04:00
overrides = self: super: with stage0; {
coreutils = stdenv.mkDerivation {
name = "bootstrap-stage0-coreutils";
buildCommand = ''
mkdir -p $out
ln -s ${bootstrapTools}/bin $out/bin
'';
};
gnugrep = stdenv.mkDerivation {
name = "bootstrap-stage0-gnugrep";
buildCommand = ''
mkdir -p $out
ln -s ${bootstrapTools}/bin $out/bin
'';
};
2022-02-21 13:58:30 -05:00
pbzx = self.runCommandLocal "bootstrap-stage0-pbzx" { } ''
mkdir -p $out/bin
ln -s ${bootstrapTools}/bin/pbzx $out/bin
'';
2020-11-19 03:28:20 -05:00
2022-02-21 13:58:30 -05:00
cpio = self.runCommandLocal "bootstrap-stage0-cpio" { } ''
mkdir -p $out/bin
ln -s ${bootstrapFiles.cpio} $out/bin/cpio
'';
2020-11-19 03:28:20 -05:00
darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
2020-11-19 03:28:20 -05:00
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
'';
};
2022-02-21 13:58:30 -05:00
sigtool = self.runCommandLocal "bootstrap-stage0-sigtool" { } ''
mkdir -p $out/bin
ln -s ${bootstrapTools}/bin/sigtool $out/bin
ln -s ${bootstrapTools}/bin/codesign $out/bin
'';
2020-11-19 03:28:20 -05:00
2022-02-21 13:58:30 -05:00
print-reexports = self.runCommandLocal "bootstrap-stage0-print-reexports" { } ''
mkdir -p $out/bin
ln -s ${bootstrapTools}/bin/print-reexports $out/bin
'';
2020-11-19 03:28:20 -05:00
2022-02-21 13:58:30 -05:00
rewrite-tbd = self.runCommandLocal "bootstrap-stage0-rewrite-tbd" { } ''
mkdir -p $out/bin
ln -s ${bootstrapTools}/bin/rewrite-tbd $out/bin
'';
2020-11-19 03:28:20 -05:00
binutils-unwrapped = bootstrapTools // {
name = "bootstrap-stage0-binutils";
};
2020-11-19 03:28:20 -05:00
cctools = bootstrapTools // {
2020-11-19 03:28:20 -05:00
name = "bootstrap-stage0-cctools";
targetPrefix = "";
};
binutils = lib.makeOverridable (import ../../build-support/bintools-wrapper) {
shell = "${bootstrapTools}/bin/bash";
inherit lib;
inherit (self) stdenvNoCC;
2021-06-02 00:25:56 -04:00
nativeTools = false;
nativeLibc = false;
2020-11-19 03:28:20 -05:00
inherit (self) buildPackages coreutils gnugrep;
2021-06-02 00:25:56 -04:00
libc = selfDarwin.Libsystem;
bintools = selfDarwin.binutils-unwrapped;
2020-11-19 03:28:20 -05:00
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 ${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
ln -s libSystem.B.tbd $out/lib/libSystem.tbd
for name in c dbm dl info m mx poll proc pthread rpcsvc util gcc_s.10.4 gcc_s.10.5; do
ln -s libSystem.tbd $out/lib/lib$name.tbd
done
ln -s ${bootstrapTools}/lib/*.o $out/lib
ln -s ${bootstrapTools}/lib/libresolv.9.dylib $out/lib
ln -s libresolv.9.dylib $out/lib/libresolv.dylib
ln -s ${bootstrapTools}/include-Libsystem $out/include
'';
};
});
2020-11-19 03:28:20 -05:00
"${finalLlvmPackages}" = {
clang-unwrapped = stdenv.mkDerivation {
name = "bootstrap-stage0-clang";
2020-11-19 03:28:20 -05:00
version = bootstrapLlvmVersion;
buildCommand = ''
mkdir -p $out/lib
ln -s ${bootstrapTools}/bin $out/bin
ln -s ${bootstrapTools}/lib/clang $out/lib/clang
ln -s ${bootstrapTools}/include $out/include
'';
};
libcxx = stdenv.mkDerivation {
name = "bootstrap-stage0-libcxx";
2022-02-21 13:58:30 -05:00
dontUnpack = true;
installPhase = ''
mkdir -p $out/lib $out/include
ln -s ${bootstrapTools}/lib/libc++.dylib $out/lib/libc++.dylib
ln -s ${bootstrapTools}/include/c++ $out/include/c++
'';
passthru = {
isLLVM = true;
cxxabi = self."${finalLlvmPackages}".libcxxabi;
};
};
libcxxabi = stdenv.mkDerivation {
name = "bootstrap-stage0-libcxxabi";
buildCommand = ''
mkdir -p $out/lib
ln -s ${bootstrapTools}/lib/libc++abi.dylib $out/lib/libc++abi.dylib
'';
passthru = {
libName = "c++abi";
};
};
compiler-rt = stdenv.mkDerivation {
name = "bootstrap-stage0-compiler-rt";
buildCommand = ''
mkdir -p $out/lib
ln -s ${bootstrapTools}/lib/libclang_rt* $out/lib
ln -s ${bootstrapTools}/lib/darwin $out/lib/darwin
'';
};
};
};
2021-06-02 00:25:56 -04:00
extraNativeBuildInputs = [ ];
extraBuildInputs = [ ];
libcxx = null;
};
2021-06-02 00:25:56 -04:00
stage1 = prevStage:
let
persistent = self: super: with prevStage; {
cmake = super.cmakeMinimal;
2020-11-19 03:28:20 -05:00
curl = super.curlMinimal;
2021-06-02 00:25:56 -04:00
inherit pbzx cpio;
2021-06-02 00:25:56 -04:00
python3 = super.python3Minimal;
2021-06-02 00:25:56 -04:00
ninja = super.ninja.override { buildDocs = false; };
2021-06-02 00:25:56 -04:00
"${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
);
2020-11-19 03:28:20 -05:00
2021-06-02 00:25:56 -04:00
darwin = super.darwin.overrideScope (selfDarwin: _: {
inherit (darwin) rewrite-tbd binutils-unwrapped;
2020-11-19 03:28:20 -05:00
2021-06-02 00:25:56 -04:00
signingUtils = darwin.signingUtils.override {
inherit (selfDarwin) sigtool;
};
2021-06-02 00:25:56 -04:00
binutils = darwin.binutils.override {
coreutils = self.coreutils;
libc = selfDarwin.Libsystem;
inherit (selfDarwin) postLinkSignHook signingUtils;
};
});
2021-06-02 00:25:56 -04:00
};
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;
};
2021-06-02 00:25:56 -04:00
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 libiconv;
2021-06-02 00:25:56 -04:00
"${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 (builtins.any (v: finalLlvmVersion == v) [ 7 11 12 13 ]) {
2021-06-02 00:25:56 -04:00
# 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;
});
2021-06-02 00:25:56 -04:00
};
in
with prevStage; stageFun 2 prevStage {
extraPreHook = ''
export PATH_LOCALE=${pkgs.darwin.locale}/share/locale
'';
2021-06-02 00:25:56 -04:00
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
fixLibtool(): patch ./configure, add `file` to common-path.nix libtool's libtool.m4 script assumes that `file` is available, and can be found at `/usr/bin/file` (this path is hardwired). Furthermore, the script with this assumption is vendored into the ./configure scripts of an enormous number of packages. Without this commit, you will frequently see errors like this during the configurePhase with the sandbox enabled: ./configure: line 9595: /usr/bin/file: command not found Due mostly to luck, this error does not affect native compiles on nixpkgs' two most popular platforms, x86_64-linux and aarch64-linux. However it will cause incorrect linker flag detection and a failure to generate shared libraries for sandboxed cross-builds to a x86_64-linux host as well as any sandboxed build (cross or native) for the following hosts: x86_64-freebsd, *-hpux, *-irix, mips64*-linux, powerpc*-linux, s390x-linux, s390x-tpf, sparc-linux, and *-solaris. This commit fixes the problem by adding an extra line to fixLibtool() in pkgs/stdenv/generic/setup.sh. This extra line will scan the unpacked source code for executable files named "configure" which contain the following text: 'GNU Libtool is free software; you can redistribute it and/or modify' This text is taken to be an indicator of a vendored libtool.m4. When it is found, the configure script containing it is subjected to `sed -i s_/usr/bin/file_file_` which replaces all occurrences of `/usr/bin/file` with `file`. Additionally, the `file` package is now considered to be part of `stdenv`. It has been added to `common-path.nix` so that the `file` binary will be found in the `$PATH` of every build, except for the bootstrap-tools and the first few stages of stdenv boostrapping. Verified no regressions under: nix-build --arg pkgs 'import ./. {}' ./lib/tests/release.nix This commit allows the following commands to complete, which should enable Hydra to produce bootstrap-files for mips64el: nix-build \ --option sandbox true \ --option sandbox-fallback false \ pkgs/top-level/release-cross.nix \ -A bootstrapTools.mips64el-linux-gnuabi64.build nix-build \ --option sandbox true \ --option sandbox-fallback false \ . \ -A pkgsCross.mips64el-linux-gnuabi64.nix_2_4
2022-04-12 17:46:57 -04:00
file
2021-06-02 00:25:56 -04:00
] ++ 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;
};
2021-06-02 00:25:56 -04:00
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;
});
2021-06-02 00:25:56 -04:00
};
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
'';
2021-06-02 00:25:56 -04:00
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
fixLibtool(): patch ./configure, add `file` to common-path.nix libtool's libtool.m4 script assumes that `file` is available, and can be found at `/usr/bin/file` (this path is hardwired). Furthermore, the script with this assumption is vendored into the ./configure scripts of an enormous number of packages. Without this commit, you will frequently see errors like this during the configurePhase with the sandbox enabled: ./configure: line 9595: /usr/bin/file: command not found Due mostly to luck, this error does not affect native compiles on nixpkgs' two most popular platforms, x86_64-linux and aarch64-linux. However it will cause incorrect linker flag detection and a failure to generate shared libraries for sandboxed cross-builds to a x86_64-linux host as well as any sandboxed build (cross or native) for the following hosts: x86_64-freebsd, *-hpux, *-irix, mips64*-linux, powerpc*-linux, s390x-linux, s390x-tpf, sparc-linux, and *-solaris. This commit fixes the problem by adding an extra line to fixLibtool() in pkgs/stdenv/generic/setup.sh. This extra line will scan the unpacked source code for executable files named "configure" which contain the following text: 'GNU Libtool is free software; you can redistribute it and/or modify' This text is taken to be an indicator of a vendored libtool.m4. When it is found, the configure script containing it is subjected to `sed -i s_/usr/bin/file_file_` which replaces all occurrences of `/usr/bin/file` with `file`. Additionally, the `file` package is now considered to be part of `stdenv`. It has been added to `common-path.nix` so that the `file` binary will be found in the `$PATH` of every build, except for the bootstrap-tools and the first few stages of stdenv boostrapping. Verified no regressions under: nix-build --arg pkgs 'import ./. {}' ./lib/tests/release.nix This commit allows the following commands to complete, which should enable Hydra to produce bootstrap-files for mips64el: nix-build \ --option sandbox true \ --option sandbox-fallback false \ pkgs/top-level/release-cross.nix \ -A bootstrapTools.mips64el-linux-gnuabi64.build nix-build \ --option sandbox true \ --option sandbox-fallback false \ . \ -A pkgsCross.mips64el-linux-gnuabi64.nix_2_4
2022-04-12 17:46:57 -04:00
file
2021-06-02 00:25:56 -04:00
] ++ 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;
};
2020-11-19 03:28:20 -05:00
2021-06-02 00:25:56 -04:00
stage4 = prevStage:
let
persistent = self: super: with prevStage; {
inherit
gnumake gzip gnused bzip2 ed xz patch bash python3
2021-06-02 00:25:56 -04:00
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"
];
2020-11-19 03:28:20 -05:00
});
2021-06-02 00:25:56 -04:00
"${finalLlvmPackages}" = super."${finalLlvmPackages}" // (
let
tools = super."${finalLlvmPackages}".tools.extend (llvmSelf: _: {
clang-unwrapped-all-outputs = pkgs."${finalLlvmPackages}".clang-unwrapped-all-outputs.override { llvm = llvmSelf.llvm; };
libllvm = pkgs."${finalLlvmPackages}".libllvm.override { inherit libxml2; };
});
libraries = super."${finalLlvmPackages}".libraries.extend (llvmSelf: _: {
inherit (pkgs."${finalLlvmPackages}") libcxx libcxxabi compiler-rt;
});
in
{ inherit tools libraries; } // tools // libraries
);
darwin = super.darwin.overrideScope (_: superDarwin: {
inherit (darwin) dyld Libsystem libiconv locale darwin-stubs;
# See useAppleSDKLibs in darwin-packages.nix
CF = if useAppleSDKLibs then super.darwin.CF else
superDarwin.CF.override {
inherit libxml2;
python3 = prevStage.python3;
};
});
};
in
with prevStage; stageFun 4 prevStage {
shell = "${pkgs.bash}/bin/bash";
extraNativeBuildInputs = with pkgs; [ xz ];
extraBuildInputs = [ pkgs.darwin.CF pkgs.bash ];
libcxx = pkgs."${finalLlvmPackages}".libcxx;
extraPreHook = ''
export PATH_LOCALE=${pkgs.darwin.locale}/share/locale
'';
overrides = persistent;
};
2021-06-02 00:25:56 -04:00
stdenvDarwin = prevStage:
let
doSign = localSystem.isAarch64;
pkgs = prevStage;
persistent = self: super: with prevStage; {
inherit
gnumake gzip gnused bzip2 gawk ed xz patch bash
ncurses libffi zlib gmp pcre gnugrep
coreutils findutils diffutils patchutils pbzx;
darwin = super.darwin.overrideScope (_: _: {
inherit (darwin) dyld ICU Libsystem Csu libiconv rewrite-tbd;
} // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
inherit (darwin) binutils binutils-unwrapped cctools;
});
} // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
inherit llvm;
# Need to get rid of these when cross-compiling.
"${finalLlvmPackages}" = super."${finalLlvmPackages}" // (
let
tools = super."${finalLlvmPackages}".tools.extend (_: super: {
inherit (pkgs."${finalLlvmPackages}") llvm clang-unwrapped;
});
libraries = super."${finalLlvmPackages}".libraries.extend (_: _: {
inherit (pkgs."${finalLlvmPackages}") compiler-rt libcxx libcxxabi;
});
in
{ inherit tools libraries; } // tools // libraries
);
inherit binutils binutils-unwrapped;
};
in
import ../generic rec {
name = "stdenv-darwin";
2021-06-02 00:25:56 -04:00
inherit config;
inherit (pkgs.stdenv) fetchurlBoot;
2021-06-02 00:25:56 -04:00
buildPlatform = localSystem;
hostPlatform = localSystem;
targetPlatform = localSystem;
2021-06-02 00:25:56 -04:00
preHook = commonPreHook + ''
export NIX_COREFOUNDATION_RPATH=${pkgs.darwin.CF}/Library/Frameworks
export PATH_LOCALE=${pkgs.darwin.locale}/share/locale
'';
2021-06-02 00:25:56 -04:00
__stdenvImpureHostDeps = commonImpureHostDeps;
__extraImpureHostDeps = commonImpureHostDeps;
initialPath = import ../generic/common-path.nix { inherit pkgs; };
2021-06-02 00:25:56 -04:00
shell = "${pkgs.bash}/bin/bash";
2020-11-19 03:28:20 -05:00
2021-06-02 00:25:56 -04:00
cc = pkgs."${finalLlvmPackages}".libcxxClang;
2021-06-02 00:25:56 -04:00
extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
pkgs.updateAutotoolsGnuConfigScriptsHook
];
2021-06-02 00:25:56 -04:00
extraBuildInputs = [ pkgs.darwin.CF ];
2021-06-02 00:25:56 -04:00
extraAttrs = {
libc = pkgs.darwin.Libsystem;
shellPackage = pkgs.bash;
inherit bootstrapTools;
} // lib.optionalAttrs useAppleSDKLibs {
# This objc4 will be propagated to all builds using the final stdenv,
# and we shouldn't mix different builds, because they would be
# conflicting LLVM modules. Export it here so we can grab it later.
inherit (pkgs.darwin) objc4;
2021-06-02 00:25:56 -04:00
};
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
binutils.bintools.lib
2021-06-02 00:25:56 -04:00
darwin.binutils
darwin.binutils.bintools
curl.out
zstd.out
libidn2.out
libunistring.out
2021-06-02 00:25:56 -04:00
openssl.out
libssh2.out
nghttp2.lib
brotli.lib
cc.expand-response-params
libxml2.out
fixLibtool(): patch ./configure, add `file` to common-path.nix libtool's libtool.m4 script assumes that `file` is available, and can be found at `/usr/bin/file` (this path is hardwired). Furthermore, the script with this assumption is vendored into the ./configure scripts of an enormous number of packages. Without this commit, you will frequently see errors like this during the configurePhase with the sandbox enabled: ./configure: line 9595: /usr/bin/file: command not found Due mostly to luck, this error does not affect native compiles on nixpkgs' two most popular platforms, x86_64-linux and aarch64-linux. However it will cause incorrect linker flag detection and a failure to generate shared libraries for sandboxed cross-builds to a x86_64-linux host as well as any sandboxed build (cross or native) for the following hosts: x86_64-freebsd, *-hpux, *-irix, mips64*-linux, powerpc*-linux, s390x-linux, s390x-tpf, sparc-linux, and *-solaris. This commit fixes the problem by adding an extra line to fixLibtool() in pkgs/stdenv/generic/setup.sh. This extra line will scan the unpacked source code for executable files named "configure" which contain the following text: 'GNU Libtool is free software; you can redistribute it and/or modify' This text is taken to be an indicator of a vendored libtool.m4. When it is found, the configure script containing it is subjected to `sed -i s_/usr/bin/file_file_` which replaces all occurrences of `/usr/bin/file` with `file`. Additionally, the `file` package is now considered to be part of `stdenv`. It has been added to `common-path.nix` so that the `file` binary will be found in the `$PATH` of every build, except for the bootstrap-tools and the first few stages of stdenv boostrapping. Verified no regressions under: nix-build --arg pkgs 'import ./. {}' ./lib/tests/release.nix This commit allows the following commands to complete, which should enable Hydra to produce bootstrap-files for mips64el: nix-build \ --option sandbox true \ --option sandbox-fallback false \ pkgs/top-level/release-cross.nix \ -A bootstrapTools.mips64el-linux-gnuabi64.build nix-build \ --option sandbox true \ --option sandbox-fallback false \ . \ -A pkgsCross.mips64el-linux-gnuabi64.nix_2_4
2022-04-12 17:46:57 -04:00
file
2021-06-02 00:25:56 -04:00
] ++ 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;
});
2021-06-02 00:25:56 -04:00
};
stagesDarwin = [
({}: stage0)
stage1
stage2
stage3
stage4
(prevStage: {
inherit config overlays;
stdenv = stdenvDarwin prevStage;
})
];
}