core/pkgs/bootTools/default.nix

1426 lines
57 KiB
Nix
Raw Normal View History

2024-05-22 02:12:38 +00:00
# This file contains the standard build environment for Darwin. It is based on LLVM and is patterned
# after the Linux stdenv. It shares similar goals to the Linux standard environment in that the
# resulting environment should be built purely and not contain any references to it.
#
# For more on the design of the stdenv and updating it, see `README.md`.
#
# See also the top comments of the Linux stdenv `../linux/default.nix` for a good overview of
# the bootstrap process and working with it.
let
lib = import ../../lib;
builtins = lib.builtins;
setup = builtins.fromJSON (builtins.readFile ./static/setup.json);
in
{
"darwin-aarch-64" = (
let
system = "aarch64-darwin";
thisSetup = setup.osSpecific.${system};
bootstrapFiles = {
bootstrapTools = builtins.fetchurl thisSetup.stdFetchurls.bootstrapTools;
unpack = builtins.fetchurl thisSetup.stdFetchurls.unpack;
};
in
builtins.derivation {
system = system;
name = "bootstrap-tools";
builder = "${bootstrapFiles.unpack}/bin/bash";
args = [
"${bootstrapFiles.unpack}/bootstrap-tools-unpack.sh"
bootstrapFiles.bootstrapTools
];
PATH = lib.makeBinPath [
(builtins.placeholder "out")
bootstrapFiles.unpack
];
__impureHostDeps = [
"/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
];
# TODO: test if these work
# __contentAddressed = true;
# outputHashAlgo = "sha256";
# outputHashMode = "recursive";
}
);
# "darwin-x86-64" = (
#
# );
}
# {
# 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
# import ./bootstrap-files/aarch64-apple-darwin.nix
# else
# import ./bootstrap-files/x86_64-apple-darwin.nix
# }:
# assert crossSystem == localSystem;
# let
# inherit (localSystem) system;
# useAppleSDKLibs = localSystem.isAarch64;
# 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
# ];
# isFromNixpkgs = pkg: !(isFromBootstrapFiles pkg);
# isFromBootstrapFiles =
# pkg: pkg.passthru.isFromBootstrapFiles or false;
# isBuiltByNixpkgsCompiler =
# pkg: isFromNixpkgs pkg && isFromNixpkgs pkg.stdenv.cc.cc;
# isBuiltByBootstrapFilesCompiler =
# pkg: isFromNixpkgs pkg && isFromBootstrapFiles pkg.stdenv.cc.cc;
# 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
# '';
# bootstrapTools = derivation ({
# inherit system;
# name = "bootstrap-tools";
# builder = "${bootstrapFiles.unpack}/bin/bash";
# args = [
# "${bootstrapFiles.unpack}/bootstrap-tools-unpack.sh"
# bootstrapFiles.bootstrapTools
# ];
# PATH = lib.makeBinPath [
# (placeholder "out")
# bootstrapFiles.unpack
# ];
# __impureHostDeps = commonImpureHostDeps;
# } // lib.optionalAttrs config.contentAddressedByDefault {
# __contentAddressed = true;
# outputHashAlgo = "sha256";
# outputHashMode = "recursive";
# }) // { passthru.isFromBootstrapFiles = true; };
# stageFun = prevStage:
# { name, overrides ? (self: super: { }), extraNativeBuildInputs ? [ ], extraPreHook ? "" }:
# let
# cc = if prevStage.llvmPackages.clang-unwrapped == null
# then null else
# lib.makeOverridable (import ../../build-support/cc-wrapper) {
# name = "${name}-clang-wrapper";
# nativeTools = false;
# nativeLibc = false;
# expand-response-params = lib.optionalString
# (prevStage.stdenv.hasCC or false && prevStage.stdenv.cc != "/dev/null")
# prevStage.expand-response-params;
# extraPackages = [
# prevStage.llvmPackages.compiler-rt
# ];
# extraBuildCommands =
# let
# inherit (prevStage.llvmPackages) clang-unwrapped compiler-rt release_version;
# in
# ''
# function clangResourceRootIncludePath() {
# clangLib="$1/lib/clang"
# if (( $(ls "$clangLib" | wc -l) > 1 )); then
# echo "Multiple LLVM versions were found at "$clangLib", but there must only be one used when building the stdenv." >&2
# exit 1
# fi
# echo "$clangLib/$(ls -1 "$clangLib")/include"
# }
# rsrc="$out/resource-root"
# mkdir "$rsrc"
# ln -s "$(clangResourceRootIncludePath "${clang-unwrapped.lib}")" "$rsrc"
# ln -s "${compiler-rt.out}/lib" "$rsrc/lib"
# ln -s "${compiler-rt.out}/share" "$rsrc/share"
# echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
# '';
# cc = prevStage.llvmPackages.clang-unwrapped;
# bintools = prevStage.darwin.binutils;
# isClang = true;
# libc = prevStage.darwin.Libsystem;
# inherit (prevStage.llvmPackages) libcxx;
# inherit lib;
# inherit (prevStage) coreutils gnugrep;
# stdenvNoCC = prevStage.ccWrapperStdenv;
# runtimeShell = prevStage.ccWrapperStdenv.shell;
# };
# bash = prevStage.bash or bootstrapTools;
# thisStdenv = import ../generic {
# name = "${name}-stdenv-darwin";
# buildPlatform = localSystem;
# hostPlatform = localSystem;
# targetPlatform = localSystem;
# inherit config;
# extraBuildInputs = [ prevStage.darwin.CF ];
# extraNativeBuildInputs = extraNativeBuildInputs
# ++ [ prevStage.darwin.apple_sdk.sdkRoot ];
# preHook = lib.optionalString (!isBuiltByNixpkgsCompiler bash) ''
# # Don't patch #!/interpreter because it leads to retained
# # dependencies on the bootstrapTools in the final stdenv.
# dontPatchShebangs=1
# '' + ''
# ${commonPreHook}
# ${extraPreHook}
# '' + lib.optionalString (prevStage.darwin ? locale) ''
# export PATH_LOCALE=${prevStage.darwin.locale}/share/locale
# '';
# shell = bash + "/bin/bash";
# initialPath = [ bash bootstrapTools ];
# fetchurlBoot = import ../../build-support/fetchurl {
# inherit lib;
# stdenvNoCC = prevStage.ccWrapperStdenv or thisStdenv;
# curl = bootstrapTools;
# };
# inherit cc;
# # The stdenvs themselves don't use mkDerivation, so I need to specify this here
# __stdenvImpureHostDeps = commonImpureHostDeps;
# __extraImpureHostDeps = commonImpureHostDeps;
# # Using the bootstrap tools curl for fetchers allows the stdenv bootstrap to avoid
# # having a dependency on curl, allowing curl to be updated without triggering a
# # new stdenv bootstrap on Darwin.
# overrides = self: super: (overrides self super) // {
# fetchurl = thisStdenv.fetchurlBoot;
# fetchpatch = super.fetchpatch.override { inherit (self) fetchurl; };
# fetchgit = super.fetchgit.override {
# git = super.git.override { curl = bootstrapTools; };
# };
# fetchzip = super.fetchzip.override { inherit (self) fetchurl; };
# };
# };
# in
# {
# inherit config overlays;
# stdenv = thisStdenv;
# };
# in
# assert bootstrapTools.passthru.isFromBootstrapFiles or false; # sanity check
# [
# ({}: {
# __raw = true;
# coreutils = null;
# gnugrep = null;
# pbzx = null;
# cpio = null;
# darwin = {
# apple_sdk.sdkRoot = null;
# binutils = null;
# binutils-unwrapped = null;
# cctools = null;
# print-reexports = null;
# rewrite-tbd = null;
# sigtool = null;
# CF = null;
# Libsystem = null;
# };
# llvmPackages = {
# clang-unwrapped = null;
# libllvm = null;
# libcxx = null;
# compiler-rt = null;
# };
# })
# # Create a stage with the bootstrap tools. This will be used to build the subsequent stages and
# # build up the standard environment.
# #
# # Note: Each stage depends only on the the packages in `prevStage`. If a package is not to be
# # rebuilt, it should be passed through by inheriting it.
# (prevStage: stageFun prevStage {
# name = "bootstrap-stage0";
# overrides = self: super: {
# # We thread stage0's stdenv through under this name so downstream stages
# # can use it for wrapping gcc too. This way, downstream stages don't need
# # to refer to this stage directly, which violates the principle that each
# # stage should only access the stage that came before it.
# ccWrapperStdenv = self.stdenv;
# bash = bootstrapTools;
# coreutils = bootstrapTools;
# cpio = bootstrapTools;
# gnugrep = bootstrapTools;
# pbzx = bootstrapTools;
# darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
# # Prevent CF from being propagated to the initial stdenv. Packages that require it
# # will have to manually add it to their build inputs.
# CF = null;
# binutils-unwrapped = bootstrapTools // {
# version = "boot";
# };
# binutils = super.wrapBintoolsWith {
# name = "bootstrap-stage0-binutils-wrapper";
# nativeTools = false;
# nativeLibc = false;
# expand-response-params = "";
# libc = selfDarwin.Libsystem;
# inherit lib;
# inherit (self) stdenvNoCC coreutils gnugrep;
# runtimeShell = self.stdenvNoCC.shell;
# bintools = selfDarwin.binutils-unwrapped;
# inherit (selfDarwin) postLinkSignHook signingUtils;
# };
# cctools = bootstrapTools // {
# targetPrefix = "";
# version = "boot";
# man = bootstrapTools;
# };
# locale = self.stdenv.mkDerivation {
# name = "bootstrap-stage0-locale";
# buildCommand = ''
# mkdir -p $out/share/locale
# '';
# };
# print-reexports = bootstrapTools;
# rewrite-tbd = bootstrapTools;
# sigtool = bootstrapTools;
# } // lib.optionalAttrs (! useAppleSDKLibs) {
# Libsystem = self.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
# '';
# passthru.isFromBootstrapFiles = true;
# };
# });
# llvmPackages = super.llvmPackages // (
# let
# tools = super.llvmPackages.tools.extend (selfTools: _: {
# libclang = self.stdenv.mkDerivation {
# name = "bootstrap-stage0-clang";
# version = "boot";
# outputs = [ "out" "lib" ];
# buildCommand = ''
# mkdir -p $out/lib
# ln -s $out $lib
# ln -s ${bootstrapTools}/bin $out/bin
# ln -s ${bootstrapTools}/lib/clang $out/lib
# ln -s ${bootstrapTools}/include $out
# '';
# passthru = {
# isFromBootstrapFiles = true;
# hardeningUnsupportedFlags = [ "fortify3" "zerocallusedregs" ];
# };
# };
# clang-unwrapped = selfTools.libclang;
# libllvm = self.stdenv.mkDerivation {
# name = "bootstrap-stage0-llvm";
# outputs = [ "out" "lib" ];
# buildCommand = ''
# mkdir -p $out/bin $out/lib
# ln -s $out $lib
# ln -s ${bootstrapTools}/bin/strip $out/bin/llvm-strip
# ln -s ${bootstrapTools}/lib/libLLVM* $out/lib
# '';
# passthru.isFromBootstrapFiles = true;
# };
# llvm = selfTools.libllvm;
# });
# libraries = super.llvmPackages.libraries.extend (_: _: {
# libcxx = self.stdenv.mkDerivation {
# name = "bootstrap-stage0-libcxx";
# buildCommand = ''
# mkdir -p $out/lib $out/include
# ln -s ${bootstrapTools}/lib/libc++.dylib $out/lib
# ln -s ${bootstrapTools}/include/c++ $out/include
# '';
# passthru = {
# isLLVM = true;
# isFromBootstrapFiles = true;
# };
# };
# compiler-rt = self.stdenv.mkDerivation {
# name = "bootstrap-stage0-compiler-rt";
# buildCommand = ''
# mkdir -p $out/lib $out/share
# ln -s ${bootstrapTools}/lib/libclang_rt* $out/lib
# ln -s ${bootstrapTools}/lib/darwin $out/lib
# '';
# passthru.isFromBootstrapFiles = true;
# };
# });
# in
# { inherit tools libraries; } // tools // libraries
# );
# };
# # The bootstrap tools may use `strip` from cctools, so use a compatible set of flags until LLVM
# # is rebuilt, and darwin.binutils can use its implementation instead.
# extraPreHook = ''
# stripAllFlags=" " # the cctools "strip" command doesn't know "-s"
# stripDebugFlags="-S" # the cctools "strip" command does something odd with "-p"
# '';
# })
# # This stage is primarily responsible for building the linker and setting up versions of
# # certain dependencies needed by the rest of the build process. It is necessary to rebuild the
# # linker because the `compiler-rt` build process checks the version and attempts to manually
# # run `codesign` if it detects a version of `ld64` it considers too old. If that happens, the
# # build process will fail for a few different reasons:
# # - sigtool is too old and does not accept the `--sign` argument;
# # - sigtool is new enough to accept the `--sign` argument, but it aborts when it is invoked on a
# # binary that is already signed; or
# # - compiler-rt attempts to invoke `codesign` on x86_64-darwin, but `sigtool` is not currently
# # part of the x86_64-darwin bootstrap tools.
# #
# # This stage also builds CF and Libsystem to simplify assertions and assumptions for later by
# # making sure both packages are present on x86_64-darwin and aarch64-darwin.
# (prevStage:
# # previous stage0 stdenv:
# assert lib.all isFromBootstrapFiles (
# with prevStage; [ bash coreutils cpio gnugrep ] ++ lib.optionals useAppleSDKLibs [ pbzx ]
# );
# assert lib.all isFromBootstrapFiles (with prevStage.darwin; [
# binutils-unwrapped cctools print-reexports rewrite-tbd sigtool
# ]);
# assert (! useAppleSDKLibs) -> lib.all isFromBootstrapFiles (with prevStage.darwin; [ Libsystem ]);
# assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ Libsystem ]);
# assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd xnu ]);
# assert (with prevStage.darwin; (! useAppleSDKLibs) -> CF == null);
# assert lib.all isFromBootstrapFiles (with prevStage.llvmPackages; [
# clang-unwrapped libclang libllvm llvm compiler-rt libcxx
# ]);
# stageFun prevStage {
# name = "bootstrap-stage1";
# overrides = self: super: {
# inherit (prevStage) ccWrapperStdenv
# coreutils gnugrep;
# # Use this stages CF to build CMake. Its required but cant be included in the stdenv.
# cmake = self.cmakeMinimal;
# cmakeMinimal = super.cmakeMinimal.overrideAttrs (old: {
# buildInputs = old.buildInputs ++ [ self.darwin.CF ];
# });
# # Disable tests because they use dejagnu, which fails to run.
# libffi = super.libffi.override { doCheck = false; };
# # Avoid pulling in a full python and its extra dependencies for the llvm/clang builds.
# libxml2 = super.libxml2.override { pythonSupport = false; };
# ninja = super.ninja.override { };
# # Use this stages CF to build Python. Its required but cant be included in the stdenv.
# python3 = self.python3Minimal;
# python3Minimal = super.python3Minimal.overrideAttrs (old: {
# buildInputs = old.buildInputs ++ [ self.darwin.CF ];
# });
# darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
# apple_sdk = superDarwin.apple_sdk // {
# inherit (prevStage.darwin.apple_sdk) sdkRoot;
# };
# # Use this stages CF to build configd. Its required but cant be included in the stdenv.
# configd = superDarwin.configd.overrideAttrs (old: {
# buildInputs = old.buildInputs or [ ] ++ [ self.darwin.CF ];
# });
# signingUtils = prevStage.darwin.signingUtils.override {
# inherit (selfDarwin) sigtool;
# };
# postLinkSignHook = prevStage.darwin.postLinkSignHook.override {
# inherit (selfDarwin) sigtool;
# };
# binutils = superDarwin.binutils.override {
# inherit (self) coreutils;
# inherit (selfDarwin) postLinkSignHook signingUtils;
# bintools = selfDarwin.binutils-unwrapped;
# libc = selfDarwin.Libsystem;
# # TODO(@sternenseemann): can this be removed?
# runtimeShell = "${bootstrapTools}/bin/bash";
# };
# binutils-unwrapped = superDarwin.binutils-unwrapped.override {
# inherit (selfDarwin) cctools;
# };
# cctools = selfDarwin.cctools-port;
# });
# llvmPackages = super.llvmPackages // (
# let
# tools = super.llvmPackages.tools.extend (_: _: {
# inherit (prevStage.llvmPackages) clang-unwrapped libclang libllvm llvm;
# });
# libraries = super.llvmPackages.libraries.extend (_: _: {
# inherit (prevStage.llvmPackages) compiler-rt libcxx;
# });
# in
# { inherit tools libraries; inherit (prevStage.llvmPackages) release_version; } // tools // libraries
# );
# };
# extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
# prevStage.updateAutotoolsGnuConfigScriptsHook
# prevStage.gnu-config
# ];
# # The bootstrap tools may use `strip` from cctools, so use a compatible set of flags until LLVM
# # is rebuilt, and darwin.binutils can use its implementation instead.
# extraPreHook = ''
# stripAllFlags=" " # the cctools "strip" command doesn't know "-s"
# stripDebugFlags="-S" # the cctools "strip" command does something odd with "-p"
# # Dont assume the ld64 in bootstrap tools supports response files. Only recent versions do.
# export NIX_LD_USE_RESPONSE_FILE=0
# '';
# })
# # Build cctools, Python, and sysctl for use by LLVMs check phase. They must be built in
# # their stage to prevent infinite recursions and to make sure the stdenv used to build
# # LLVM has the newly built cctools instead of the one from the bootstrap tools.
# (prevStage:
# # previous stage1 stdenv:
# assert lib.all isFromBootstrapFiles (with prevStage; [ coreutils gnugrep ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
# autoconf automake bash binutils-unwrapped bison brotli cmake cpio cyrus_sasl db
# ed expat flex gettext gmp groff icu libedit libffi libiconv libidn2 libkrb5 libssh2
# libtool libunistring libxml2 m4 ncurses nghttp2 ninja openldap openssh openssl
# patchutils pbzx perl pkg-config.pkg-config python3 python3Minimal scons serf sqlite
# subversion texinfo unzip which xz zlib zstd
# ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [
# binutils-unwrapped cctools locale libtapi print-reexports rewrite-tbd sigtool
# ]);
# assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ Libsystem configd ]);
# assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]);
# assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc]);
# assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd xnu ]);
# assert lib.all isFromBootstrapFiles (with prevStage.llvmPackages; [
# clang-unwrapped libclang libllvm llvm compiler-rt libcxx
# ]);
# assert lib.getVersion prevStage.stdenv.cc.bintools.bintools == "boot";
# stageFun prevStage {
# name = "bootstrap-stage1-sysctl";
# overrides = self: super: {
# inherit (prevStage) ccWrapperStdenv
# autoconf automake bash binutils binutils-unwrapped bison brotli cmake cmakeMinimal
# coreutils cpio cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu
# libedit libffi libiconv libidn2 libkrb5 libssh2 libtool libunistring libxml2 m4
# ncurses nghttp2 ninja openldap openssh openssl patchutils pbzx perl pkg-config
# python3Minimal scons sed serf sharutils sqlite subversion texinfo unzip which xz
# zlib zstd;
# # Support for the SystemConfiguration framework is required to run the LLVM tests, but trying
# # to override python3Minimal does not appear to work.
# python3 = (super.python3.override {
# inherit (self) libffi;
# inherit (self.darwin) configd;
# openssl = null;
# readline = null;
# ncurses = null;
# gdbm = null;
# sqlite = null;
# tzdata = null;
# stripConfig = true;
# stripIdlelib = true;
# stripTests = true;
# stripTkinter = true;
# rebuildBytecode = false;
# stripBytecode = true;
# includeSiteCustomize = false;
# enableOptimizations = false;
# enableLTO = false;
# mimetypesSupport = false;
# }).overrideAttrs (_: { pname = "python3-minimal-scproxy"; });
# darwin = super.darwin.overrideScope (_: superDarwin: {
# inherit (prevStage.darwin)
# CF sdkRoot Libsystem binutils-unwrapped cctools cctools-port configd darwin-stubs dyld
# launchd libclosure libdispatch libobjc locale objc4 postLinkSignHook
# print-reexports rewrite-tbd signingUtils sigtool;
# apple_sdk = superDarwin.apple_sdk // {
# inherit (prevStage.darwin.apple_sdk) sdkRoot;
# };
# });
# llvmPackages = super.llvmPackages // (
# let
# tools = super.llvmPackages.tools.extend (_: _: {
# inherit (prevStage.llvmPackages) clang-unwrapped libclang libllvm llvm;
# clang = prevStage.stdenv.cc;
# });
# libraries = super.llvmPackages.libraries.extend (_: _: {
# inherit (prevStage.llvmPackages) compiler-rt libcxx;
# });
# in
# { inherit tools libraries; inherit (prevStage.llvmPackages) release_version; } // tools // libraries
# );
# };
# extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
# prevStage.updateAutotoolsGnuConfigScriptsHook
# prevStage.gnu-config
# ];
# # Until LLVM is rebuilt, assume `strip` is the one from cctools.
# extraPreHook = ''
# stripAllFlags=" " # the cctools "strip" command doesn't know "-s"
# stripDebugFlags="-S" # the cctools "strip" command does something odd with "-p"
# '';
# })
# # First rebuild of LLVM. While this LLVM is linked to a bunch of junk from the bootstrap tools,
# # the libc++ and libc++abi it produces are not. The compiler will be rebuilt in a later stage,
# # but those libraries will be used in the final stdenv.
# #
# # Rebuild coreutils and gnugrep to avoid unwanted references to the bootstrap tools on `PATH`.
# (prevStage:
# # previous stage-sysctl stdenv:
# assert lib.all isFromBootstrapFiles (with prevStage; [ coreutils gnugrep ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
# autoconf automake bash binutils-unwrapped bison brotli cmake cpio cyrus_sasl db
# ed expat flex gettext gmp groff icu libedit libffi libiconv libidn2 libkrb5 libssh2
# libtool libunistring libxml2 m4 ncurses nghttp2 ninja openldap openssh openssl
# patchutils pbzx perl pkg-config.pkg-config python3 python3Minimal scons serf sqlite
# subversion sysctl.provider texinfo unzip which xz zlib zstd
# ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [
# binutils-unwrapped cctools locale libtapi print-reexports rewrite-tbd sigtool
# ]);
# assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ Libsystem configd ]);
# assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]);
# assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc ]);
# assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd xnu ]);
# assert lib.all isFromBootstrapFiles (with prevStage.llvmPackages; [
# clang-unwrapped libclang libllvm llvm compiler-rt libcxx
# ]);
# assert lib.getVersion prevStage.stdenv.cc.bintools.bintools == lib.getVersion prevStage.darwin.cctools-port;
# stageFun prevStage {
# name = "bootstrap-stage-xclang";
# overrides = self: super: {
# inherit (prevStage) ccWrapperStdenv
# autoconf automake bash binutils binutils-unwrapped bison brotli cmake cmakeMinimal
# cpio cyrus_sasl db ed expat flex gettext gmp groff icu libedit libffi libiconv
# libidn2 libkrb5 libssh2 libtool libunistring libxml2 m4 ncurses nghttp2 ninja
# openldap openssh openssl patchutils pbzx perl pkg-config python3 python3Minimal
# scons sed serf sharutils sqlite subversion sysctl texinfo unzip which xz zlib zstd;
# # Switch from cctools-port to cctools-llvm now that LLVM has been built.
# darwin = super.darwin.overrideScope (_: superDarwin: {
# inherit (prevStage.darwin)
# CF Libsystem configd darwin-stubs dyld launchd libclosure libdispatch libobjc
# locale objc4 postLinkSignHook print-reexports rewrite-tbd signingUtils sigtool;
# apple_sdk = superDarwin.apple_sdk // {
# inherit (prevStage.darwin.apple_sdk) sdkRoot;
# };
# # Avoid building unnecessary Python dependencies due to building LLVM manpages.
# cctools-llvm = superDarwin.cctools-llvm.override { enableManpages = false; };
# });
# llvmPackages = super.llvmPackages // (
# let
# llvmMajor = lib.versions.major super.llvmPackages.release_version;
# # libc++, and libc++abi do not need CoreFoundation. Avoid propagating the CF from prior
# # stages to the final stdenv via rpath by dropping it from `extraBuildInputs`.
# stdenvNoCF = self.stdenv.override {
# extraBuildInputs = [ ];
# };
# libcxxBootstrapStdenv = self.overrideCC stdenvNoCF (self.llvmPackages.clangNoCompilerRtWithLibc.override {
# nixSupport.cc-cflags = [ "-nostdlib" ];
# nixSupport.cc-ldflags = [ "-lSystem" ];
# });
# libraries = super.llvmPackages.libraries.extend (selfLib: superLib: {
# compiler-rt = null;
# libcxx = superLib.libcxx.override ({
# stdenv = libcxxBootstrapStdenv;
# });
# });
# in
# { inherit libraries; } // libraries
# );
# };
# extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
# prevStage.updateAutotoolsGnuConfigScriptsHook
# prevStage.gnu-config
# ];
# extraPreHook = ''
# stripAllFlags=" " # the cctools "strip" command doesn't know "-s"
# stripDebugFlags="-S" # the cctools "strip" command does something odd with "-p"
# '';
# })
# # This stage rebuilds Libsystem. It also rebuilds bash, which will be needed in later stages
# # to use in patched shebangs (e.g., to make sure `icu-config` uses bash from nixpkgs).
# (prevStage:
# # previous stage-xclang stdenv:
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
# autoconf automake bash binutils-unwrapped bison cmake cmakeMinimal coreutils cpio
# cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu libedit libtool m4 ninja
# openbsm openldap openpam openssh patchutils pbzx perl pkg-config.pkg-config python3
# python3Minimal scons serf sqlite subversion sysctl.provider texinfo unzip which xz
# ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
# brotli libffi libiconv libidn2 libkrb5 libssh2 libunistring libxml2 ncurses
# nghttp2 openssl zlib zstd
# ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [
# binutils-unwrapped cctools locale libtapi print-reexports rewrite-tbd sigtool
# ]);
# assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ Libsystem configd ]);
# assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]);
# assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc ]);
# assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd libclosure libdispatch xnu ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.llvmPackages; [
# clang-unwrapped libclang libllvm llvm
# ]);
# assert lib.all isBuiltByNixpkgsCompiler (with prevStage.llvmPackages; [ libcxx ]);
# assert prevStage.llvmPackages.compiler-rt == null;
# assert lib.getVersion prevStage.stdenv.cc.bintools.bintools == lib.getVersion prevStage.darwin.cctools-port;
# stageFun prevStage {
# name = "bootstrap-stage2-Libsystem";
# overrides = self: super: {
# inherit (prevStage) ccWrapperStdenv
# autoconf automake binutils-unwrapped bison brotli cmake cmakeMinimal coreutils
# cpio cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu libedit libffi
# libiconv libidn2 libkrb5 libssh2 libtool libunistring libxml2 m4 ncurses nghttp2
# ninja openbsm openldap openpam openssh openssl patchutils pbzx perl pkg-config
# python3 python3Minimal scons serf sqlite subversion sysctl texinfo unzip which xz
# zlib zstd;
# # Bash must be linked against the system CoreFoundation instead of the open-source one.
# # Otherwise, there will be a dependency cycle: bash -> CF -> icu -> bash (for icu^dev).
# bash = super.bash.overrideAttrs (super: {
# buildInputs = super.buildInputs ++ [ self.darwin.apple_sdk.frameworks.CoreFoundation ];
# });
# darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
# inherit (prevStage.darwin)
# CF binutils-unwrapped cctools configd darwin-stubs launchd libobjc libtapi locale
# objc4 print-reexports rewrite-tbd signingUtils sigtool;
# apple_sdk = superDarwin.apple_sdk // {
# inherit (prevStage.darwin.apple_sdk) sdkRoot;
# };
# });
# llvmPackages = super.llvmPackages // (
# let
# tools = super.llvmPackages.tools.extend (_: _: {
# inherit (prevStage.llvmPackages) clang-unwrapped clangNoCompilerRtWithLibc libclang libllvm llvm;
# });
# libraries = super.llvmPackages.libraries.extend (selfLib: superLib: {
# inherit (prevStage.llvmPackages) compiler-rt libcxx;
# });
# in
# { inherit tools libraries; inherit (prevStage.llvmPackages) release_version; } // tools // libraries
# );
# # Dont link anything in this stage against CF to prevent propagating CF from prior stages to
# # the final stdenv, which happens because of the rpath hook.
# stdenv =
# let
# stdenvNoCF = super.stdenv.override {
# extraBuildInputs = [ ];
# };
# in
# self.overrideCC stdenvNoCF (self.llvmPackages.clangNoCompilerRtWithLibc.override {
# inherit (self.llvmPackages) libcxx;
# });
# };
# extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
# prevStage.updateAutotoolsGnuConfigScriptsHook
# prevStage.gnu-config
# ];
# extraPreHook = ''
# stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
# '';
# })
# # This stage rebuilds CF, compiler-rt, and the sdkRoot derivation.
# #
# # CF requires:
# # - aarch64-darwin: libobjc (due to being apple_sdk.frameworks.CoreFoundation instead of swift-corefoundation)
# # - x86_64-darwin: libiconv libxml2 icu zlib
# (prevStage:
# # previous stage2-Libsystem stdenv:
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
# autoconf automake binutils-unwrapped bison brotli cmake cmakeMinimal coreutils
# cpio cyrus_sasl db ed expat flex gettext gmp gnugrep groff icu libedit libidn2
# libkrb5 libssh2 libtool libunistring m4 nghttp2 ninja openbsm openldap openpam openssh
# openssl patchutils pbzx perl pkg-config.pkg-config python3 python3Minimal scons serf
# sqlite subversion sysctl.provider texinfo unzip which xz zstd
# ]);
# assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [ bash ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
# libffi libiconv libxml2 ncurses zlib zstd
# ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [
# binutils-unwrapped cctools locale libtapi print-reexports rewrite-tbd sigtool
# ]);
# assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ configd ]);
# assert (! useAppleSDKLibs) -> lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ Libsystem ]);
# assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]);
# assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc ]);
# assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd libclosure libdispatch xnu ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.llvmPackages; [
# clang-unwrapped libclang libllvm llvm
# ]);
# assert lib.all isBuiltByNixpkgsCompiler (with prevStage.llvmPackages; [ libcxx ]);
# assert prevStage.llvmPackages.compiler-rt == null;
# assert lib.getVersion prevStage.stdenv.cc.bintools.bintools == lib.getVersion prevStage.darwin.cctools-llvm;
# stageFun prevStage {
# name = "bootstrap-stage2-CF";
# overrides = self: super: {
# inherit (prevStage) ccWrapperStdenv
# autoconf automake bash bison brotli cmake cmakeMinimal coreutils cpio
# cyrus_sasl db ed expat flex gettext gmp gnugrep groff libedit libidn2 libkrb5
# libssh2 libtool libunistring m4 ncurses nghttp2 ninja openbsm openldap openpam
# openssh openssl patchutils pbzx perl pkg-config python3 python3Minimal scons serf
# sqlite subversion sysctl texinfo unzip which xz zstd;
# # Avoid pulling in a full python and its extra dependencies for the llvm/clang builds.
# libxml2 = super.libxml2.override { pythonSupport = false; };
# darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
# inherit (prevStage.darwin)
# Libsystem configd darwin-stubs launchd locale print-reexports rewrite-tbd
# signingUtils sigtool;
# # Rewrap binutils so it uses the rebuilt Libsystem.
# binutils = superDarwin.binutils.override {
# inherit (prevStage) expand-response-params;
# libc = selfDarwin.Libsystem;
# } // {
# passthru = { inherit (prevStage.bintools.passthru) isFromBootstrapFiles; };
# };
# # Avoid building unnecessary Python dependencies due to building LLVM manpages.
# cctools-llvm = superDarwin.cctools-llvm.override { enableManpages = false; };
# });
# llvmPackages = super.llvmPackages // (
# let
# tools = super.llvmPackages.tools.extend (_: _: {
# inherit (prevStage.llvmPackages) clang-unwrapped clangNoCompilerRtWithLibc libclang libllvm llvm;
# clang = prevStage.stdenv.cc;
# });
# libraries = super.llvmPackages.libraries.extend (selfLib: superLib: {
# inherit (prevStage.llvmPackages) libcxx;
# # Make sure compiler-rt is linked against the CF from this stage, which can be
# # propagated to the final stdenv. CF is required by ASAN.
# compiler-rt = superLib.compiler-rt.override ({
# inherit (self.llvmPackages) libllvm;
# stdenv = self.stdenv.override {
# extraBuildInputs = [ self.darwin.CF ];
# };
# });
# });
# in
# { inherit tools libraries; inherit (prevStage.llvmPackages) release_version; } // tools // libraries
# );
# # Dont link anything in this stage against CF to prevent propagating CF from prior stages to
# # the final stdenv, which happens because of the rpath hook. Also dont use a stdenv with
# # compiler-rt because it needs to be built in this stage.
# stdenv =
# let
# stdenvNoCF = super.stdenv.override {
# extraBuildInputs = [ ];
# };
# in
# self.overrideCC stdenvNoCF (self.llvmPackages.clangNoCompilerRtWithLibc.override {
# inherit (self.llvmPackages) libcxx;
# # Make sure the stdenv is using the Libsystem that will be propagated to the final stdenv.
# libc = self.darwin.Libsystem;
# bintools = self.llvmPackages.clangNoCompilerRtWithLibc.bintools.override {
# libc = self.darwin.Libsystem;
# };
# });
# };
# extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
# prevStage.updateAutotoolsGnuConfigScriptsHook
# prevStage.gnu-config
# ];
# extraPreHook = ''
# stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
# '';
# })
# # Rebuild LLVM with LLVM. This stage also rebuilds certain dependencies needed by LLVM.
# #
# # LLVM requires: libcxx libffi libiconv libxml2 ncurses zlib
# (prevStage:
# # previous stage2-CF stdenv:
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
# autoconf automake bison brotli cmake cmakeMinimal coreutils cpio cyrus_sasl
# db ed expat flex gettext gmp gnugrep groff libedit libidn2 libkrb5 libssh2 libtool
# libunistring m4 ncurses nghttp2 ninja openbsm openldap openpam openssh openssl
# patchutils pbzx perl pkg-config.pkg-config python3 python3Minimal scons serf sqlite
# subversion sysctl.provider texinfo unzip which xz zstd
# ]);
# assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [
# bash binutils-unwrapped icu libffi libiconv libxml2 zlib
# ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [
# locale print-reexports rewrite-tbd sigtool
# ]);
# assert lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [
# binutils-unwrapped cctools libtapi
# ]);
# assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ configd ]);
# assert (! useAppleSDKLibs) -> lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ Libsystem ]);
# assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]);
# assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc ]);
# assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd libclosure libdispatch xnu ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.llvmPackages; [
# clang-unwrapped libclang libllvm llvm
# ]);
# assert lib.all isBuiltByNixpkgsCompiler (with prevStage.llvmPackages; [ libcxx ]);
# assert lib.getVersion prevStage.stdenv.cc.bintools.bintools == lib.getVersion prevStage.darwin.cctools-llvm;
# stageFun prevStage {
# name = "bootstrap-stage3";
# overrides = self: super: {
# inherit (prevStage) ccWrapperStdenv
# autoconf automake bash binutils binutils-unwrapped bison brotli cmake cmakeMinimal
# coreutils cpio cyrus_sasl db ed expat flex gettext gmp gnugrep groff libedit
# libidn2 libkrb5 libssh2 libtool libunistring m4 nghttp2 ninja openbsm openldap
# openpam openssh openssl patchutils pbzx perl pkg-config python3 python3Minimal scons
# sed serf sharutils sqlite subversion sysctl texinfo unzip which xz zstd
# # CF dependencies - dont rebuild them.
# icu libiconv libxml2 zlib;
# # Disable tests because they use dejagnu, which fails to run.
# libffi = super.libffi.override { doCheck = false; };
# darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
# inherit (prevStage.darwin)
# CF Libsystem binutils binutils-unwrapped cctools cctools-llvm cctools-port configd
# darwin-stubs dyld launchd libclosure libdispatch libobjc libtapi locale objc4
# postLinkSignHook print-reexports rewrite-tbd signingUtils sigtool;
# apple_sdk = superDarwin.apple_sdk // {
# inherit (prevStage.darwin.apple_sdk) sdkRoot;
# };
# });
# llvmPackages = super.llvmPackages // (
# let
# libraries = super.llvmPackages.libraries.extend (_: _: {
# inherit (prevStage.llvmPackages) compiler-rt libcxx;
# });
# in
# { inherit libraries; } // libraries
# );
# };
# extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
# prevStage.updateAutotoolsGnuConfigScriptsHook
# prevStage.gnu-config
# ];
# extraPreHook = ''
# stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
# '';
# })
# # Construct a standard environment with the new clang. Also use the new compiler to rebuild
# # everything that will be part of the final stdenv and isnt required by it, CF, or Libsystem.
# (prevStage:
# # previous stage3 stdenv:
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
# autoconf automake bison brotli cmake cmakeMinimal coreutils cpio cyrus_sasl
# db ed expat flex gettext gmp gnugrep groff libedit libidn2 libkrb5 libssh2 libtool
# libunistring m4 nghttp2 ninja openbsm openldap openpam openssh openssl patchutils pbzx
# perl pkg-config.pkg-config python3 python3Minimal scons serf sqlite subversion
# sysctl.provider texinfo unzip which xz zstd
# ]);
# assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [
# bash binutils-unwrapped icu libffi libiconv libxml2 zlib
# ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [
# locale print-reexports rewrite-tbd sigtool
# ]);
# assert lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [
# binutils-unwrapped cctools libtapi
# ]);
# assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ configd ]);
# assert (! useAppleSDKLibs) -> lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ Libsystem ]);
# assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]);
# assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc ]);
# assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd libclosure libdispatch xnu ]);
# assert lib.all isBuiltByNixpkgsCompiler (with prevStage.llvmPackages; [
# clang-unwrapped libclang libllvm llvm compiler-rt libcxx
# ]);
# assert lib.getVersion prevStage.stdenv.cc.bintools.bintools == lib.getVersion prevStage.darwin.cctools-llvm;
# stageFun prevStage {
# name = "bootstrap-stage4";
# overrides = self: super: {
# inherit (prevStage) ccWrapperStdenv
# autoconf automake bash bison cmake cmakeMinimal cyrus_sasl db expat flex groff
# libedit libtool m4 ninja openldap openssh patchutils perl pkg-config python3 scons
# serf sqlite subversion sysctl texinfo unzip which
# # CF dependencies - dont rebuild them.
# icu
# # LLVM dependencies - dont rebuild them.
# libffi libiconv libxml2 ncurses zlib;
# darwin = super.darwin.overrideScope (selfDarwin: superDarwin: {
# inherit (prevStage.darwin) dyld CF Libsystem darwin-stubs
# # CF dependencies - dont rebuild them.
# libobjc objc4;
# apple_sdk = superDarwin.apple_sdk // {
# inherit (prevStage.darwin.apple_sdk) sdkRoot;
# };
# signingUtils = superDarwin.signingUtils.override {
# inherit (selfDarwin) sigtool;
# };
# binutils = superDarwin.binutils.override {
# inherit (prevStage) expand-response-params;
# bintools = selfDarwin.binutils-unwrapped;
# libc = selfDarwin.Libsystem;
# };
# # cctools needs to build the LLVM man pages, which requires sphinx. Sphinx
# # has hatch-vcs as a transitive dependency, which pulls in git (and curl).
# # Disabling the tests for hatch-vcs allows the stdenv bootstrap to avoid having
# # any dependency on curl other than the one provided in the bootstrap tools.
# cctools-llvm = superDarwin.cctools-llvm.override (old: {
# llvmPackages =
# let
# tools = old.llvmPackages.tools.extend (_: superTools: {
# llvm-manpages = superTools.llvm-manpages.override {
# python3Packages = prevStage.python3Packages.overrideScope (_: superPython: {
# hatch-vcs = (superPython.hatch-vcs.override {
# git = null;
# pytestCheckHook = null;
# });
# });
# };
# });
# inherit (old.llvmPackages) libraries release_version;
# in
# { inherit tools libraries release_version; } // tools // libraries;
# });
# });
# llvmPackages = super.llvmPackages // (
# let
# tools = super.llvmPackages.tools.extend (_: _: {
# inherit (prevStage.llvmPackages) clang-unwrapped libclang libllvm llvm;
# libcxxClang = lib.makeOverridable (import ../../build-support/cc-wrapper) {
# nativeTools = false;
# nativeLibc = false;
# inherit (prevStage) expand-response-params;
# extraPackages = [
# self.llvmPackages.compiler-rt
# ];
# extraBuildCommands =
# let
# inherit (self.llvmPackages) clang-unwrapped compiler-rt release_version;
# # Clang 16+ uses only the major version in resource-root, but older versions use the complete one.
# clangResourceRootIncludePath = clangLib: clangRelease:
# let
# clangVersion =
# if lib.versionAtLeast clangRelease "16"
# then lib.versions.major clangRelease
# else clangRelease;
# in
# "${clangLib}/lib/clang/${clangVersion}/include";
# in
# ''
# rsrc="$out/resource-root"
# mkdir "$rsrc"
# ln -s "${clangResourceRootIncludePath clang-unwrapped.lib release_version}" "$rsrc"
# ln -s "${compiler-rt.out}/lib" "$rsrc/lib"
# ln -s "${compiler-rt.out}/share" "$rsrc/share"
# echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
# '';
# cc = self.llvmPackages.clang-unwrapped;
# bintools = self.darwin.binutils;
# isClang = true;
# libc = self.darwin.Libsystem;
# inherit (self.llvmPackages) libcxx;
# inherit lib;
# inherit (self) stdenvNoCC coreutils gnugrep runtimeShell;
# };
# });
# libraries = super.llvmPackages.libraries.extend (_: _:{
# inherit (prevStage.llvmPackages) compiler-rt libcxx;
# });
# in
# { inherit tools libraries; } // tools // libraries
# );
# };
# extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
# prevStage.updateAutotoolsGnuConfigScriptsHook
# prevStage.gnu-config
# ];
# extraPreHook = ''
# stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
# '';
# })
# # Construct the final stdenv. The version of LLVM provided should match the one defined in
# # `all-packages.nix` for Darwin. Nothing should depend on the bootstrap tools or originate from
# # the bootstrap tools.
# #
# # When updating the Darwin stdenv, make sure that the result has no dependency (`nix-store -qR`)
# # on `bootstrapTools` or the binutils built in stage 1.
# (prevStage:
# # previous stage4 stdenv:
# assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [
# bash binutils-unwrapped brotli bzip2 cpio diffutils ed file findutils gawk
# gettext gmp gnugrep gnumake gnused gnutar gzip icu libffi libiconv libidn2 libkrb5
# libssh2 libunistring libxml2 libyaml ncurses nghttp2 openbsm openpam openssl patch
# pbzx pcre python3Minimal xar xz zlib zstd
# ]);
# assert lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [
# binutils-unwrapped cctools libtapi locale print-reexports rewrite-tbd sigtool
# ]);
# assert (! useAppleSDKLibs) -> lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ Libsystem configd ]);
# assert (! useAppleSDKLibs) -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF ]);
# assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem libobjc ]);
# assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd libclosure libdispatch xnu ]);
# assert lib.all isBuiltByNixpkgsCompiler (with prevStage.llvmPackages; [
# clang-unwrapped libclang libllvm llvm compiler-rt libcxx
# ]);
# assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [
# autoconf automake bison cmake cmakeMinimal cyrus_sasl db expat flex groff libedit
# libtool m4 ninja openldap openssh patchutils perl pkg-config.pkg-config python3 scons
# serf sqlite subversion sysctl.provider texinfo unzip which
# ]);
# assert prevStage.darwin.cctools == prevStage.darwin.cctools-llvm;
# let
# doSign = localSystem.isAarch64;
# cc = prevStage.llvmPackages.clang;
# in
# {
# inherit config overlays;
# stdenv = import ../generic {
# name = "stdenv-darwin";
# buildPlatform = localSystem;
# hostPlatform = localSystem;
# targetPlatform = localSystem;
# inherit config;
# preHook = ''
# ${commonPreHook}
# stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O
# export PATH_LOCALE=${prevStage.darwin.locale}/share/locale
# '';
# initialPath = ((import ../generic/common-path.nix) { pkgs = prevStage; });
# extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [
# prevStage.updateAutotoolsGnuConfigScriptsHook
# ] ++ [ prevStage.darwin.apple_sdk.sdkRoot ];
# extraBuildInputs = [ prevStage.darwin.CF ];
# inherit cc;
# shell = cc.shell;
# inherit (prevStage.stdenv) fetchurlBoot;
# extraAttrs = {
# inherit bootstrapTools;
# libc = prevStage.darwin.Libsystem;
# shellPackage = prevStage.bash;
# } // 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 (prevStage.darwin) objc4;
# };
# disallowedRequisites = [ bootstrapTools.out ];
# allowedRequisites = (with prevStage; [
# bash
# binutils.bintools
# binutils.bintools.lib
# bzip2.bin
# bzip2.out
# cc.expand-response-params
# coreutils
# darwin.binutils
# darwin.binutils.bintools
# diffutils
# ed
# file
# findutils
# gawk
# gettext
# gmp.out
# gnugrep
# gnugrep.pcre2.out
# gnumake
# gnused
# gnutar
# gzip
# icu.out
# libffi.out
# libiconv
# libunistring.out
# libxml2.out
# ncurses.dev
# ncurses.man
# ncurses.out
# openbsm
# openpam
# patch
# xz.bin
# xz.out
# zlib.dev
# zlib.out
# ]
# ++ lib.optionals doSign [ openssl.out ])
# ++ lib.optionals localSystem.isAarch64 [
# prevStage.updateAutotoolsGnuConfigScriptsHook
# prevStage.gnu-config
# ]
# ++ (with prevStage.llvmPackages; [
# bintools-unwrapped
# clang-unwrapped
# clang-unwrapped.lib
# compiler-rt
# compiler-rt.dev
# libcxx
# libcxx.dev
# lld
# llvm
# llvm.lib
# ])
# ++ (with prevStage.darwin; [
# CF
# Libsystem
# cctools-llvm
# cctools-port
# dyld
# libtapi
# locale
# apple_sdk.sdkRoot
# ]
# ++ lib.optional useAppleSDKLibs [ objc4 ]
# ++ lib.optionals doSign [ postLinkSignHook sigtool signingUtils ]);
# __stdenvImpureHostDeps = commonImpureHostDeps;
# __extraImpureHostDeps = commonImpureHostDeps;
# overrides = self: super: {
# inherit (prevStage)
# bash binutils brotli bzip2 coreutils cpio diffutils ed file findutils gawk
# gettext gmp gnugrep gnumake gnused gnutar gzip icu libffi libiconv libidn2 libssh2
# libunistring libxml2 libyaml ncurses nghttp2 openbsm openpam openssl patch pbzx
# pcre python3Minimal xar xz zlib zstd;
# darwin = super.darwin.overrideScope (_: superDarwin: {
# inherit (prevStage.darwin)
# CF ICU Libsystem darwin-stubs dyld locale libobjc libtapi rewrite-tbd xnu;
# apple_sdk = superDarwin.apple_sdk // {
# inherit (prevStage.darwin.apple_sdk) sdkRoot;
# };
# } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
# inherit (prevStage.darwin) binutils binutils-unwrapped cctools-llvm cctools-port;
# });
# } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
# inherit (prevStage.llvmPackages) clang llvm;
# # Need to get rid of these when cross-compiling.
# llvmPackages = super.llvmPackages // (
# let
# tools = super.llvmPackages.tools.extend (_: _: {
# inherit (prevStage.llvmPackages) clang clang-unwrapped libclang libllvm llvm;
# });
# libraries = super.llvmPackages.libraries.extend (_: _: {
# inherit (prevStage.llvmPackages) compiler-rt libcxx;
# });
# in
# { inherit tools libraries; } // tools // libraries
# );
# inherit (prevStage) binutils binutils-unwrapped;
# };
# };
# })
# # This "no-op" stage is just a place to put the assertions about stage6.
# (prevStage:
# # previous final stage stdenv:
# assert isBuiltByNixpkgsCompiler prevStage.darwin.sigtool;
# assert isBuiltByNixpkgsCompiler prevStage.darwin.binutils-unwrapped;
# assert isBuiltByNixpkgsCompiler prevStage.darwin.print-reexports;
# assert isBuiltByNixpkgsCompiler prevStage.darwin.rewrite-tbd;
# assert isBuiltByNixpkgsCompiler prevStage.darwin.cctools;
# assert isFromNixpkgs prevStage.darwin.CF;
# assert isFromNixpkgs prevStage.darwin.Libsystem;
# assert isBuiltByNixpkgsCompiler prevStage.llvmPackages.clang-unwrapped;
# assert isBuiltByNixpkgsCompiler prevStage.llvmPackages.libllvm;
# assert isBuiltByNixpkgsCompiler prevStage.llvmPackages.libcxx;
# assert isBuiltByNixpkgsCompiler prevStage.llvmPackages.compiler-rt;
# { inherit (prevStage) config overlays stdenv; })
# ]