From 4515948fed2e68abcd39385b9a31fc68950fc3be Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Wed, 10 May 2023 12:06:13 -0400 Subject: [PATCH 01/12] indent: fix build with clang 13 or newer --- pkgs/development/tools/misc/indent/default.nix | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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" ]; From 8d8d6734656b4a37cf48c37dad721d42aad8da55 Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Wed, 10 May 2023 03:02:53 -0400 Subject: [PATCH 02/12] pkg-config: fix build with newer clang --- pkgs/development/tools/misc/pkg-config/default.nix | 3 +++ 1 file changed, 3 insertions(+) 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; From 102351c6e661ada0323b623e0e1d8c979da64adb Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Wed, 10 May 2023 12:06:54 -0400 Subject: [PATCH 03/12] rewrite-tbd: avoid infinite recursion when cmake is not cmakeMinimal --- pkgs/os-specific/darwin/rewrite-tbd/default.nix | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pkgs/os-specific/darwin/rewrite-tbd/default.nix b/pkgs/os-specific/darwin/rewrite-tbd/default.nix index e5ef118e514ce..41e0cbbee8001 100644 --- a/pkgs/os-specific/darwin/rewrite-tbd/default.nix +++ b/pkgs/os-specific/darwin/rewrite-tbd/default.nix @@ -1,4 +1,4 @@ -{ stdenv, lib, fetchFromGitHub, cmake, pkg-config, libyaml }: +{ stdenv, lib, fetchFromGitHub, gnumake, libyaml }: stdenv.mkDerivation { pname = "rewrite-tbd"; @@ -11,9 +11,18 @@ stdenv.mkDerivation { sha256 = "08sk91zwj6n9x2ymwid2k7y0rwv5b7p6h1b25ipx1dv0i43p6v1a"; }; - nativeBuildInputs = [ cmake pkg-config ]; + # Nix takes care of these paths. Avoiding the use of `pkg-config` prevents an infinite recursion. + postPatch = '' + substituteInPlace Makefile.boot \ + --replace '$(shell pkg-config --cflags yaml-0.1)' "" \ + --replace '$(shell pkg-config --libs yaml-0.1)' "-lyaml" + ''; + + nativeBuildInputs = [ gnumake ]; buildInputs = [ libyaml ]; + makeFlags = [ "-f" "Makefile.boot" "PREFIX=${placeholder "out"}"]; + meta = with lib; { homepage = "https://github.com/thefloweringash/rewrite-tbd/"; description = "Rewrite filepath in .tbd to Nix applicable format"; From 7a96bc94da08ae13b2dacd20e1387b998214043e Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Fri, 19 May 2023 15:59:56 -0400 Subject: [PATCH 04/12] xnu: use python3Minimal instead of python3 xnu does not require a Python that supports configd, so use a minimal one without support. Doing this prevents an infinite recuresion when building configd with xpc, which is needed to build with a newer LLVM. --- pkgs/os-specific/darwin/apple-sdk/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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" ]; From 80ced31b933eaf88328df8e61721d98b78875be8 Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Thu, 11 May 2023 17:57:55 -0400 Subject: [PATCH 05/12] xnu: fix build with newer clang --- pkgs/os-specific/darwin/apple-source-releases/xnu/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/os-specific/darwin/apple-source-releases/xnu/default.nix b/pkgs/os-specific/darwin/apple-source-releases/xnu/default.nix index 262cb3d6a3870..62003a6e4a6ce 100644 --- a/pkgs/os-specific/darwin/apple-source-releases/xnu/default.nix +++ b/pkgs/os-specific/darwin/apple-source-releases/xnu/default.nix @@ -34,7 +34,7 @@ appleDerivation' (if headersOnly then stdenvNoCC else stdenv) ( --replace "-Werror " "" substituteInPlace SETUP/kextsymboltool/Makefile \ - --replace "-lstdc++" "-lc++" + --replace "-lstdc++" "-lc++ -lc++abi" substituteInPlace libsyscall/xcodescripts/mach_install_mig.sh \ --replace "/usr/include" "/include" \ From 02b1996a605a7fd7de6c19bbdc41be607cc68029 Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Fri, 19 May 2023 15:55:12 -0400 Subject: [PATCH 06/12] configd: fix build with newer LLVM and bootstrap Clang 15 does not like the fake xpc headers. Use the real ones instead. Doing this no longer causes an infinite recursion because xnu now depends on python3Minimal, which does not include configd support. --- .../apple-source-releases/configd/default.nix | 65 +++++-------------- .../darwin/apple-source-releases/default.nix | 2 + 2 files changed, 17 insertions(+), 50 deletions(-) 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 < Date: Thu, 18 May 2023 08:14:03 -0400 Subject: [PATCH 08/12] cctools: make cctools-llvm the default on Darwin --- pkgs/top-level/darwin-packages.nix | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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; From 6d27e3a489ddfe8382c978ea652ad38ae78cfd40 Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Fri, 19 May 2023 15:49:09 -0400 Subject: [PATCH 09/12] swift-corelibs: set NIX_COREFOUNDATION_RPATH in a hook MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #230870. Thanks to @eliasnaur for the test case and for rasining awareness and to @veprbl for the work done on #111385. This takes a slightly different approach from those two PRs. The hook is set unconditionally. The stdenv bootstrap doesn’t really need CF at all, so setting the hook is harmless. This simplifies things. --- pkgs/os-specific/darwin/swift-corelibs/corefoundation.nix | 4 +++- .../darwin/swift-corelibs/pure-corefoundation-hook.sh | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 pkgs/os-specific/darwin/swift-corelibs/pure-corefoundation-hook.sh diff --git a/pkgs/os-specific/darwin/swift-corelibs/corefoundation.nix b/pkgs/os-specific/darwin/swift-corelibs/corefoundation.nix index 7c48d695e11d1..1e7aeb3689ea9 100644 --- a/pkgs/os-specific/darwin/swift-corelibs/corefoundation.nix +++ b/pkgs/os-specific/darwin/swift-corelibs/corefoundation.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, fetchFromGitHub, fetchurl, ninja, python3, curl, libxml2, objc4, ICU }: +{ lib, stdenv, fetchFromGitHub, fetchurl, makeSetupHook, ninja, python3, curl, libxml2, objc4, ICU }: let # 10.12 adds a new sysdir.h that our version of CF in the main derivation depends on, but @@ -104,4 +104,6 @@ stdenv.mkDerivation { ln -s Versions/Current/$i $base/$i done ''; + + darwinEnvHook = makeSetupHook { name = "darwin-env-hook"; } ./pure-corefoundation-hook.sh; } diff --git a/pkgs/os-specific/darwin/swift-corelibs/pure-corefoundation-hook.sh b/pkgs/os-specific/darwin/swift-corelibs/pure-corefoundation-hook.sh new file mode 100644 index 0000000000000..d5539f50861a4 --- /dev/null +++ b/pkgs/os-specific/darwin/swift-corelibs/pure-corefoundation-hook.sh @@ -0,0 +1,7 @@ +usePureCoreFoundation() { +# Avoid overriding value set by the impure CF + if [ -z "${NIX_COREFOUNDATION_RPATH:-}" ]; then + export NIX_COREFOUNDATION_RPATH=@out@/Library/Frameworks + fi +} +addEnvHooks "$hostOffset" usePureCoreFoundation From 3f442fe59fd277cca791a124285cde8ae1c4f79a Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Tue, 23 May 2023 22:00:43 -0400 Subject: [PATCH 10/12] apple_sdk_11_0.stdenv: replace extraBuildInputs with CF from the 11.0 SDK --- pkgs/os-specific/darwin/apple-sdk-11.0/default.nix | 2 ++ 1 file changed, 2 insertions(+) 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"; From 5f4e05b93409be804a87e8cb9fae2e3a809a36f8 Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Wed, 10 May 2023 03:03:00 -0400 Subject: [PATCH 11/12] darwin.stdenv: refactor stdenv definition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In preparation for bumping the LLVM used by Darwin, this change refactors and reworks the stdenv build process. When it made sense, existing behaviors were kept to avoid causing any unwanted breakage. However, there are some differences. The reasoning and differences are discussed below. - Improved cycle times - Working on the Darwin stdenv was a tedious process because `allowedRequisites` determined what was allowed between stages. If you made a mistake, you might have to wait a considerable amount of time for the build to fail. Using assertions makes many errors fail at evaluation time and makes moving things around safer and easier to do. - Decoupling from bootstrap tools - The stdenv build process builds as much as it can in the early stages to remove the requirement that the bootstrap tools need bumped in order to bump the stdenv itself. This should lower the barrier to updates and make it easier to bump in the future. It also allows changes to be made without requiring additional tools be added to the bootstrap tools. - Patterned after the Linux stdenv - I tried to follow the patterns established in the Linux stdenv with adaptations made to Darwin’s needs. My hope is this makes the Darwin stdenv more approable for non-Darwin developers who made need to interact with it. It also allowed some of the hacks to be removed. - Documentation - Comments were added explaining what was happening and why things were being done. This is particular important for some stages that might not be obvious (such as the sysctl stage). - Cleanup - Converting the intermediate `allowedRequisites` to assertions revealed that many packages were being referenced that no longer exist or have been renamed. Removing them reduces clutter and should help make the stdenv bootstrap process be more understandable. --- pkgs/stdenv/darwin/default.nix | 1402 ++++++++++++++++++++------------ pkgs/stdenv/default.nix | 2 +- 2 files changed, 896 insertions(+), 508 deletions(-) diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index 780717db56b88..fcc2b38709e5e 100644 --- a/pkgs/stdenv/darwin/default.nix +++ b/pkgs/stdenv/darwin/default.nix @@ -4,7 +4,6 @@ , config , overlays , crossOverlays ? [ ] -, bootstrapLlvmVersion ? "11.1.0" # Allow passing in bootstrap files directly so we can test the stdenv bootstrap process when changing the bootstrap tools , bootstrapFiles ? if localSystem.isAarch64 then let @@ -44,26 +43,25 @@ let useAppleSDKLibs = localSystem.isAarch64; haveKRB5 = localSystem.isx86_64; - # final toolchain is injected into llvmPackages_${finalLlvmVersion} - finalLlvmVersion = lib.versions.major bootstrapLlvmVersion; - finalLlvmPackages = "llvmPackages_${finalLlvmVersion}"; - commonImpureHostDeps = [ "/bin/sh" "/usr/lib/libSystem.B.dylib" "/usr/lib/system/libunc.dylib" # This dependency is "hidden", so our scanning code doesn't pick it up ]; -in -rec { + 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 - - stripAllFlags=" " # the Darwin "strip" command doesn't know "-s" - stripDebugFlags="-S" # the Darwin "strip" command does something odd with "-p" ''; bootstrapTools = derivation ({ @@ -80,122 +78,93 @@ rec { __contentAddressed = true; outputHashAlgo = "sha256"; outputHashMode = "recursive"; - }); - - stageFun = step: last: { shell ? "${bootstrapTools}/bin/bash" - , overrides ? (self: super: { }) - , extraPreHook ? "" - , extraNativeBuildInputs - , extraBuildInputs - , libcxx - , allowedRequisites ? null - }: - let - name = "bootstrap-stage${toString step}"; - - buildPackages = lib.optionalAttrs (last ? stdenv) { - inherit (last) stdenv; - }; + }) // { passthru.isFromBootstrapFiles = true; }; - doSign = localSystem.isAarch64 && last != null; - doUpdateAutoTools = localSystem.isAarch64 && last != null; + stageFun = prevStage: + { name, overrides ? (self: super: { }), extraNativeBuildInputs ? [ ], extraPreHook ? "" }: - mkExtraBuildCommands = cc: '' - rsrc="$out/resource-root" - mkdir "$rsrc" - ln -s "${cc.lib or cc}/lib/clang/${cc.version}/include" "$rsrc" - ln -s "${last.pkgs."${finalLlvmPackages}".compiler-rt.out}/lib" "$rsrc/lib" - echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags - ''; + 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 = 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; }; + }; + }); - 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; + 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 @@ -735,8 +1109,8 @@ rec { bash gawk gnugrep - patch gnugrep.pcre2.out + patch gettext binutils.bintools binutils.bintools.lib @@ -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; From 7a4c78dc4e464b1c09941aa497350d8ca640bc1a Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Fri, 26 May 2023 00:50:02 -0400 Subject: [PATCH 12/12] darwin.stdenv: bump LLVM version to 15 --- pkgs/stdenv/darwin/default.nix | 2 +- pkgs/top-level/all-packages.nix | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index fcc2b38709e5e..5ab048adda94b 100644 --- a/pkgs/stdenv/darwin/default.nix +++ b/pkgs/stdenv/darwin/default.nix @@ -1109,8 +1109,8 @@ in bash gawk gnugrep - gnugrep.pcre2.out patch + gnugrep.pcre2.out gettext binutils.bintools binutils.bintools.lib 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