diff --git a/pkgs/build-support/cc-wrapper/cc-wrapper.sh b/pkgs/build-support/cc-wrapper/cc-wrapper.sh index eb5b99643dbac..246c1b1f65f6e 100644 --- a/pkgs/build-support/cc-wrapper/cc-wrapper.sh +++ b/pkgs/build-support/cc-wrapper/cc-wrapper.sh @@ -140,6 +140,15 @@ if [ "$NIX_ENFORCE_NO_NATIVE_@suffixSalt@" = 1 ]; then params=(${kept+"${kept[@]}"}) fi +# Some build systems such as Bazel and SwiftPM use `clang` instead of `clang++`, +# which will find the libc++ headers in the sysroot for C++ files. +if [[ "$isCxx" = 0 && "@isClang@" ]]; then +# This duplicates the behavior of a native toolchain, which can find the +# libc++ headers but requires `-lc++` to be specified explicitly when linking. + isCxx=1 + cxxLibrary=0 +fi + if [[ "$isCxx" = 1 ]]; then if [[ "$cxxInclude" = 1 ]]; then # diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index 50ff90609a5e4..427161f4742c0 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -741,14 +741,14 @@ stdenvNoCC.mkDerivation { # https://github.com/NixOS/nixpkgs/pull/209870#issuecomment-1500550903) + optionalString (libcxx == null && isClang && (useGccForLibs && gccForLibs.langCC or false)) '' for dir in ${gccForLibs}/include/c++/*; do - include -isystem "$dir" >> $out/nix-support/libcxx-cxxflags + include -cxx-isystem "$dir" >> $out/nix-support/libcxx-cxxflags done for dir in ${gccForLibs}/include/c++/*/${targetPlatform.config}; do - include -isystem "$dir" >> $out/nix-support/libcxx-cxxflags + include -cxx-isystem "$dir" >> $out/nix-support/libcxx-cxxflags done '' + optionalString (libcxx.isLLVM or false) '' - include -isystem "${getDev libcxx}/include/c++/v1" >> $out/nix-support/libcxx-cxxflags + include -cxx-isystem "${getDev libcxx}/include/c++/v1" >> $out/nix-support/libcxx-cxxflags echo "-stdlib=libc++" >> $out/nix-support/libcxx-ldflags '' # GCC NG friendly libc++