diff --git a/pkgs/applications/networking/pjsip/default.nix b/pkgs/applications/networking/pjsip/default.nix index 1943a395bd7b7..6f0f5417452fa 100644 --- a/pkgs/applications/networking/pjsip/default.nix +++ b/pkgs/applications/networking/pjsip/default.nix @@ -35,7 +35,7 @@ stdenv.mkDerivation (finalAttrs: { ++ lib.optional stdenv.isLinux alsa-lib ++ lib.optionals stdenv.isDarwin [ AppKit CoreFoundation Security ]; - env = lib.optionalAttrs (stdenv.cc.libcxx != null) { + env = lib.optionalAttrs (stdenv.cc.libcxx != null && stdenv.cc.libcxx?cxxabi.libName) { # work around https://github.com/NixOS/nixpkgs/issues/166205 NIX_LDFLAGS = "-l${stdenv.cc.libcxx.cxxabi.libName}"; } // lib.optionalAttrs stdenv.cc.isClang { diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index af9400a99f161..da82621da6100 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -55,6 +55,26 @@ , includeFortifyHeaders ? null }: +let libcxx_args = libcxx; in +let + stdenv = stdenvNoCC; + + useGccForLibs = useCcForLibs + && libcxx_args == null + && !stdenv.targetPlatform.isDarwin + && !(stdenv.targetPlatform.useLLVM or false) + && !(stdenv.targetPlatform.useAndroidPrebuilt or false) + && !(stdenv.targetPlatform.isiOS or false) + && gccForLibs != null; + + libcxx = + if libcxx_args != null + then libcxx_args + else if useGccForLibs + then lib.getLib gccForLibs + else null; +in + with lib; assert nativeTools -> !propagateDoc && nativePrefix != ""; @@ -64,7 +84,6 @@ assert !(nativeLibc && noLibc); assert (noLibc || nativeLibc) == (libc == null); let - stdenv = stdenvNoCC; inherit (stdenv) hostPlatform targetPlatform; includeFortifyHeaders' = if includeFortifyHeaders != null @@ -100,17 +119,7 @@ let expand-response-params = lib.optionalString ((buildPackages.stdenv.hasCC or false) && buildPackages.stdenv.cc != "/dev/null") (import ../expand-response-params { inherit (buildPackages) stdenv; }); - useGccForLibs = useCcForLibs - && libcxx == null - && !stdenv.targetPlatform.isDarwin - && !(stdenv.targetPlatform.useLLVM or false) - && !(stdenv.targetPlatform.useAndroidPrebuilt or false) - && !(stdenv.targetPlatform.isiOS or false) - && gccForLibs != null; - gccForLibs_solib = getLib gccForLibs - + optionalString (targetPlatform != hostPlatform) "/${targetPlatform.config}"; - - # Analogously to cc_solib and gccForLibs_solib + # Analogously to cc_solib libcxx_solib = "${lib.getLib libcxx}/lib"; # The following two functions, `isGccArchSupported` and @@ -394,7 +403,7 @@ stdenv.mkDerivation { strictDeps = true; propagatedBuildInputs = [ bintools ] ++ extraTools ++ optionals cc.langD or cc.langJava or false [ zlib ]; - depsTargetTargetPropagated = optional (libcxx != null) libcxx ++ extraPackages; + depsTargetTargetPropagated = optional (libcxx_args != null) libcxx_args ++ extraPackages; setupHooks = [ ../setup-hooks/role.bash @@ -437,11 +446,11 @@ stdenv.mkDerivation { ## + optionalString (useGccForLibs && isClang) '' - echo "-B${gccForLibs}/lib/gcc/${targetPlatform.config}/${gccForLibs.version}" >> $out/nix-support/cc-cflags + echo "-B${libcxx}/lib/gcc/${targetPlatform.config}/${libcxx.version}" >> $out/nix-support/cc-cflags '' + optionalString useGccForLibs '' - echo "-L${gccForLibs}/lib/gcc/${targetPlatform.config}/${gccForLibs.version}" >> $out/nix-support/cc-ldflags - echo "-L${gccForLibs_solib}/lib" >> $out/nix-support/cc-ldflags + echo "-L${libcxx}/lib/gcc/${targetPlatform.config}/${libcxx.version}" >> $out/nix-support/cc-ldflags + echo "-L${libcxx_solib}/lib" >> $out/nix-support/cc-ldflags '' # TODO We would like to connect this to `useGccForLibs`, but we cannot yet @@ -516,7 +525,7 @@ stdenv.mkDerivation { # We have a libc++ directly, we have one via "smuggled" GCC, or we have one # bundled with the C compiler because it is GCC - + optionalString (libcxx != null || (useGccForLibs && gccForLibs.langCC or false) || (isGNU && cc.langCC or false)) '' + + optionalString (libcxx_args != null || (useGccForLibs && gccForLibs.langCC or false) || (isGNU && cc.langCC or false)) '' touch "$out/nix-support/libcxx-cxxflags" touch "$out/nix-support/libcxx-ldflags" '' @@ -524,7 +533,7 @@ stdenv.mkDerivation { # already knows how to find its own libstdc++, and adding # additional -isystem flags will confuse gfortran (see # https://github.com/NixOS/nixpkgs/pull/209870#issuecomment-1500550903) - + optionalString (libcxx == null && isClang && (useGccForLibs && gccForLibs.langCC or false)) '' + + optionalString (libcxx_args == null && isClang && (useGccForLibs && gccForLibs.langCC or false)) '' for dir in ${gccForLibs}${lib.optionalString (hostPlatform != targetPlatform) "/${targetPlatform.config}"}/include/c++/*; do echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags done @@ -532,11 +541,11 @@ stdenv.mkDerivation { echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags done '' - + optionalString (libcxx.isLLVM or false) '' - echo "-isystem ${lib.getDev libcxx}/include/c++/v1" >> $out/nix-support/libcxx-cxxflags - echo "-isystem ${lib.getDev libcxx.cxxabi}/include/c++/v1" >> $out/nix-support/libcxx-cxxflags + + optionalString (libcxx_args.isLLVM or false) '' + echo "-isystem ${lib.getDev libcxx_args}/include/c++/v1" >> $out/nix-support/libcxx-cxxflags + echo "-isystem ${lib.getDev libcxx_args.cxxabi}/include/c++/v1" >> $out/nix-support/libcxx-cxxflags echo "-stdlib=libc++" >> $out/nix-support/libcxx-ldflags - echo "-l${libcxx.cxxabi.libName}" >> $out/nix-support/libcxx-ldflags + echo "-l${libcxx_args.cxxabi.libName}" >> $out/nix-support/libcxx-ldflags '' ## @@ -566,7 +575,7 @@ stdenv.mkDerivation { '' + '' echo "$ccLDFlags" >> $out/nix-support/cc-ldflags echo "$ccCFlags" >> $out/nix-support/cc-cflags - '' + optionalString (targetPlatform.isDarwin && (libcxx != null) && (cc.isClang or false)) '' + '' + optionalString (targetPlatform.isDarwin && (libcxx_args != null) && (cc.isClang or false)) '' echo " -L${libcxx_solib}" >> $out/nix-support/cc-ldflags '' diff --git a/pkgs/development/compilers/crystal/default.nix b/pkgs/development/compilers/crystal/default.nix index c9ffed829b2d8..ce73e546e8255 100644 --- a/pkgs/development/compilers/crystal/default.nix +++ b/pkgs/development/compilers/crystal/default.nix @@ -148,7 +148,7 @@ let # See https://github.com/NixOS/nixpkgs/pull/195606#issuecomment-1356491277 substituteInPlace spec/compiler/loader/unix_spec.cr \ --replace 'it "parses file paths"' 'pending "parses file paths"' - '' + lib.optionalString (stdenv.cc.isClang && (stdenv.cc.libcxx != null)) '' + '' + lib.optionalString (stdenv.cc.isClang && (stdenv.cc.libcxx != null) && stdenv.cc.libcxx?cxxabi.libName) '' # Darwin links against libc++ not libstdc++. Newer versions of clang (12+) require # libc++abi to be linked explicitly (see https://github.com/NixOS/nixpkgs/issues/166205). substituteInPlace src/llvm/lib_llvm.cr \ diff --git a/pkgs/development/compilers/open-watcom/v2.nix b/pkgs/development/compilers/open-watcom/v2.nix index 80ee2ee5e45d8..53691d01ab675 100644 --- a/pkgs/development/compilers/open-watcom/v2.nix +++ b/pkgs/development/compilers/open-watcom/v2.nix @@ -48,7 +48,7 @@ stdenv.mkDerivation rec { ]; # Work around https://github.com/NixOS/nixpkgs/issues/166205 - env.NIX_LDFLAGS = lib.optionalString (stdenv.cc.isClang && stdenv.cc.libcxx != null) "-l${stdenv.cc.libcxx.cxxabi.libName}"; + env.NIX_LDFLAGS = lib.optionalString (stdenv.cc.isClang && stdenv.cc.libcxx != null && stdenv.cc.libcxx?cxxabi.libName) "-l${stdenv.cc.libcxx.cxxabi.libName}"; configurePhase = '' runHook preConfigure diff --git a/pkgs/development/cuda-modules/backend-stdenv.nix b/pkgs/development/cuda-modules/backend-stdenv.nix index 7374c45b58d43..7f2b9bad53e16 100644 --- a/pkgs/development/cuda-modules/backend-stdenv.nix +++ b/pkgs/development/cuda-modules/backend-stdenv.nix @@ -19,17 +19,18 @@ let assertCondition = true; in -/* + # We should use libstdc++ at least as new as nixpkgs' stdenv's one. assert let - cxxStdlibCuda = cudaStdenv.cc.cxxStdlib.package; - cxxStdlibNixpkgs = stdenv.cc.cxxStdlib.package; + cxxStdlibCuda = (cxxStdlib cudaStdenv).package; + cxxStdlibNixpkgs = (cxxStdlib stdenv).package; # Expose the C++ standard library we're using. See the comments on "General # libc++ support". This is also relevant when using older gcc than the # stdenv's, as may be required e.g. by CUDAToolkit's nvcc. - cxxStdlib = libcxx: + cxxStdlib = stdenv: let + libcxx = stdenv.cc.libcxx; givenLibcxx = libcxx != null && (libcxx.isLLVM or false); givenGccForLibs = libcxx != null && !(libcxx.isLLVM or false) && (libcxx.isGNU or false); libcxx_solib = "${lib.getLib libcxx}/lib"; @@ -39,14 +40,14 @@ assert let else if givenLibcxx then { kind = "libc++"; package = libcxx; solib = libcxx_solib;} else - # We're probably using the `libstdc++` that came with our `gcc`. - # TODO: this is maybe not always correct? - # TODO: what happens when `nativeTools = true`? - { kind = "libstdc++"; package = cc; solib = cc_solib; } - ; + { kind = "libstdc++"; package = stdenv.cc; + solib = throw '' + # We're probably using the `libstdc++` that came with our `gcc`. + # TODO: this is maybe not always correct? + # TODO: what happens when `nativeTools = true`? + ''; }; in -((stdenv.cc.cxxStdlib.kind or null) == "libstdc++") +(((cxxStdlib stdenv).kind or null) == "libstdc++") -> lib.versionAtLeast cxxStdlibCuda.version cxxStdlibNixpkgs.version; -*/ lib.extendDerivation assertCondition passthruExtra cudaStdenv diff --git a/pkgs/development/cuda-modules/cuda/overrides.nix b/pkgs/development/cuda-modules/cuda/overrides.nix index 69ddab17bac31..bf631170ad8da 100644 --- a/pkgs/development/cuda-modules/cuda/overrides.nix +++ b/pkgs/development/cuda-modules/cuda/overrides.nix @@ -112,7 +112,7 @@ attrsets.filterAttrs (attr: _: (builtins.hasAttr attr prev)) { useCcForLibs = true; gccForLibs = ccForLibs-wrapper.cc; }; - cxxStdlibDir = ccForLibs-wrapper.cxxStdlib.solib or (throw "necessary to fix CI"); + cxxStdlibDir = "${lib.getLib ccForLibs-wrapper.libcxx}/lib"; in { diff --git a/pkgs/development/haskell-modules/generic-builder.nix b/pkgs/development/haskell-modules/generic-builder.nix index 1819b29da460c..ad03fd0353c0d 100644 --- a/pkgs/development/haskell-modules/generic-builder.nix +++ b/pkgs/development/haskell-modules/generic-builder.nix @@ -821,7 +821,7 @@ stdenv.mkDerivation ({ # Ensure libc++abi is linked even when clang is invoked as just `clang` or `cc`. # Works around https://github.com/NixOS/nixpkgs/issues/166205. # This can be dropped once a fix has been committed to cc-wrapper. -// lib.optionalAttrs (stdenv.hasCC && stdenv.cc.isClang && stdenv.cc.libcxx != null) { +// lib.optionalAttrs (stdenv.hasCC && stdenv.cc.isClang && stdenv.cc.libcxx != null && stdenv.cc.libcxx?cxxabi.libName) { NIX_LDFLAGS = "-l${stdenv.cc.libcxx.cxxabi.libName}"; } ) diff --git a/pkgs/development/libraries/jemalloc/default.nix b/pkgs/development/libraries/jemalloc/default.nix index 8a3b8658fbb85..3bddfce514e50 100644 --- a/pkgs/development/libraries/jemalloc/default.nix +++ b/pkgs/development/libraries/jemalloc/default.nix @@ -48,7 +48,7 @@ stdenv.mkDerivation rec { ; env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-Wno-error=array-bounds"; - env.NIX_LDFLAGS = lib.optionalString (stdenv.cc.libcxx != null) "-l${stdenv.cc.libcxx.cxxabi.libName}"; + env.NIX_LDFLAGS = lib.optionalString (stdenv.cc.libcxx != null && stdenv.cc.libcxx?cxxabi.libName) "-l${stdenv.cc.libcxx.cxxabi.libName}"; # Tries to link test binaries binaries dynamically and fails doCheck = !stdenv.hostPlatform.isStatic; diff --git a/pkgs/development/libraries/libserdes/default.nix b/pkgs/development/libraries/libserdes/default.nix index fad83031f0139..5edcc27a5d963 100644 --- a/pkgs/development/libraries/libserdes/default.nix +++ b/pkgs/development/libraries/libserdes/default.nix @@ -32,7 +32,7 @@ stdenv.mkDerivation rec { postPatch = '' patchShebangs configure lds-gen.pl - '' + lib.optionalString (stdenv.cc.libcxx != null) '' + '' + lib.optionalString (stdenv.cc.libcxx != null && stdenv.cc.libcxx?cxxabi.libName) '' # fix for https://github.com/NixOS/nixpkgs/issues/166205 # llvm12+ isn't adding libc++abi substituteInPlace src-cpp/Makefile \ diff --git a/pkgs/servers/sql/postgresql/ext/postgis.nix b/pkgs/servers/sql/postgresql/ext/postgis.nix index 65541730d296e..68d6dddb56899 100644 --- a/pkgs/servers/sql/postgresql/ext/postgis.nix +++ b/pkgs/servers/sql/postgresql/ext/postgis.nix @@ -37,7 +37,7 @@ stdenv.mkDerivation rec { # postgis config directory assumes /include /lib from the same root for json-c library NIX_LDFLAGS = "-L${lib.getLib json_c}/lib" # Work around https://github.com/NixOS/nixpkgs/issues/166205. - + lib.optionalString (stdenv.cc.isClang && stdenv.cc.libcxx != null) " -l${stdenv.cc.libcxx.cxxabi.libName}"; + + lib.optionalString (stdenv.cc.isClang && stdenv.cc.libcxx != null && stdenv.cc.libcxx?cxxabi.libName) " -l${stdenv.cc.libcxx.cxxabi.libName}"; preConfigure = '' diff --git a/pkgs/tools/security/hashcat/default.nix b/pkgs/tools/security/hashcat/default.nix index 2e8370be85fe2..9529ff43c3171 100644 --- a/pkgs/tools/security/hashcat/default.nix +++ b/pkgs/tools/security/hashcat/default.nix @@ -25,7 +25,7 @@ stdenv.mkDerivation rec { # MACOSX_DEPLOYMENT_TARGET is defined by the enviroment # Remove hardcoded paths on darwin substituteInPlace src/Makefile \ - '' + lib.optionalString (stdenv.cc.libcxx != null) '' + '' + lib.optionalString (stdenv.cc.libcxx != null && stdenv.cc.libcxx?cxxabi.libName) '' --replace "-lstdc++" "-lc++ -l${stdenv.cc.libcxx.cxxabi.libName}" \ '' + '' --replace "export MACOSX_DEPLOYMENT_TARGET" "#export MACOSX_DEPLOYMENT_TARGET" \ diff --git a/pkgs/tools/typesetting/tectonic/default.nix b/pkgs/tools/typesetting/tectonic/default.nix index 6b98a5db63438..193baa15f3c02 100644 --- a/pkgs/tools/typesetting/tectonic/default.nix +++ b/pkgs/tools/typesetting/tectonic/default.nix @@ -39,7 +39,7 @@ rustPlatform.buildRustPackage rec { ++ lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [ ApplicationServices Cocoa Foundation ]); # workaround for https://github.com/NixOS/nixpkgs/issues/166205 - NIX_LDFLAGS = lib.optionalString (stdenv.cc.isClang && stdenv.cc.libcxx != null) " -l${stdenv.cc.libcxx.cxxabi.libName}"; + NIX_LDFLAGS = lib.optionalString (stdenv.cc.isClang && stdenv.cc.libcxx != null && stdenv.cc.libcxx?cxxabi.libName) " -l${stdenv.cc.libcxx.cxxabi.libName}"; postInstall = '' # Makes it possible to automatically use the V2 CLI API diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 2be7ceca607f1..4c0434703b4bc 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -11752,7 +11752,7 @@ with pkgs; boost = boost179; libclang = llvmPackages_15.libclang; clang = - if stdenv.cc.libcxx != null + if stdenv.cc.isClang then (overrideLibcxx llvmPackages_15.stdenv).cc else clang_15; llvm = llvm_15;