From 65960056088e9407b051aa9c890349b882e99398 Mon Sep 17 00:00:00 2001 From: Randy Eckenrode Date: Wed, 20 Nov 2024 13:18:54 -0500 Subject: [PATCH] darwin.stdenv: use native Clang as a cross-compiler In theory, Clang is a cross-compiler by default. After the following PRs, this is true on platforms other than Darwin. - https://github.com/NixOS/nixpkgs/pull/355532 - https://github.com/NixOS/nixpkgs/pull/356162 The reason Darwin needs additional changes is it only overlays Clang and LLVM in the native target case. When cross-compiling, it builds Clang and LLVM again. This is unnecessary as long as the Darwin stdenv avoids propagating the Clang wrappers, which are target-dependent. In theory, ld64 is also a cross-linker by default. Realizing that for nixpkgs requires additional work that will be done separately. --- pkgs/stdenv/darwin/default.nix | 38 ++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index 46157f4385d3..d37a892ea996 100644 --- a/pkgs/stdenv/darwin/default.nix +++ b/pkgs/stdenv/darwin/default.nix @@ -1274,24 +1274,32 @@ assert bootstrapTools.passthru.isFromBootstrapFiles or false; # sanity check } ); } - (lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) ( - (bintoolsPackages prevStage) + # These have to be dropped from the overlay when cross-compiling. Wrappers are obviously target-specific. + # darwin.binutils is not yet ready to be target-independent. + ( + lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) (bintoolsPackages prevStage) // { inherit (prevStage.llvmPackages) clang; - # Need to get rid of these when cross-compiling. - "llvmPackages_${lib.versions.major prevStage.llvmPackages.release_version}" = - let - llvmVersion = lib.versions.major prevStage.llvmPackages.release_version; - tools = super."llvmPackages_${llvmVersion}".tools.extend ( - _: _: llvmToolsPackages prevStage // { inherit (prevStage.llvmPackages) clang; } - ); - libraries = super."llvmPackages_${llvmVersion}".libraries.extend ( - _: _: llvmLibrariesPackages prevStage - ); - in - super."llvmPackages_${llvmVersion}" // { inherit tools libraries; } // tools // libraries; } - )) + ) + # Since LLVM should be the same regardless of target platform, overlay it to avoid an unnecessary + # rebuild when cross-compiling from Darwin to another platform using clang. + { + + "llvmPackages_${lib.versions.major prevStage.llvmPackages.release_version}" = + let + llvmVersion = lib.versions.major prevStage.llvmPackages.release_version; + tools = super."llvmPackages_${llvmVersion}".tools.extend (_: _: llvmToolsPackages prevStage); + libraries = super."llvmPackages_${llvmVersion}".libraries.extend ( + _: _: + llvmLibrariesPackages prevStage + // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) { + inherit (prevStage.llvmPackages) clang; + } + ); + in + super."llvmPackages_${llvmVersion}" // { inherit tools libraries; } // tools // libraries; + } ]; }; }