diff options
author | John Ericson <git@JohnEricson.me> | 2020-04-13 20:44:43 -0400 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2020-11-27 13:27:16 +0000 |
commit | 41c637e4b3b17f19b6ce705bdb755e8f98eabb0b (patch) | |
tree | be6af446196d0a10e3770aba8e1b7a13191e774d /nixpkgs/pkgs/build-support/cc-wrapper/default.nix | |
parent | 1949213e7997ac860af25d47f846e8b3cb6ecc09 (diff) | |
download | nixlib-41c637e4b3b17f19b6ce705bdb755e8f98eabb0b.tar nixlib-41c637e4b3b17f19b6ce705bdb755e8f98eabb0b.tar.gz nixlib-41c637e4b3b17f19b6ce705bdb755e8f98eabb0b.tar.bz2 nixlib-41c637e4b3b17f19b6ce705bdb755e8f98eabb0b.tar.lz nixlib-41c637e4b3b17f19b6ce705bdb755e8f98eabb0b.tar.xz nixlib-41c637e4b3b17f19b6ce705bdb755e8f98eabb0b.tar.zst nixlib-41c637e4b3b17f19b6ce705bdb755e8f98eabb0b.zip |
C++ Compilers: Systematize handling of standard libraries
(cherry picked from commit f3f7612a409e4ebbec634ab7f20e094f206d396a)
Diffstat (limited to 'nixpkgs/pkgs/build-support/cc-wrapper/default.nix')
-rw-r--r-- | nixpkgs/pkgs/build-support/cc-wrapper/default.nix | 61 |
1 files changed, 46 insertions, 15 deletions
diff --git a/nixpkgs/pkgs/build-support/cc-wrapper/default.nix b/nixpkgs/pkgs/build-support/cc-wrapper/default.nix index da16a23f9dff..e23d1c6dd4e6 100644 --- a/nixpkgs/pkgs/build-support/cc-wrapper/default.nix +++ b/nixpkgs/pkgs/build-support/cc-wrapper/default.nix @@ -48,12 +48,6 @@ let # The wrapper scripts use 'cat' and 'grep', so we may need coreutils. coreutils_bin = if nativeTools then "" else getBin coreutils; - default_cxx_stdlib_compile = if (targetPlatform.isLinux && !(cc.isGNU or false) && !nativeTools && cc ? gcc) && !(targetPlatform.useLLVM or false) then - "-isystem $(echo -n ${cc.gcc}/include/c++/*) -isystem $(echo -n ${cc.gcc}/include/c++/*)/${targetPlatform.config}" - else if targetPlatform.isDarwin && (libcxx != null) && (cc.isClang or false) && !(targetPlatform.useLLVM or false) then - "-isystem ${libcxx}/include/c++/v1" - else ""; - # The "suffix salt" is a arbitrary string added in the end of env vars # defined by cc-wrapper's hooks so that multiple cc-wrappers can be used # without interfering. For the moment, it is defined as the target triple, @@ -68,7 +62,7 @@ let # older compilers (for example bootstrap's GCC 5) fail with -march=too-modern-cpu isGccArchSupported = arch: - if cc.isGNU or false then + if isGNU then { skylake = versionAtLeast ccVersion "6.0"; skylake-avx512 = versionAtLeast ccVersion "6.0"; cannonlake = versionAtLeast ccVersion "8.0"; @@ -76,7 +70,7 @@ let icelake-server = versionAtLeast ccVersion "8.0"; knm = versionAtLeast ccVersion "8.0"; }.${arch} or true - else if cc.isClang or false then + else if isClang then { cannonlake = versionAtLeast ccVersion "5.0"; icelake-client = versionAtLeast ccVersion "7.0"; icelake-server = versionAtLeast ccVersion "7.0"; @@ -116,7 +110,7 @@ stdenv.mkDerivation { # Binutils, and Apple's "cctools"; "bintools" as an attempt to find an # unused middle-ground name that evokes both. inherit bintools; - inherit libc nativeTools nativeLibc nativePrefix isGNU isClang default_cxx_stdlib_compile; + inherit libc nativeTools nativeLibc nativePrefix isGNU isClang; emacsBufferSetup = pkgs: '' ; We should handle propagation here too @@ -173,8 +167,6 @@ stdenv.mkDerivation { export named_cc=${targetPrefix}cc export named_cxx=${targetPrefix}c++ - export default_cxx_stdlib_compile="${default_cxx_stdlib_compile}" - if [ -e $ccPath/${targetPrefix}gcc ]; then wrap ${targetPrefix}gcc $wrapper $ccPath/${targetPrefix}gcc ln -s ${targetPrefix}gcc $out/bin/${targetPrefix}cc @@ -226,7 +218,7 @@ stdenv.mkDerivation { strictDeps = true; propagatedBuildInputs = [ bintools ] ++ extraTools ++ optionals cc.langD or false [ zlib ]; - depsTargetTargetPropagated = extraPackages; + depsTargetTargetPropagated = optional (libcxx != null) libcxx ++ extraPackages; wrapperName = "CC_WRAPPER"; @@ -250,6 +242,24 @@ stdenv.mkDerivation { fi '' + + optionalString isClang '' + ## + ## General Clang support + ## + + echo "-target ${targetPlatform.config}" >> $out/nix-support/cc-cflags + '' + + + optionalString (isClang && libcxx == null && cc ? gcc) '' + ## + ## GCC libs for non-GCC support + ## + + echo "-B${cc.gcc}/lib/gcc/${targetPlatform.config}/${cc.gcc.version}" >> $out/nix-support/cc-cflags + echo "-L${cc.gcc}/lib/gcc/${targetPlatform.config}/${cc.gcc.version}" >> $out/nix-support/cc-ldflags + echo "-L${cc.gcc.lib}/${targetPlatform.config}/lib" >> $out/nix-support/cc-ldflags + '' + + optionalString (libc != null) ('' ## ## General libc support @@ -279,6 +289,27 @@ stdenv.mkDerivation { echo "${libc_dev}" > $out/nix-support/orig-libc-dev '') + + '' + ## + ## General libc++ support + ## + + '' + + optionalString (libcxx == null && cc ? gcc) '' + for dir in ${cc.gcc}/include/c++/*; do + echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags + done + for dir in ${cc.gcc}/include/c++/*/${targetPlatform.config}; do + echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags + done + '' + + optionalString (libcxx.isLLVM or false) ('' + echo "-isystem ${libcxx}/include/c++/v1" >> $out/nix-support/libcxx-cxxflags + echo "-stdlib=libc++" >> $out/nix-support/libcxx-ldflags + '' + stdenv.lib.optionalString stdenv.targetPlatform.isLinux '' + echo "-lc++abi" >> $out/nix-support/libcxx-ldflags + '') + + optionalString (!nativeTools) '' ## ## Initial CFLAGS @@ -389,9 +420,9 @@ stdenv.mkDerivation { # There are a few tools (to name one libstdcxx5) which do not work # well with multi line flags, so make the flags single line again + '' - if [ -e "$out/nix-support/libc-cflags" ]; then - substituteInPlace "$out/nix-support/libc-cflags" --replace $'\n' ' ' - fi + for flags in "$out/nix-support"/*flags; do + substituteInPlace "$flags" --replace $'\n' ' ' + done substituteAll ${./add-flags.sh} $out/nix-support/add-flags.sh substituteAll ${./add-hardening.sh} $out/nix-support/add-hardening.sh |