From 9106b7cd224f99e4833e2f5340bdcc1cfb79df1a Mon Sep 17 00:00:00 2001 From: Luna Nova Date: Tue, 21 Oct 2025 21:09:05 -0700 Subject: [PATCH] pkgs/stdenv/darwin: rebuild avoidance for LLVM scope - Setting recurseForDerivations again post overrideScope - Hackily propagating initial value llvmPackages.override --- pkgs/stdenv/darwin/default.nix | 297 +++++++++++++++++++-------------- 1 file changed, 168 insertions(+), 129 deletions(-) diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index 5ae9dc61036a..f7c5262acc98 100644 --- a/pkgs/stdenv/darwin/default.nix +++ b/pkgs/stdenv/darwin/default.nix @@ -466,87 +466,91 @@ assert bootstrapTools.passthru.isFromBootstrapFiles or false; # sanity check } ); - llvmPackages = super.llvmPackages.overrideScope ( - selfLlvmPackages: _: { - libclang = self.stdenv.mkDerivation { - name = "bootstrap-stage0-clang"; - version = "boot"; - outputs = [ - "out" - "lib" - ]; - buildCommand = '' - mkdir -p $out/lib - ln -s $out $lib - ln -s ${bootstrapTools}/bin $out/bin - ln -s ${bootstrapTools}/lib/clang $out/lib - ln -s ${bootstrapTools}/include $out - ''; - passthru = { - isFromBootstrapFiles = true; - hardeningUnsupportedFlags = [ - "fortify3" - "pacret" - "shadowstack" - "stackclashprotection" - "zerocallusedregs" + llvmPackages = + (super.llvmPackages.overrideScope ( + selfLlvmPackages: _: { + libclang = self.stdenv.mkDerivation { + name = "bootstrap-stage0-clang"; + version = "boot"; + outputs = [ + "out" + "lib" ]; + buildCommand = '' + mkdir -p $out/lib + ln -s $out $lib + ln -s ${bootstrapTools}/bin $out/bin + ln -s ${bootstrapTools}/lib/clang $out/lib + ln -s ${bootstrapTools}/include $out + ''; + passthru = { + isFromBootstrapFiles = true; + hardeningUnsupportedFlags = [ + "fortify3" + "pacret" + "shadowstack" + "stackclashprotection" + "zerocallusedregs" + ]; + }; }; - }; - libllvm = self.stdenv.mkDerivation { - name = "bootstrap-stage0-llvm"; - outputs = [ - "out" - "lib" - ]; - buildCommand = '' - mkdir -p $out/bin $out/lib - ln -s $out $lib - for tool in ${toString super.darwin.binutils-unwrapped.llvm_cmds}; do - cctoolsTool=''${tool//-/_} - toolsrc="${bootstrapTools}/bin/$cctoolsTool" - if [ -e "$toolsrc" ]; then - ln -s "$toolsrc" $out/bin/llvm-$tool - fi - done - ln -s ${bootstrapTools}/bin/dsymutil $out/bin/dsymutil - ln -s ${bootstrapTools}/bin/llvm-readtapi $out/bin/llvm-readtapi - ln -s ${bootstrapTools}/lib/libLLVM* $out/lib - ''; - passthru.isFromBootstrapFiles = true; - }; - llvm-manpages = self.llvmPackages.libllvm; - lld = self.stdenv.mkDerivation { - name = "bootstrap-stage0-lld"; - buildCommand = ""; - passthru = { - isLLVM = true; - isFromBootstrapFiles = true; + libllvm = self.stdenv.mkDerivation { + name = "bootstrap-stage0-llvm"; + outputs = [ + "out" + "lib" + ]; + buildCommand = '' + mkdir -p $out/bin $out/lib + ln -s $out $lib + for tool in ${toString super.darwin.binutils-unwrapped.llvm_cmds}; do + cctoolsTool=''${tool//-/_} + toolsrc="${bootstrapTools}/bin/$cctoolsTool" + if [ -e "$toolsrc" ]; then + ln -s "$toolsrc" $out/bin/llvm-$tool + fi + done + ln -s ${bootstrapTools}/bin/dsymutil $out/bin/dsymutil + ln -s ${bootstrapTools}/bin/llvm-readtapi $out/bin/llvm-readtapi + ln -s ${bootstrapTools}/lib/libLLVM* $out/lib + ''; + passthru.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; - }; - libcxx = self.stdenv.mkDerivation { - name = "bootstrap-stage0-libcxx"; - buildCommand = '' - mkdir -p $out/lib $out/include - ln -s ${bootstrapTools}/lib/libc++.dylib $out/lib - ln -s ${bootstrapTools}/include/c++ $out/include - ''; - passthru = { - isLLVM = true; - isFromBootstrapFiles = true; + llvm-manpages = self.llvmPackages.libllvm; + lld = self.stdenv.mkDerivation { + name = "bootstrap-stage0-lld"; + buildCommand = ""; + passthru = { + isLLVM = true; + isFromBootstrapFiles = true; + }; }; - }; - } - ); + compiler-rt = self.stdenv.mkDerivation { + name = "bootstrap-stage0-compiler-rt"; + buildCommand = '' + mkdir -p $out/lib $out/share + ln -s ${bootstrapTools}/lib/libclang_rt* $out/lib + ln -s ${bootstrapTools}/lib/darwin $out/lib + ''; + passthru.isFromBootstrapFiles = true; + }; + libcxx = self.stdenv.mkDerivation { + name = "bootstrap-stage0-libcxx"; + buildCommand = '' + mkdir -p $out/lib $out/include + ln -s ${bootstrapTools}/lib/libc++.dylib $out/lib + ln -s ${bootstrapTools}/include/c++ $out/include + ''; + passthru = { + isLLVM = true; + isFromBootstrapFiles = true; + }; + }; + } + )) + // { + inherit (super.llvmPackages) override; + }; }; extraPreHook = '' @@ -671,9 +675,13 @@ assert bootstrapTools.passthru.isFromBootstrapFiles or false; # sanity check } ); - llvmPackages = super.llvmPackages.overrideScope ( - _: _: llvmToolsPackages prevStage // llvmLibrariesPackages prevStage - ); + llvmPackages = + (super.llvmPackages.overrideScope ( + _: _: llvmToolsPackages prevStage // llvmLibrariesPackages prevStage + )) + // { + inherit (super.llvmPackages) override; + }; }; extraNativeBuildInputs = lib.optionals localSystem.isAarch64 [ @@ -819,14 +827,18 @@ assert bootstrapTools.passthru.isFromBootstrapFiles or false; # sanity check } ); - llvmPackages = super.llvmPackages.overrideScope ( - _: _: - llvmToolsPackages prevStage - // llvmLibrariesPackages prevStage + llvmPackages = + (super.llvmPackages.overrideScope ( + _: _: + llvmToolsPackages prevStage + // llvmLibrariesPackages prevStage + // { + inherit (prevStage.llvmPackages) clangNoCompilerRtWithLibc; + } + )) // { - inherit (prevStage.llvmPackages) clangNoCompilerRtWithLibc; - } - ); + inherit (super.llvmPackages) override; + }; } ]; @@ -901,7 +913,9 @@ assert bootstrapTools.passthru.isFromBootstrapFiles or false; # sanity check } ); - llvmPackages = super.llvmPackages.overrideScope (_: _: llvmLibrariesPackages prevStage); + llvmPackages = (super.llvmPackages.overrideScope (_: _: llvmLibrariesPackages prevStage)) // { + inherit (super.llvmPackages) override; + }; } ]; @@ -971,45 +985,49 @@ assert bootstrapTools.passthru.isFromBootstrapFiles or false; # sanity check } ); - llvmPackages = super.llvmPackages.overrideScope ( - _: _: - llvmToolsPackages prevStage - // llvmLibrariesPackages prevStage + llvmPackages = + (super.llvmPackages.overrideScope ( + _: _: + llvmToolsPackages prevStage + // llvmLibrariesPackages prevStage + // { + systemLibcxxClang = super.wrapCCWith rec { + nativeTools = false; + nativeLibc = false; + + inherit (prevStage) expand-response-params; + + extraPackages = [ self.llvmPackages.compiler-rt ]; + + extraBuildCommands = '' + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "${lib.getLib cc}/lib/clang/${lib.versions.major (lib.getVersion cc)}/include" "$rsrc" + echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags + ln -s "${prevStage.llvmPackages.compiler-rt.out}/lib" "$rsrc/lib" + ln -s "${prevStage.llvmPackages.compiler-rt.out}/share" "$rsrc/share" + ''; + + cc = self.llvmPackages.clang-unwrapped; + bintools = self.darwin.binutils; + + isClang = true; + libc = self.darwin.libSystem; + inherit (self.darwin) libcxx; + + inherit lib; + inherit (self) + stdenvNoCC + coreutils + gnugrep + runtimeShell + ; + }; + } + )) // { - systemLibcxxClang = super.wrapCCWith rec { - nativeTools = false; - nativeLibc = false; - - inherit (prevStage) expand-response-params; - - extraPackages = [ self.llvmPackages.compiler-rt ]; - - extraBuildCommands = '' - rsrc="$out/resource-root" - mkdir "$rsrc" - ln -s "${lib.getLib cc}/lib/clang/${lib.versions.major (lib.getVersion cc)}/include" "$rsrc" - echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags - ln -s "${prevStage.llvmPackages.compiler-rt.out}/lib" "$rsrc/lib" - ln -s "${prevStage.llvmPackages.compiler-rt.out}/share" "$rsrc/share" - ''; - - cc = self.llvmPackages.clang-unwrapped; - bintools = self.darwin.binutils; - - isClang = true; - libc = self.darwin.libSystem; - inherit (self.darwin) libcxx; - - inherit lib; - inherit (self) - stdenvNoCC - coreutils - gnugrep - runtimeShell - ; - }; - } - ); + inherit (super.llvmPackages) override; + }; } ]; @@ -1220,14 +1238,18 @@ assert bootstrapTools.passthru.isFromBootstrapFiles or false; # sanity check let llvmVersion = lib.versions.major prevStage.llvmPackages.release_version; in - super."llvmPackages_${llvmVersion}".overrideScope ( + (super."llvmPackages_${llvmVersion}".overrideScope ( _: _: llvmToolsPackages prevStage // llvmLibrariesPackages prevStage // { inherit (super."llvmPackages_${llvmVersion}") llvm-manpages; } - ); + )) + // { + inherit (super."llvmPackages_${llvmVersion}") override; + recurseForDerivations = true; + }; } ]; }; @@ -1259,7 +1281,24 @@ assert bootstrapTools.passthru.isFromBootstrapFiles or false; # sanity check assert prevStage.libiconv == prevStage.darwin.libiconv; { - inherit (prevStage) config overlays stdenv; + inherit (prevStage) config overlays; + # This should be done in the `overrideScope` above, but it causes rebuilds. + # TODO: Move it there once https://github.com/NixOS/nixpkgs/pull/445668 is merged. + stdenv = prevStage.stdenv // { + overrides = + self: super: + (prevStage.stdenv.overrides self super) + // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) ( + let + llvmVersion = lib.versions.major prevStage.llvmPackages.release_version; + in + { + "llvmPackages_${llvmVersion}" = prevStage."llvmPackages_${llvmVersion}" // { + inherit (prevStage) clang; + }; + } + ); + }; } ) ]