diff --git a/pkgs/development/compilers/llvm/10/default.nix b/pkgs/development/compilers/llvm/10/default.nix index 8bd7e937e7d7..5cb6c278659d 100644 --- a/pkgs/development/compilers/llvm/10/default.nix +++ b/pkgs/development/compilers/llvm/10/default.nix @@ -89,7 +89,11 @@ let # python3 = pkgs.python3; # don't use python-boot # }); - clang = if stdenv.cc.isGNU then tools.libstdcxxClang else tools.libcxxClang; + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; diff --git a/pkgs/development/compilers/llvm/11/default.nix b/pkgs/development/compilers/llvm/11/default.nix index ebd0dc672aa3..82a78af85cac 100644 --- a/pkgs/development/compilers/llvm/11/default.nix +++ b/pkgs/development/compilers/llvm/11/default.nix @@ -104,7 +104,11 @@ let # python3 = pkgs.python3; # don't use python-boot # }); - clang = if stdenv.cc.isGNU then tools.libstdcxxClang else tools.libcxxClang; + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; diff --git a/pkgs/development/compilers/llvm/12/default.nix b/pkgs/development/compilers/llvm/12/default.nix index e68522faea06..4a2a7ee87894 100644 --- a/pkgs/development/compilers/llvm/12/default.nix +++ b/pkgs/development/compilers/llvm/12/default.nix @@ -92,7 +92,11 @@ let # python3 = pkgs.python3; # don't use python-boot # }); - clang = if stdenv.cc.isGNU then tools.libstdcxxClang else tools.libcxxClang; + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; diff --git a/pkgs/development/compilers/llvm/13/default.nix b/pkgs/development/compilers/llvm/13/default.nix index a89c6dabe391..be5e9404cdd4 100644 --- a/pkgs/development/compilers/llvm/13/default.nix +++ b/pkgs/development/compilers/llvm/13/default.nix @@ -93,7 +93,11 @@ let # python3 = pkgs.python3; # don't use python-boot # }); - clang = if stdenv.cc.isGNU then tools.libstdcxxClang else tools.libcxxClang; + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; diff --git a/pkgs/development/compilers/llvm/5/default.nix b/pkgs/development/compilers/llvm/5/default.nix index 4593580b72fd..ef9886fb5ea7 100644 --- a/pkgs/development/compilers/llvm/5/default.nix +++ b/pkgs/development/compilers/llvm/5/default.nix @@ -65,7 +65,11 @@ let python3 = pkgs.python3; # don't use python-boot }); - clang = if stdenv.cc.isGNU then tools.libstdcxxClang else tools.libcxxClang; + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; diff --git a/pkgs/development/compilers/llvm/6/default.nix b/pkgs/development/compilers/llvm/6/default.nix index 9b1caf410bc2..4acfe6cd85d7 100644 --- a/pkgs/development/compilers/llvm/6/default.nix +++ b/pkgs/development/compilers/llvm/6/default.nix @@ -66,7 +66,11 @@ let python3 = pkgs.python3; # don't use python-boot }); - clang = if stdenv.cc.isGNU then tools.libstdcxxClang else tools.libcxxClang; + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; diff --git a/pkgs/development/compilers/llvm/7/default.nix b/pkgs/development/compilers/llvm/7/default.nix index d014c043a80d..f0908f30775d 100644 --- a/pkgs/development/compilers/llvm/7/default.nix +++ b/pkgs/development/compilers/llvm/7/default.nix @@ -96,7 +96,11 @@ let python3 = pkgs.python3; # don't use python-boot }); - clang = if stdenv.cc.isGNU then tools.libstdcxxClang else tools.libcxxClang; + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; diff --git a/pkgs/development/compilers/llvm/8/default.nix b/pkgs/development/compilers/llvm/8/default.nix index 7252b75a3397..43050a72b922 100644 --- a/pkgs/development/compilers/llvm/8/default.nix +++ b/pkgs/development/compilers/llvm/8/default.nix @@ -97,7 +97,11 @@ let python3 = pkgs.python3; # don't use python-boot }); - clang = if stdenv.cc.isGNU then tools.libstdcxxClang else tools.libcxxClang; + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; diff --git a/pkgs/development/compilers/llvm/9/default.nix b/pkgs/development/compilers/llvm/9/default.nix index 9126a614b106..7efe8486a387 100644 --- a/pkgs/development/compilers/llvm/9/default.nix +++ b/pkgs/development/compilers/llvm/9/default.nix @@ -97,7 +97,11 @@ let python3 = pkgs.python3; # don't use python-boot }); - clang = if stdenv.cc.isGNU then tools.libstdcxxClang else tools.libcxxClang; + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; diff --git a/pkgs/development/compilers/llvm/git/default.nix b/pkgs/development/compilers/llvm/git/default.nix index 666e9be3cd89..890270c851db 100644 --- a/pkgs/development/compilers/llvm/git/default.nix +++ b/pkgs/development/compilers/llvm/git/default.nix @@ -93,7 +93,11 @@ let # python3 = pkgs.python3; # don't use python-boot # }); - clang = if stdenv.cc.isGNU then tools.libstdcxxClang else tools.libcxxClang; + # pick clang appropriate for package set we are targeting + clang = + /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM + else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang + else tools.libcxxClang; libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; diff --git a/pkgs/stdenv/booter.nix b/pkgs/stdenv/booter.nix index 51d617354e86..f1d07e6461a9 100644 --- a/pkgs/stdenv/booter.nix +++ b/pkgs/stdenv/booter.nix @@ -124,7 +124,13 @@ stageFuns: let if buildPackages.stdenv.hasCC then if buildPackages.stdenv.cc.isClang or false - then buildPackages.clang + # buildPackages.clang checks targetPackages.stdenv.cc (i. e. this + # attribute) to get a sense of the its set's default compiler and + # chooses between libc++ and libstdc++ based on that. If we hit this + # code here, we'll cause an infinite recursion. Since a set with + # clang as its default compiler always means libc++, we can infer this + # decision statically. + then buildPackages.llvmPackages.libcxxClang else buildPackages.gcc else # This will blow up if anything uses it, but that's OK. The `if diff --git a/pkgs/stdenv/cross/default.nix b/pkgs/stdenv/cross/default.nix index 613b8d5304c0..e01ac74599ae 100644 --- a/pkgs/stdenv/cross/default.nix +++ b/pkgs/stdenv/cross/default.nix @@ -70,7 +70,7 @@ in lib.init bootStages ++ [ # when there is a C compiler and everything should be fine. then throw "no C compiler provided for this platform" else if crossSystem.isDarwin - then buildPackages.llvmPackages.clang + then buildPackages.llvmPackages.libcxxClang else if crossSystem.useLLVM or false then buildPackages.llvmPackages.clangUseLLVM else buildPackages.gcc; diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 9ebf5328ab7d..6014b2c0d5d9 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -13268,7 +13268,11 @@ with pkgs; # Others should instead delegate to the next stage's choice with # `targetPackages.stdenv.cc.bintools`. This one is different just to # provide the default choice, avoiding infinite recursion. - bintools ? if stdenv.targetPlatform.isDarwin then darwin.binutils else binutils + # See the bintools attribute for the logic and reasoning. We need to provide + # a default here, since eval will hit this function when bootstrapping + # stdenv where the bintools attribute doesn't exist, but will never actually + # be evaluated -- callPackage ends up being too eager. + bintools ? pkgs.bintools , libc ? bintools.libc , # libc++ from the default LLVM version is bound at the top level, but we # want the C++ library to be explicitly chosen by the caller, and null by