diff --git a/pkgs/development/tools/misc/indent/default.nix b/pkgs/development/tools/misc/indent/default.nix index 1e5aebb76f838..a94a907c1024e 100644 --- a/pkgs/development/tools/misc/indent/default.nix +++ b/pkgs/development/tools/misc/indent/default.nix @@ -16,8 +16,10 @@ stdenv.mkDerivation rec { nativeBuildInputs = [ texinfo ]; pkgsBuildBuild = [ buildPackages.stdenv.cc ]; # needed when cross-compiling - env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang - "-Wno-implicit-function-declaration"; + env.NIX_CFLAGS_COMPILE = toString ( + lib.optional stdenv.cc.isClang "-Wno-implicit-function-declaration" + ++ lib.optional (stdenv.cc.isClang && lib.versionAtLeast (lib.getVersion stdenv.cc) "13") "-Wno-unused-but-set-variable" + ); hardeningDisable = [ "format" ]; diff --git a/pkgs/development/tools/misc/pkg-config/default.nix b/pkgs/development/tools/misc/pkg-config/default.nix index d4feca6dfe6e5..b883dab6cc143 100644 --- a/pkgs/development/tools/misc/pkg-config/default.nix +++ b/pkgs/development/tools/misc/pkg-config/default.nix @@ -35,6 +35,9 @@ stdenv.mkDerivation rec { "ac_cv_func_posix_getgrgid_r=yes" ]; + # Silence "incompatible integer to pointer conversion passing 'gsize'" when building with Clang. + env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang "-Wno-int-conversion"; + enableParallelBuilding = true; doCheck = true; diff --git a/pkgs/os-specific/darwin/apple-sdk-11.0/default.nix b/pkgs/os-specific/darwin/apple-sdk-11.0/default.nix index 2576d8bcafb7f..7f7aaa3cb2ec9 100644 --- a/pkgs/os-specific/darwin/apple-sdk-11.0/default.nix +++ b/pkgs/os-specific/darwin/apple-sdk-11.0/default.nix @@ -61,7 +61,9 @@ let mkStdenv = stdenv: if stdenv.isAarch64 then stdenv else + (overrideCC stdenv (mkCc stdenv.cc)).override { + extraBuildInputs = [ pkgs.darwin.apple_sdk_11_0.frameworks.CoreFoundation ]; targetPlatform = stdenv.targetPlatform // { darwinMinVersion = "10.12"; darwinSdkVersion = "11.0"; diff --git a/pkgs/os-specific/darwin/apple-sdk/default.nix b/pkgs/os-specific/darwin/apple-sdk/default.nix index 5cf37e8f4026e..8b2246ff009ae 100644 --- a/pkgs/os-specific/darwin/apple-sdk/default.nix +++ b/pkgs/os-specific/darwin/apple-sdk/default.nix @@ -1,4 +1,4 @@ -{ stdenv, fetchurl, xar, cpio, pkgs, python3, pbzx, lib, darwin-stubs, print-reexports }: +{ stdenv, fetchurl, xar, cpio, pkgs, python3Minimal, pbzx, lib, darwin-stubs, print-reexports }: let # sadly needs to be exported because security_tool needs it @@ -16,7 +16,7 @@ let sha256 = "13xq34sb7383b37hwy076gnhf96prpk1b4087p87xnwswxbrisih"; }; - nativeBuildInputs = [ xar cpio python3 pbzx ]; + nativeBuildInputs = [ xar cpio python3Minimal pbzx ]; outputs = [ "out" "dev" "man" ]; diff --git a/pkgs/os-specific/darwin/apple-source-releases/configd/default.nix b/pkgs/os-specific/darwin/apple-source-releases/configd/default.nix index 37830c0665e12..d17db5a345a89 100644 --- a/pkgs/os-specific/darwin/apple-source-releases/configd/default.nix +++ b/pkgs/os-specific/darwin/apple-source-releases/configd/default.nix @@ -1,67 +1,32 @@ -{ lib, stdenv, appleDerivation', launchd, bootstrap_cmds, xnu, ppp, IOKit, eap8021x, Security +{ lib, stdenv, appleDerivation', launchd, bootstrap_cmds, xnu, xpc, ppp, IOKit, eap8021x, Security , headersOnly ? false }: appleDerivation' stdenv { meta.broken = stdenv.cc.nativeLibc; nativeBuildInputs = lib.optionals (!headersOnly) [ bootstrap_cmds ]; - buildInputs = lib.optionals (!headersOnly) [ launchd ppp IOKit eap8021x ]; + buildInputs = lib.optionals (!headersOnly) [ launchd ppp xpc IOKit eap8021x ]; propagatedBuildInputs = lib.optionals (!headersOnly) [ Security ]; - patchPhase = lib.optionalString (!headersOnly) '' - HACK=$PWD/hack - mkdir $HACK - cp -r ${xnu}/Library/Frameworks/System.framework/Versions/B/PrivateHeaders/net $HACK - + env = lib.optionalAttrs (!headersOnly) { + NIX_CFLAGS_COMPILE = toString [ + "-ISystemConfiguration.framework/Headers" + "-I${xnu}/Library/Frameworks/System.framework/Versions/B/PrivateHeaders" + ]; + }; - substituteInPlace SystemConfiguration.fproj/SCNetworkReachabilityInternal.h \ - --replace '#include ' "" + patchPhase = lib.optionalString (!headersOnly) '' + substituteInPlace SystemConfiguration.fproj/reachability/SCNetworkReachabilityServer_client.c \ + --replace '#include ' "" substituteInPlace SystemConfiguration.fproj/SCNetworkReachability.c \ --replace ''$'#define\tHAVE_VPN_STATUS' "" - substituteInPlace SystemConfiguration.fproj/reachability/SCNetworkReachabilityServer_client.c \ - --replace '#include ' '#include "fake_xpc.h"' \ - --replace '#include ' "" \ - # Our neutered CoreFoundation doesn't have this function, but I think we'll live... substituteInPlace SystemConfiguration.fproj/SCNetworkConnectionPrivate.c \ --replace 'CFPreferencesAppValueIsForced(serviceID, USER_PREFERENCES_APPLICATION_ID)' 'FALSE' \ --replace 'CFPreferencesAppValueIsForced(userPrivate->serviceID, USER_PREFERENCES_APPLICATION_ID)' 'FALSE' - - cat >SystemConfiguration.fproj/fake_xpc.h <> $out/nix-support/cc-cflags - ''; + let + cc = if prevStage.llvmPackages.clang-unwrapped == null + then null else + lib.makeOverridable (import ../../build-support/cc-wrapper) { + name = "${name}-clang-wrapper"; - mkCC = overrides: import ../../build-support/cc-wrapper ( - let args = { - inherit lib shell; - inherit (last) stdenvNoCC; + nativeTools = false; + nativeLibc = false; - nativeTools = false; - nativeLibc = false; - inherit buildPackages libcxx; - inherit (last.pkgs) coreutils gnugrep; - bintools = last.pkgs.darwin.binutils; - libc = last.pkgs.darwin.Libsystem; - isClang = true; - cc = last.pkgs."${finalLlvmPackages}".clang-unwrapped; - }; in args // (overrides args) - ); + buildPackages = lib.optionalAttrs (prevStage ? stdenv) { + inherit (prevStage) stdenv; + }; - cc = if last == null then "/dev/null" else - mkCC ({ cc, ... }: { extraPackages = [ - last.pkgs."${finalLlvmPackages}".libcxxabi - last.pkgs."${finalLlvmPackages}".compiler-rt + prevStage.llvmPackages.libcxxabi + prevStage.llvmPackages.compiler-rt ]; - extraBuildCommands = mkExtraBuildCommands cc; - }); - ccNoLibcxx = if last == null then "/dev/null" else - mkCC ({ cc, ... }: { - libcxx = null; - extraPackages = [ - last.pkgs."${finalLlvmPackages}".compiler-rt - ]; - extraBuildCommands = '' - echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags - echo "-B${last.pkgs."${finalLlvmPackages}".compiler-rt}/lib" >> $out/nix-support/cc-cflags - echo "-nostdlib++" >> $out/nix-support/cc-cflags - '' + mkExtraBuildCommands cc; - }); + extraBuildCommands = + let + inherit (prevStage.llvmPackages) clang-unwrapped compiler-rt release_version; + in + '' + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "${clang-unwrapped.lib}/lib/clang"/${release_version}/include "$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 + ''; - thisStdenv = import ../generic { - name = "${name}-stdenv-darwin"; + cc = prevStage.llvmPackages.clang-unwrapped; + bintools = prevStage.darwin.binutils; - inherit config shell extraBuildInputs; + isClang = true; + libc = prevStage.darwin.Libsystem; + inherit (prevStage.llvmPackages) libcxx; - extraNativeBuildInputs = extraNativeBuildInputs ++ lib.optionals doUpdateAutoTools [ - last.pkgs.updateAutotoolsGnuConfigScriptsHook - last.pkgs.gnu-config - ]; + inherit lib; + inherit (prevStage) coreutils gnugrep; - allowedRequisites = if allowedRequisites == null then null else allowedRequisites ++ [ - cc.expand-response-params - cc.bintools - ] ++ lib.optionals doUpdateAutoTools [ - last.pkgs.updateAutotoolsGnuConfigScriptsHook - last.pkgs.gnu-config - ] ++ lib.optionals doSign [ - last.pkgs.darwin.postLinkSignHook - last.pkgs.darwin.sigtool - last.pkgs.darwin.signingUtils - ]; + stdenvNoCC = prevStage.ccWrapperStdenv; + }; + + thisStdenv = import ../generic { + name = "${name}-stdenv-darwin"; buildPlatform = localSystem; hostPlatform = localSystem; targetPlatform = localSystem; - inherit cc; + inherit config extraNativeBuildInputs; - 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} - ''; + extraBuildInputs = [ prevStage.darwin.CF ]; + + preHook = + '' + # 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 = "${bootstrapTools}/bin/bash"; initialPath = [ bootstrapTools ]; fetchurlBoot = import ../../build-support/fetchurl { inherit lib; - stdenvNoCC = stage0.stdenv; + 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; overrides = self: super: (overrides self super) // { - inherit ccNoLibcxx; fetchurl = thisStdenv.fetchurlBoot; }; }; @@ -205,94 +174,117 @@ rec { 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 = { + binutils = null; + binutils-unwrapped = null; + cctools = null; + print-reexports = null; + rewrite-tbd = null; + sigtool = null; + CF = null; + Libsystem = null; + }; - stage0 = stageFun 0 null { - 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"; + llvmPackages = { + clang-unwrapped = null; + libllvm = null; + libcxx = null; + libcxxabi = 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; + + coreutils = bootstrapTools; + gnugrep = bootstrapTools; + + pbzx = bootstrapTools; + cpio = self.stdenv.mkDerivation { + name = "bootstrap-stage0-cpio"; buildCommand = '' - mkdir -p $out - ln -s ${bootstrapTools}/bin $out/bin + mkdir -p $out/bin + ln -s ${bootstrapFiles.cpio} $out/bin/cpio ''; + passthru.isFromBootstrapFiles = true; }; - pbzx = self.runCommandLocal "bootstrap-stage0-pbzx" { } '' - mkdir -p $out/bin - ln -s ${bootstrapTools}/bin/pbzx $out/bin - ''; - - cpio = self.runCommandLocal "bootstrap-stage0-cpio" { } '' - mkdir -p $out/bin - ln -s ${bootstrapFiles.cpio} $out/bin/cpio - ''; + darwin = super.darwin.overrideScope (selfDarwin: _: { + binutils-unwrapped = bootstrapTools // { + version = "boot"; + }; - darwin = super.darwin.overrideScope (selfDarwin: superDarwin: { - darwin-stubs = superDarwin.darwin-stubs.override { inherit (self) stdenvNoCC fetchurl; }; + binutils = (import ../../build-support/bintools-wrapper) { + name = "bootstrap-stage0-binutils-wrapper"; - dyld = { - name = "bootstrap-stage0-dyld"; - buildCommand = '' - mkdir -p $out - ln -s ${bootstrapTools}/lib $out/lib - ln -s ${bootstrapTools}/include $out/include - ''; - }; + nativeTools = false; + nativeLibc = false; - sigtool = self.runCommandLocal "bootstrap-stage0-sigtool" { } '' - mkdir -p $out/bin - ln -s ${bootstrapTools}/bin/sigtool $out/bin - ln -s ${bootstrapTools}/bin/codesign $out/bin - ''; + buildPackages = { }; + libc = selfDarwin.Libsystem; - print-reexports = self.runCommandLocal "bootstrap-stage0-print-reexports" { } '' - mkdir -p $out/bin - ln -s ${bootstrapTools}/bin/print-reexports $out/bin - ''; + inherit lib; + inherit (self) stdenvNoCC coreutils gnugrep; - rewrite-tbd = self.runCommandLocal "bootstrap-stage0-rewrite-tbd" { } '' - mkdir -p $out/bin - ln -s ${bootstrapTools}/bin/rewrite-tbd $out/bin - ''; + bintools = selfDarwin.binutils-unwrapped; - binutils-unwrapped = bootstrapTools // { - name = "bootstrap-stage0-binutils"; + inherit (selfDarwin) postLinkSignHook signingUtils; }; cctools = bootstrapTools // { - name = "bootstrap-stage0-cctools"; targetPrefix = ""; + version = "boot"; + man = bootstrapTools; }; - 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; + 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) { - CF = stdenv.mkDerivation { + CF = self.stdenv.mkDerivation { name = "bootstrap-stage0-CF"; buildCommand = '' mkdir -p $out/Library/Frameworks ln -s ${bootstrapTools}/Library/Frameworks/CoreFoundation.framework $out/Library/Frameworks ''; + passthru.isFromBootstrapFiles = true; }; - Libsystem = stdenv.mkDerivation { + Libsystem = self.stdenv.mkDerivation { name = "bootstrap-stage0-Libsystem"; buildCommand = '' mkdir -p $out @@ -314,405 +306,786 @@ rec { ln -s ${bootstrapTools}/include-Libsystem $out/include ''; + passthru.isFromBootstrapFiles = true; }; }); - "${finalLlvmPackages}" = { - clang-unwrapped = stdenv.mkDerivation { - name = "bootstrap-stage0-clang"; - 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 - ''; - }; + 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; + }; + 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; + cxxabi = self.llvmPackages.libcxxabi; + isFromBootstrapFiles = true; + }; + }; + libcxxabi = self.stdenv.mkDerivation { + name = "bootstrap-stage0-libcxxabi"; + buildCommand = '' + mkdir -p $out/lib + ln -s ${bootstrapTools}/lib/libc++abi.dylib $out/lib + ''; + passthru = { + libName = "c++abi"; + 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 + # Define `release_version` as a `*`, so it’s interpreted as a glob. This is necessary + # because the version of clang in the bootstrap tools is not known ahead of time. This + # should be safe because the bootstrap tools should never contain multiple clangs. + { inherit tools libraries; release_version = "*"; } // tools // libraries + ); + }; - libcxx = stdenv.mkDerivation { - name = "bootstrap-stage0-libcxx"; - 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; - }; - }; + # 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" + ''; + }) - 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"; - }; - }; + # 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; [ coreutils cpio gnugrep pbzx ]); - 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 - ''; - }; - }; - }; + assert lib.all isFromBootstrapFiles (with prevStage.darwin; [ + binutils-unwrapped cctools print-reexports rewrite-tbd sigtool + ]); - extraNativeBuildInputs = [ ]; - extraBuildInputs = [ ]; - libcxx = null; - }; + assert (! useAppleSDKLibs) -> lib.all isFromBootstrapFiles (with prevStage.darwin; [ CF Libsystem ]); + assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF Libsystem ]); + assert lib.all isFromNixpkgs (with prevStage.darwin; [ dyld launchd xnu ]); - stage1 = prevStage: - let - persistent = self: super: with prevStage; { - cmake = super.cmakeMinimal; + assert lib.all isFromBootstrapFiles (with prevStage.llvmPackages; [ + clang-unwrapped libclang libllvm llvm compiler-rt libcxx libcxxabi + ]); - curl = super.curlMinimal; + stageFun prevStage { + name = "bootstrap-stage1"; - inherit pbzx cpio; + overrides = self: super: { + inherit (prevStage) ccWrapperStdenv + coreutils gnugrep; - python3 = super.python3Minimal; + cmake = super.cmakeMinimal; - ninja = super.ninja.override { buildDocs = false; }; + curl = super.curlMinimal; - "${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 - ); + libffi = super.libffi.override { doCheck = false; }; - darwin = super.darwin.overrideScope (selfDarwin: _: { - inherit (darwin) rewrite-tbd binutils-unwrapped; + # Avoid pulling in a full python and its extra dependencies for the llvm/clang builds. + libxml2 = super.libxml2.override { pythonSupport = false; }; - signingUtils = darwin.signingUtils.override { - inherit (selfDarwin) sigtool; - }; + ninja = super.ninja.override { buildDocs = false; }; - binutils = darwin.binutils.override { - coreutils = self.coreutils; - libc = selfDarwin.Libsystem; - inherit (selfDarwin) postLinkSignHook signingUtils; - }; - }); - }; - in - with prevStage; stageFun 1 prevStage { - extraPreHook = "export NIX_CFLAGS_COMPILE+=\" -F${bootstrapTools}/Library/Frameworks\""; - extraNativeBuildInputs = [ ]; - extraBuildInputs = [ 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; + python3 = super.python3Minimal; + + darwin = super.darwin.overrideScope (selfDarwin: superDarwin: { + signingUtils = prevStage.darwin.signingUtils.override { + inherit (selfDarwin) sigtool; + }; + + binutils = superDarwin.binutils.override { + inherit (self) coreutils; + inherit (selfDarwin) postLinkSignHook signingUtils; + + bintools = selfDarwin.binutils-unwrapped; + libc = selfDarwin.Libsystem; + }; + + 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 libcxxabi; + }); + in + { inherit tools libraries; inherit (prevStage.llvmPackages) release_version; } // tools // libraries + ); }; - 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; - - "${finalLlvmPackages}" = super."${finalLlvmPackages}" // ( - let - tools = super."${finalLlvmPackages}".tools.extend (_: _: { - inherit (pkgs."${finalLlvmPackages}") clang-unwrapped; + 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" + ''; + }) + + # Build sysctl and Python for use by LLVM’s check phase. These must be built in their own stage, + # or an infinite recursion results on x86_64-darwin when using the source-based SDK. + (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 curl cyrus_sasl db + ed expat flex gettext gmp groff libedit libffi libiconv libidn2 libkrb5 libssh2 + libtool libunistring libxml2 m4 ncurses nghttp2 ninja openldap openssh openssl + patchutils pbzx perl pkg-config.pkg-config python3 scons serf sqlite subversion + sysctl.provider unzip which xz zlib zstd + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ + binutils-unwrapped cctools libiconv locale libtapi print-reexports rewrite-tbd sigtool + ]); + + assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ CF Libsystem ICU ]); + 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 libcxxabi + ]); + + 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 cpio coreutils + curl cyrus_sasl db ed expat flex gettext gmp gnugrep groff libedit libffi libiconv + libidn2 libkrb5 libssh2 libtool libunistring libxml2 m4 ncurses nghttp2 ninja + openldap openssh openssl patchutils pbzx perl pkg-config scons sed serf sharutils + sqlite subversion 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 Libsystem ICU configd binutils-unwrapped cctools cctools-port darwin-stubs dyld + launchd libclosure libdispatch libobjc objc4 locale postLinkSignHook + print-reexports rewrite-tbd signingUtils sigtool; + }); + + 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 libcxxabi; + }); + 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 curl cyrus_sasl db + ed expat flex gettext gmp groff libedit libffi libiconv libidn2 libkrb5 libssh2 + libtool libunistring libxml2 m4 ncurses nghttp2 ninja openldap openssh openssl + patchutils pbzx perl pkg-config.pkg-config python3 scons serf sqlite subversion + sysctl.provider unzip which xz zlib zstd + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ + binutils-unwrapped cctools libiconv locale libtapi print-reexports rewrite-tbd sigtool + ]); + + assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ CF Libsystem ICU ]); + 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 libcxxabi + ]); + + 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 cpio curl + cyrus_sasl db ed expat flex gettext gmp groff libedit libffi libiconv libidn2 + libkrb5 libssh2 libtool libunistring libxml2 m4 ncurses nghttp2 ninja openldap + openssh openssl patchutils pbzx perl pkg-config python3 scons sed serf sharutils + sqlite subversion sysctl unzip which xz zlib zstd; + + llvmPackages = super.llvmPackages // ( + let + llvmMajor = lib.versions.major super.llvmPackages.release_version; + + libraries = super.llvmPackages.libraries.extend (selfLib: superLib: { + compiler-rt = superLib.compiler-rt.override ({ + inherit (selfLib) libcxxabi; + stdenv = self.overrideCC self.stdenv (self.llvmPackages.clangNoCompilerRtWithLibc.override { + inherit (selfLib) libcxx; + }); }); - 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 ]) { - # TODO: the bootstrapping of llvm packages isn't consistent. - # `standalone` may be redundant if darwin behaves like useLLVM (or - # has useLLVM = true). - standalone = true; + libcxx = superLib.libcxx.override ({ + inherit (selfLib) libcxxabi; + stdenv = self.overrideCC self.stdenv (self.llvmPackages.clangNoCompilerRtWithLibc.override { + nixSupport.cc-cflags = [ "-nostdlib" ]; + nixSupport.cc-ldflags = [ "-lSystem" ]; }); }); - in - { inherit tools libraries; } // tools // libraries - ); + libcxxabi = superLib.libcxxabi.override ({ + stdenv = self.overrideCC self.stdenv self.llvmPackages.clangNoCompilerRtWithLibc; + } // lib.optionalAttrs (builtins.any (v: llvmMajor == v) [ 7 11 12 13 ]) { + # 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 libraries; } // libraries + ); - darwin = super.darwin.overrideScope (_: _: { - inherit (darwin) - binutils dyld Libsystem xnu configd ICU libdispatch libclosure - launchd CF objc4 darwin-stubs sigtool postLinkSignHook signingUtils; - }); - }; - in - with prevStage; stageFun 2 prevStage { - extraPreHook = '' - export PATH_LOCALE=${pkgs.darwin.locale}/share/locale - ''; + # Switch from cctools-port to cctools-llvm now that LLVM has been built. + darwin = super.darwin.overrideScope (_: _: { + inherit (prevStage.darwin) + CF Libsystem ICU configd darwin-stubs dyld launchd + libclosure libdispatch libobjc objc4 locale postLinkSignHook print-reexports rewrite-tbd + signingUtils sigtool; + }); + }; - 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 - gnugrep.pcre2.out - gmp - libiconv - brotli.lib - file - ] ++ 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; + 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 using the new compiler. + (prevStage: + # previous stage1 stdenv: + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + autoconf automake bash binutils-unwrapped bison cmake coreutils cpio cyrus_sasl db ed + expat flex gettext gmp gnugrep groff libedit libtool m4 ninja openldap openssh + patchutils pbzx perl pkg-config.pkg-config python3 scons serf sqlite subversion + sysctl.provider unzip which xz + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + ncurses libffi libiconv libxml2 zlib + brotli curl libidn2 libiconv libkrb5 libssh2 libunistring 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; [ CF Libsystem ICU ]); + 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; [ compiler-rt libcxx libcxxabi ]); + + assert lib.getVersion prevStage.stdenv.cc.bintools.bintools == lib.getVersion prevStage.darwin.cctools-port; + + stageFun prevStage { + + name = "bootstrap-stage2"; + + overrides = self: super: { + inherit (prevStage) ccWrapperStdenv + autoconf automake bash bison cmake coreutils cpio cyrus_sasl db ed expat flex + gettext gnugrep gmp groff libedit libtool m4 ninja openldap openssh patchutils pbzx + perl pkg-config python3 scons serf sqlite subversion sysctl unzip which xz + ncurses libffi libiconv libxml2 zlib + brotli curl libidn2 libkrb5 libssh2 libunistring nghttp2 openssl zstd; + + darwin = super.darwin.overrideScope (selfDarwin: superDarwin: { + inherit (prevStage.darwin) CF ICU darwin-stubs launchd libiconv libobjc objc4 locale + print-reexports rewrite-tbd sigtool signingUtils; + + # Rewrap binutils so it uses the rebuilt Libsystem. + binutils = superDarwin.binutils.override { + buildPackages = { + inherit (prevStage) stdenv; + }; + libc = selfDarwin.Libsystem; + } // { + passthru = { inherit (prevStage.bintools.passthru) isFromBootstrapFiles; }; + }; + }); + + 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 libcxxabi; + }); + in + { inherit tools libraries; inherit (prevStage.llvmPackages) release_version; } // tools // libraries + ); }; - 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 - ); + 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. + (prevStage: + # previous stage2 stdenv: + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + autoconf automake bash bison cmake coreutils cpio cyrus_sasl db ed expat flex gettext + gmp gnugrep groff libedit libtool m4 ninja openldap openssh patchutils pbzx perl + pkg-config.pkg-config python3 scons serf sqlite subversion sysctl.provider unzip which xz + ncurses libffi libiconv libxml2 zlib + brotli curl libidn2 libiconv libkrb5 libssh2 libunistring nghttp2 openssl zlib zstd + ]); + assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [ + binutils-unwrapped + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ + locale print-reexports rewrite-tbd sigtool libiconv + ]); + assert lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ + binutils-unwrapped cctools libtapi + ]); + + assert (! useAppleSDKLibs) -> lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ CF ICU ]); + assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ CF libobjc ]); + + assert (! useAppleSDKLibs) -> lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ Libsystem ]); + assert useAppleSDKLibs -> lib.all isFromNixpkgs (with prevStage.darwin; [ Libsystem ]); + 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 libcxxabi ]); + + 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 cmake coreutils cpio + cyrus_sasl db ed expat flex gettext gmp gnugrep groff libedit libtool m4 ninja + openldap openssh patchutils pbzx perl pkg-config python3 scons sed serf sharutils + sqlite subversion sysctl unzip which xz; + + # Rebuild the following dependencies along with LLVM, so it can link against them. + # ncurses libffi libiconv libxml2 zlib + + # CF requires the following dependencies, which should be rebuilt along with it. CF is built + # in this stage instead of along with libSystem because curl depends on libSystem. + # brotli curl libidn2 libkrb5 libssh2 libunistring nghttp2 openssl zstd ICU + + 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; }; - darwin = super.darwin.overrideScope (_: _: { - inherit (darwin) - dyld Libsystem xnu configd libdispatch libclosure launchd libiconv - locale darwin-stubs sigtool; - }); - }; - 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 - ''; + darwin = super.darwin.overrideScope (selfDarwin: superDarwin: { + inherit (prevStage.darwin) + Libsystem binutils binutils-unwrapped cctools cctools-llvm cctools-port + configd darwin-stubs dyld launchd libclosure libdispatch libtapi locale + postLinkSignHook print-reexports rewrite-tbd signingUtils sigtool; + + # CF on noon-source SDKs is CoreFoundation from `apple_sdk.frameworks`. It requires + # libobjc. Rebuild them both together. + # libobjc + }); - allowedRequisites = - [ bootstrapTools ] ++ - (with pkgs; [ - xz.bin - xz.out - bash - zlib - libxml2.out - curl.out - openssl.out - libssh2.out - nghttp2.lib - coreutils - gnugrep - gnugrep.pcre2.out - gmp - libiconv - brotli.lib - file - ] ++ 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; + llvmPackages = super.llvmPackages // ( + let + libraries = super.llvmPackages.libraries.extend (_: _: { + inherit (prevStage.llvmPackages) compiler-rt libcxx libcxxabi; + }); + in + { inherit libraries; } // libraries + ); }; - stage4 = prevStage: - let - persistent = self: super: with prevStage; { - inherit - gnumake gzip gnused bzip2 ed xz patch bash python3 - ncurses libffi zlib gmp gnugrep cmake - coreutils findutils diffutils patchutils ninja libxml2; - inherit (gnugrep) pcre2; - - # Hack to make sure we don't link ncurses in bootstrap tools. The proper - # solution is to avoid passing -L/nix-store/...-bootstrap-tools/lib, - # quite a sledgehammer just to get the C runtime. - gettext = super.gettext.overrideAttrs (drv: { - configureFlags = drv.configureFlags ++ [ - "--disable-curses" - ]; - }); + extraNativeBuildInputs = 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. + (prevStage: + # previous stage3 stdenv: + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + autoconf automake bash bison cmake cpio coreutils cyrus_sasl db ed expat flex gettext + gmp gnugrep groff libedit libtool m4 ninja openldap openssh patchutils pbzx perl + pkg-config.pkg-config python3 scons serf sqlite subversion sysctl.provider unzip which xz + ]); + + assert lib.all isBuiltByNixpkgsCompiler (with prevStage; [ + binutils-unwrapped curl ncurses libffi libiconv libxml2 zlib + brotli curl libidn2 libiconv libkrb5 libssh2 libunistring nghttp2 openssl zlib zstd + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage.darwin; [ + locale print-reexports rewrite-tbd sigtool + ]); + assert lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ + binutils-unwrapped cctools libiconv libtapi + ]); + + assert (! useAppleSDKLibs) -> lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ CF Libsystem ICU ]); + 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 libcxxabi + ]); + + 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 bison cmake cpio cyrus_sasl db expat flex groff libedit libtool m4 + ninja openldap openssh patchutils pbzx perl pkg-config python3 scons serf sqlite + subversion sysctl unzip which + + # These were built in an earlier stage to build LLVM and CF. Don’t rebuild them. + ncurses libffi libiconv libxml2 zlib + brotli curl libidn2 libkrb5 libssh2 libunistring nghttp2 openssl zstd; - "${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 (selfDarwin: superDarwin: { + inherit (prevStage.darwin) dyld CF ICU Libsystem darwin-stubs libiconv + # libobjc is required by CoreFoundation on aarch64-darwin. Don’t rebuild it. + libobjc objc4; - darwin = super.darwin.overrideScope (_: superDarwin: { - inherit (darwin) dyld Libsystem libiconv locale darwin-stubs; + signingUtils = superDarwin.signingUtils.override { + inherit (selfDarwin) sigtool; + }; + + binutils = superDarwin.binutils.override { + shell = self.bash + "/bin/bash"; - # See useAppleSDKLibs in darwin-packages.nix - CF = if useAppleSDKLibs then super.darwin.CF else - superDarwin.CF.override { - inherit libxml2; - python3 = prevStage.python3; + buildPackages = { + inherit (prevStage) stdenv; }; - }); - }; - 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; + + bintools = selfDarwin.binutils-unwrapped; + libc = selfDarwin.Libsystem; + }; + }); + + 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; + + buildPackages = { + inherit (prevStage) stdenv; + }; + + extraPackages = [ + self.llvmPackages.libcxxabi + self.llvmPackages.compiler-rt + ]; + + extraBuildCommands = + let + inherit (self.llvmPackages) clang-unwrapped compiler-rt release_version; + in + '' + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "${clang-unwrapped.lib}/lib/clang/${release_version}/include" "$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; + + shell = self.bash + "/bin/bash"; + }; + }); + libraries = super.llvmPackages.libraries.extend (_: _:{ + inherit (prevStage.llvmPackages) compiler-rt libcxx libcxxabi; + }); + in + { inherit tools libraries; } // tools // libraries + ); }; - stdenvDarwin = prevStage: + 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 curl diffutils ed file findutils gawk gettext gmp + gnugrep gnumake gnused gnutar gzip libffi libiconv libidn2 libkrb5 libssh2 libunistring libxml2 + ncurses nghttp2 openssl patch pcre xz zlib zstd + ]); + + assert lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ + binutils-unwrapped cctools libiconv locale + libtapi print-reexports rewrite-tbd sigtool + ]); + + assert (! useAppleSDKLibs) -> lib.all isBuiltByNixpkgsCompiler (with prevStage.darwin; [ CF Libsystem ICU libobjc ]); + 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 libcxxabi + ]); + + assert lib.all isBuiltByBootstrapFilesCompiler (with prevStage; [ + autoconf automake bison cmake cpio cyrus_sasl db expat flex groff libedit libtool m4 ninja + openldap openssh patchutils pbzx perl pkg-config.pkg-config python3 scons serf sqlite + subversion sysctl.provider unzip which + ]); + + assert prevStage.darwin.cctools == prevStage.darwin.cctools-llvm; + 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 gnugrep - coreutils findutils diffutils patchutils pbzx; - inherit (gnugrep) pcre2; + + persistent = self: super: { + inherit (prevStage) + bash binutils brotli bzip2 coreutils curl diffutils ed file findutils gawk gettext + gmp gnugrep gnumake gnused gnutar gzip libffi libidn2 libiconv libssh2 + libunistring libxml2 ncurses nghttp2 openssl patch pre xz zlib zstd; darwin = super.darwin.overrideScope (_: _: { - inherit (darwin) dyld ICU Libsystem Csu libiconv rewrite-tbd; + inherit (prevStage.darwin) dyld Libsystem CF ICU locale libobjc libtapi; } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) { - inherit (darwin) binutils binutils-unwrapped cctools; + inherit (prevStage.darwin) binutils binutils-unwrapped cctools cctools-llvm cctools-port; }); } // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) { - inherit llvm; + inherit (prevStage) llvm; # Need to get rid of these when cross-compiling. - "${finalLlvmPackages}" = super."${finalLlvmPackages}" // ( + llvmPackages = super.llvmPackages // ( let - tools = super."${finalLlvmPackages}".tools.extend (_: super: { - inherit (pkgs."${finalLlvmPackages}") llvm clang-unwrapped; + tools = super.llvmPackages.tools.extend (_: _: { + inherit (prevStage.llvmPackages) clang clang-unwrapped libclang libllvm llvm; }); - libraries = super."${finalLlvmPackages}".libraries.extend (_: _: { - inherit (pkgs."${finalLlvmPackages}") compiler-rt libcxx libcxxabi; + libraries = super.llvmPackages.libraries.extend (_: _: { + inherit (prevStage.llvmPackages) compiler-rt libcxx libcxxabi; }); in { inherit tools libraries; } // tools // libraries ); - inherit binutils binutils-unwrapped; + inherit (prevStage) binutils binutils-unwrapped; }; + + cc = prevStage.llvmPackages.clang; in - import ../generic rec { + { + inherit config overlays; + stdenv = import ../generic { name = "stdenv-darwin"; - inherit config; - inherit (pkgs.stdenv) fetchurlBoot; - buildPlatform = localSystem; hostPlatform = localSystem; targetPlatform = localSystem; + inherit config; + preHook = commonPreHook + '' - export NIX_COREFOUNDATION_RPATH=${pkgs.darwin.CF}/Library/Frameworks - export PATH_LOCALE=${pkgs.darwin.locale}/share/locale + stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O + export PATH_LOCALE=${prevStage.darwin.locale}/share/locale ''; - __stdenvImpureHostDeps = commonImpureHostDeps; - __extraImpureHostDeps = commonImpureHostDeps; - - initialPath = import ../generic/common-path.nix { inherit pkgs; }; - shell = "${pkgs.bash}/bin/bash"; - - cc = pkgs."${finalLlvmPackages}".libcxxClang; + initialPath = ((import ../generic/common-path.nix) { pkgs = prevStage; }); extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [ - pkgs.updateAutotoolsGnuConfigScriptsHook + prevStage.updateAutotoolsGnuConfigScriptsHook ]; - extraBuildInputs = [ pkgs.darwin.CF ]; + extraBuildInputs = [ prevStage.darwin.CF ]; + + inherit cc; + + shell = cc.shell; + + inherit (prevStage.stdenv) fetchurlBoot; extraAttrs = { - libc = pkgs.darwin.Libsystem; - shellPackage = pkgs.bash; 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 (pkgs.darwin) objc4; + inherit (prevStage.darwin) objc4; }; - allowedRequisites = (with pkgs; [ + disallowedRequisites = [ bootstrapTools.out ]; + + allowedRequisites = (with prevStage; [ xz.out xz.bin gmp.out @@ -726,6 +1099,7 @@ rec { coreutils ed diffutils + libiconv gnutar gzip ncurses.out @@ -753,36 +1127,42 @@ rec { cc.expand-response-params libxml2.out file - ] ++ lib.optional haveKRB5 libkrb5 - ++ lib.optionals localSystem.isAarch64 [ - pkgs.updateAutotoolsGnuConfigScriptsHook - pkgs.gnu-config ]) - ++ (with pkgs."${finalLlvmPackages}"; [ + ++ lib.optional haveKRB5 prevStage.libkrb5 + ++ lib.optionals localSystem.isAarch64 [ + prevStage.updateAutotoolsGnuConfigScriptsHook + prevStage.gnu-config + ] + ++ (with prevStage.llvmPackages; [ + bintools-unwrapped libcxx libcxx.dev libcxxabi libcxxabi.dev + lld llvm llvm.lib compiler-rt compiler-rt.dev clang-unwrapped - libclang.dev - libclang.lib + clang-unwrapped.lib ]) - ++ (with pkgs.darwin; [ + ++ (with prevStage.darwin; [ dyld Libsystem CF - cctools + cctools-llvm + cctools-port ICU - libiconv locale libtapi - ] ++ lib.optional useAppleSDKLibs objc4 + ] + ++ lib.optional useAppleSDKLibs objc4 ++ lib.optionals doSign [ postLinkSignHook sigtool signingUtils ]); + __stdenvImpureHostDeps = commonImpureHostDeps; + __extraImpureHostDeps = commonImpureHostDeps; + overrides = lib.composeExtensions persistent (self: super: { darwin = super.darwin.overrideScope (_: superDarwin: { inherit (prevStage.darwin) CF darwin-stubs; @@ -794,16 +1174,24 @@ rec { inherit cc; }); }; - - stagesDarwin = [ - ({}: stage0) - stage1 - stage2 - stage3 - stage4 - (prevStage: { - inherit config overlays; - stdenv = stdenvDarwin prevStage; - }) - ]; -} + }) + + # 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.libcxxabi; + assert isBuiltByNixpkgsCompiler prevStage.llvmPackages.compiler-rt; + { inherit (prevStage) config overlays stdenv; }) +] diff --git a/pkgs/stdenv/default.nix b/pkgs/stdenv/default.nix index 7a2ad665e09d7..6cc1339752afd 100644 --- a/pkgs/stdenv/default.nix +++ b/pkgs/stdenv/default.nix @@ -28,7 +28,7 @@ let # the GNU C compiler, and so on. stagesLinux = import ./linux args; - inherit (import ./darwin args) stagesDarwin; + stagesDarwin = import ./darwin args; stagesCross = import ./cross args; diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 0ee096a43a938..9fd6097bc5129 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -15790,7 +15790,7 @@ with pkgs; # This returns the minimum supported version for the platform. The # assumption is that or any later version is good. choose = platform: - /**/ if platform.isDarwin then 11 + /**/ if platform.isDarwin then 15 else if platform.isFreeBSD then 12 else if platform.isAndroid then 12 else if platform.isLinux then 11 diff --git a/pkgs/top-level/darwin-packages.nix b/pkgs/top-level/darwin-packages.nix index b6e70772d04a2..95eef82b32830 100644 --- a/pkgs/top-level/darwin-packages.nix +++ b/pkgs/top-level/darwin-packages.nix @@ -100,7 +100,9 @@ impure-cmds // appleSourcePackages // chooseLibs // { bintools = self.binutils-unwrapped; }; - cctools = callPackage ../os-specific/darwin/cctools/port.nix { + cctools = self.cctools-llvm; + + cctools-port = callPackage ../os-specific/darwin/cctools/port.nix { stdenv = if stdenv.isDarwin then stdenv else pkgs.libcxxStdenv; }; @@ -108,6 +110,10 @@ impure-cmds // appleSourcePackages // chooseLibs // { stdenv = if stdenv.isDarwin then stdenv else pkgs.libcxxStdenv; }; + cctools-llvm = callPackage ../os-specific/darwin/cctools/llvm.nix { + stdenv = if stdenv.isDarwin then stdenv else pkgs.libcxxStdenv; + }; + # TODO(@connorbaker): See https://github.com/NixOS/nixpkgs/issues/229389. cf-private = self.apple_sdk.frameworks.CoreFoundation;