From 92f96f47b05543074e61f1879769d52aa3ddfe66 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Wed, 17 Jun 2020 20:33:56 +0000 Subject: [PATCH] treewide: Get rid of `cc.gcc` Instead, we have a new `gccForLibs`, which has the appropriate definition for e.g. avoiding `x86_32` linking problems. --- pkgs/build-support/cc-wrapper/default.nix | 18 ++++--- .../compilers/computecpp/default.nix | 2 - .../fastcomp/emscripten-fastcomp.nix | 10 ++-- .../compilers/llvm/10/clang/default.nix | 2 - .../development/compilers/llvm/10/default.nix | 10 ++-- .../compilers/llvm/5/clang/default.nix | 3 -- pkgs/development/compilers/llvm/5/default.nix | 10 ++-- .../compilers/llvm/6/clang/default.nix | 3 -- pkgs/development/compilers/llvm/6/default.nix | 10 ++-- .../compilers/llvm/7/clang/default.nix | 2 - pkgs/development/compilers/llvm/7/default.nix | 10 ++-- .../compilers/llvm/8/clang/default.nix | 2 - pkgs/development/compilers/llvm/8/default.nix | 10 ++-- .../compilers/llvm/9/clang/default.nix | 2 - pkgs/development/compilers/llvm/9/default.nix | 10 ++-- pkgs/development/compilers/swift/default.nix | 7 +-- pkgs/top-level/all-packages.nix | 53 +++++++++---------- 17 files changed, 78 insertions(+), 86 deletions(-) diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index 1fef3c459086271..774567f9247e0ae 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -8,6 +8,7 @@ { name ? "" , stdenvNoCC , cc ? null, libc ? null, bintools, coreutils ? null, shell ? stdenvNoCC.shell +, gccForLibs ? null , zlib ? null , nativeTools, noLibc ? false, nativeLibc, nativePrefix ? "" , propagateDoc ? cc != null && cc ? man @@ -262,11 +263,11 @@ stdenv.mkDerivation { ## ## GCC libs for non-GCC support ## - + optionalString (isClang && libcxx == null && cc ? gcc) '' + + optionalString (isClang && libcxx == null && !(stdenv.targetPlatform.useLLVM or false) && gccForLibs != null) '' - 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 + echo "-B${gccForLibs}/lib/gcc/${targetPlatform.config}/${gccForLibs.version}" >> $out/nix-support/cc-cflags + echo "-L${gccForLibs}/lib/gcc/${targetPlatform.config}/${gccForLibs.version}" >> $out/nix-support/cc-ldflags + echo "-L${gccForLibs.lib}/${targetPlatform.config}/lib" >> $out/nix-support/cc-ldflags '' ## @@ -306,14 +307,15 @@ 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 || cc.gcc.langCC or false || (isGNU && cc.langCC or false)) '' + + optionalString (libcxx != null || (isClang && !(stdenv.targetPlatform.useLLVM or false) && gccForLibs.langCC or false) || (isGNU && cc.langCC or false)) '' touch "$out/nix-support/libcxx-cxxflags" touch "$out/nix-support/libcxx-ldflags" - '' + optionalString (libcxx == null && cc ? gcc) '' - for dir in ${cc.gcc}/include/c++/*; do + '' + + optionalString (libcxx == null && (isClang && !(stdenv.targetPlatform.useLLVM or false) && gccForLibs.langCC or false)) '' + for dir in ${gccForLibs}/include/c++/*; do echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags done - for dir in ${cc.gcc}/include/c++/*/${targetPlatform.config}; do + for dir in ${gccForLibs}/include/c++/*/${targetPlatform.config}; do echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags done '' diff --git a/pkgs/development/compilers/computecpp/default.nix b/pkgs/development/compilers/computecpp/default.nix index 68d11bdf8b19414..31a0b054ee72936 100644 --- a/pkgs/development/compilers/computecpp/default.nix +++ b/pkgs/development/compilers/computecpp/default.nix @@ -37,8 +37,6 @@ stdenv.mkDerivation rec { passthru = { isClang = true; - } // stdenv.lib.optionalAttrs (stdenv.targetPlatform.isLinux || (stdenv.cc.isGNU && stdenv.cc.cc ? gcc)) { - gcc = if stdenv.cc.isGNU then stdenv.cc.cc else stdenv.cc.cc.gcc; }; meta = with stdenv.lib; { diff --git a/pkgs/development/compilers/emscripten/fastcomp/emscripten-fastcomp.nix b/pkgs/development/compilers/emscripten/fastcomp/emscripten-fastcomp.nix index b74c5c7e9e4580d..f8f06e24f8ba754 100644 --- a/pkgs/development/compilers/emscripten/fastcomp/emscripten-fastcomp.nix +++ b/pkgs/development/compilers/emscripten/fastcomp/emscripten-fastcomp.nix @@ -1,9 +1,7 @@ -{ emscriptenVersion, stdenv, fetchFromGitHub, cmake, python, gtest, ... }: +{ emscriptenVersion, stdenv, fetchFromGitHub, cmake, python, gtest, gccForLibs, ... }: let rev = emscriptenVersion; - haveGcc = stdenv.cc.isGNU || stdenv.cc.cc ? gcc; - gcc = if stdenv.cc.isGNU then stdenv.cc.cc else stdenv.cc.cc.gcc; in stdenv.mkDerivation rec { name = "emscripten-fastcomp-${rev}"; @@ -35,16 +33,14 @@ stdenv.mkDerivation rec { #"-DLLVM_CONFIG=${llvm}/bin/llvm-config" "-DLLVM_BUILD_TESTS=ON" "-DCLANG_INCLUDE_TESTS=ON" - ] ++ (stdenv.lib.optional (stdenv.isLinux && haveGcc) + ] ++ (stdenv.lib.optional stdenv.isLinux # necessary for clang to find crtend.o - "-DGCC_INSTALL_PREFIX=${gcc}" + "-DGCC_INSTALL_PREFIX=${gccForLibs}" ); enableParallelBuilding = true; passthru = { isClang = true; - } // stdenv.lib.optionalAttrs haveGcc { - inherit gcc; }; meta = with stdenv.lib; { diff --git a/pkgs/development/compilers/llvm/10/clang/default.nix b/pkgs/development/compilers/llvm/10/clang/default.nix index 63a0af69a232799..2ba213428bcd474 100644 --- a/pkgs/development/compilers/llvm/10/clang/default.nix +++ b/pkgs/development/compilers/llvm/10/clang/default.nix @@ -86,8 +86,6 @@ let passthru = { isClang = true; inherit llvm; - } // stdenv.lib.optionalAttrs (stdenv.targetPlatform.isLinux || (stdenv.cc.isGNU && stdenv.cc.cc ? gcc)) { - gcc = if stdenv.cc.isGNU then stdenv.cc.cc else stdenv.cc.cc.gcc; }; meta = { diff --git a/pkgs/development/compilers/llvm/10/default.nix b/pkgs/development/compilers/llvm/10/default.nix index cd77eed9ac804f9..37ab89a5a315e06 100644 --- a/pkgs/development/compilers/llvm/10/default.nix +++ b/pkgs/development/compilers/llvm/10/default.nix @@ -1,5 +1,6 @@ -{ lowPrio, newScope, pkgs, stdenv, cmake +{ lowPrio, newScope, pkgs, stdenv, cmake, gccForLibs , libxml2, python3, isl, fetchurl, overrideCC, wrapCCWith, wrapBintoolsWith +, buildPackages , buildLlvmTools # tools, but from the previous stage, for cross , targetLlvmLibraries # libraries, but from the next stage, for cross }: @@ -24,8 +25,8 @@ let ln -s "${cc}/lib/clang/${release_version}/include" "$rsrc" ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags - '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && tools.clang-unwrapped ? gcc && !(stdenv.targetPlatform.useLLVM or false)) '' - echo "--gcc-toolchain=${tools.clang-unwrapped.gcc}" >> $out/nix-support/cc-cflags + '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && !(stdenv.targetPlatform.useLLVM or false)) '' + echo "--gcc-toolchain=${gccForLibs}" >> $out/nix-support/cc-cflags ''; in { @@ -59,7 +60,8 @@ let libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; - libcxx = null; # libstdcxx is smuggled in with clang.gcc + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; extraPackages = [ targetLlvmLibraries.compiler-rt ]; diff --git a/pkgs/development/compilers/llvm/5/clang/default.nix b/pkgs/development/compilers/llvm/5/clang/default.nix index 1016398992fbbe5..446d035fb514ad7 100644 --- a/pkgs/development/compilers/llvm/5/clang/default.nix +++ b/pkgs/development/compilers/llvm/5/clang/default.nix @@ -4,7 +4,6 @@ }: let - gcc = if stdenv.cc.isGNU then stdenv.cc.cc else stdenv.cc.cc.gcc; self = stdenv.mkDerivation ({ pname = "clang"; inherit version; @@ -77,8 +76,6 @@ let passthru = { isClang = true; inherit llvm; - } // stdenv.lib.optionalAttrs stdenv.isLinux { - inherit gcc; }; meta = { diff --git a/pkgs/development/compilers/llvm/5/default.nix b/pkgs/development/compilers/llvm/5/default.nix index 5a992f4a3504f88..36495249d16f270 100644 --- a/pkgs/development/compilers/llvm/5/default.nix +++ b/pkgs/development/compilers/llvm/5/default.nix @@ -1,5 +1,6 @@ -{ lowPrio, newScope, pkgs, stdenv, cmake +{ lowPrio, newScope, pkgs, stdenv, cmake, gccForLibs , libxml2, python3, isl, fetchurl, overrideCC, wrapCCWith +, buildPackages , buildLlvmTools # tools, but from the previous stage, for cross , targetLlvmLibraries # libraries, but from the next stage, for cross }: @@ -24,8 +25,8 @@ let ln -s "${cc}/lib/clang/${release_version}/include" "$rsrc" ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags - '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && tools.clang-unwrapped ? gcc && !(stdenv.targetPlatform.useLLVM or false)) '' - echo "--gcc-toolchain=${tools.clang-unwrapped.gcc}" >> $out/nix-support/cc-cflags + '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && !(stdenv.targetPlatform.useLLVM or false)) '' + echo "--gcc-toolchain=${gccForLibs}" >> $out/nix-support/cc-cflags ''; in { @@ -51,7 +52,8 @@ let libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; - libcxx = null; # libstdcxx is smuggled in with clang.gcc + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; extraPackages = [ targetLlvmLibraries.compiler-rt ]; diff --git a/pkgs/development/compilers/llvm/6/clang/default.nix b/pkgs/development/compilers/llvm/6/clang/default.nix index e2f7166354ae549..6ed88cc86d1bb1b 100644 --- a/pkgs/development/compilers/llvm/6/clang/default.nix +++ b/pkgs/development/compilers/llvm/6/clang/default.nix @@ -4,7 +4,6 @@ }: let - gcc = if stdenv.cc.isGNU then stdenv.cc.cc else stdenv.cc.cc.gcc; self = stdenv.mkDerivation ({ pname = "clang"; inherit version; @@ -77,8 +76,6 @@ let passthru = { isClang = true; inherit llvm; - } // stdenv.lib.optionalAttrs stdenv.targetPlatform.isLinux { - inherit gcc; }; meta = { diff --git a/pkgs/development/compilers/llvm/6/default.nix b/pkgs/development/compilers/llvm/6/default.nix index 2316fbfc3fb26f7..4c2e87ec5e1afbe 100644 --- a/pkgs/development/compilers/llvm/6/default.nix +++ b/pkgs/development/compilers/llvm/6/default.nix @@ -1,5 +1,6 @@ -{ lowPrio, newScope, pkgs, stdenv, cmake +{ lowPrio, newScope, pkgs, stdenv, cmake, gccForLibs , libxml2, python3, isl, fetchurl, overrideCC, wrapCCWith +, buildPackages , buildLlvmTools # tools, but from the previous stage, for cross , targetLlvmLibraries # libraries, but from the next stage, for cross }: @@ -24,8 +25,8 @@ let ln -s "${cc}/lib/clang/${release_version}/include" "$rsrc" ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags - '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && tools.clang-unwrapped ? gcc && !(stdenv.targetPlatform.useLLVM or false)) '' - echo "--gcc-toolchain=${tools.clang-unwrapped.gcc}" >> $out/nix-support/cc-cflags + '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && !(stdenv.targetPlatform.useLLVM or false)) '' + echo "--gcc-toolchain=${gccForLibs}" >> $out/nix-support/cc-cflags ''; in { @@ -51,7 +52,8 @@ let libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; - libcxx = null; # libstdcxx is smuggled in with clang.gcc + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; extraPackages = [ targetLlvmLibraries.compiler-rt ]; diff --git a/pkgs/development/compilers/llvm/7/clang/default.nix b/pkgs/development/compilers/llvm/7/clang/default.nix index 18ea46ea39c4076..ef9a541026fc745 100644 --- a/pkgs/development/compilers/llvm/7/clang/default.nix +++ b/pkgs/development/compilers/llvm/7/clang/default.nix @@ -87,8 +87,6 @@ let passthru = { isClang = true; inherit llvm; - } // stdenv.lib.optionalAttrs (stdenv.targetPlatform.isLinux || (stdenv.cc.isGNU && stdenv.cc.cc ? gcc)) { - gcc = if stdenv.cc.isGNU then stdenv.cc.cc else stdenv.cc.cc.gcc; }; meta = { diff --git a/pkgs/development/compilers/llvm/7/default.nix b/pkgs/development/compilers/llvm/7/default.nix index b83c0d2ceedde9d..3dd067ae607ecfa 100644 --- a/pkgs/development/compilers/llvm/7/default.nix +++ b/pkgs/development/compilers/llvm/7/default.nix @@ -1,5 +1,6 @@ -{ lowPrio, newScope, pkgs, stdenv, cmake +{ lowPrio, newScope, pkgs, stdenv, cmake, gccForLibs , libxml2, python3, isl, fetchurl, overrideCC, wrapCCWith, wrapBintoolsWith +, buildPackages , buildLlvmTools # tools, but from the previous stage, for cross , targetLlvmLibraries # libraries, but from the next stage, for cross }: @@ -24,8 +25,8 @@ let ln -s "${cc}/lib/clang/${release_version}/include" "$rsrc" ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags - '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && tools.clang-unwrapped ? gcc && !(stdenv.targetPlatform.useLLVM or false)) '' - echo "--gcc-toolchain=${tools.clang-unwrapped.gcc}" >> $out/nix-support/cc-cflags + '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && !(stdenv.targetPlatform.useLLVM or false)) '' + echo "--gcc-toolchain=${gccForLibs}" >> $out/nix-support/cc-cflags ''; in { @@ -58,7 +59,8 @@ let libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; - libcxx = null; # libstdcxx is smuggled in with clang.gcc + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; extraPackages = [ targetLlvmLibraries.compiler-rt ]; diff --git a/pkgs/development/compilers/llvm/8/clang/default.nix b/pkgs/development/compilers/llvm/8/clang/default.nix index 3b398628e567cab..eed70ce684d1298 100644 --- a/pkgs/development/compilers/llvm/8/clang/default.nix +++ b/pkgs/development/compilers/llvm/8/clang/default.nix @@ -97,8 +97,6 @@ let passthru = { isClang = true; inherit llvm; - } // stdenv.lib.optionalAttrs (stdenv.targetPlatform.isLinux || (stdenv.cc.isGNU && stdenv.cc.cc ? gcc)) { - gcc = if stdenv.cc.isGNU then stdenv.cc.cc else stdenv.cc.cc.gcc; }; meta = { diff --git a/pkgs/development/compilers/llvm/8/default.nix b/pkgs/development/compilers/llvm/8/default.nix index 984e7ab74b74d87..6e80737f32adb15 100644 --- a/pkgs/development/compilers/llvm/8/default.nix +++ b/pkgs/development/compilers/llvm/8/default.nix @@ -1,5 +1,6 @@ -{ lowPrio, newScope, pkgs, stdenv, cmake +{ lowPrio, newScope, pkgs, stdenv, cmake, gccForLibs , libxml2, python3, isl, fetchurl, overrideCC, wrapCCWith, wrapBintoolsWith +, buildPackages , buildLlvmTools # tools, but from the previous stage, for cross , targetLlvmLibraries # libraries, but from the next stage, for cross }: @@ -24,8 +25,8 @@ let ln -s "${cc}/lib/clang/${release_version}/include" "$rsrc" ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags - '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && tools.clang-unwrapped ? gcc && !(stdenv.targetPlatform.useLLVM or false)) '' - echo "--gcc-toolchain=${tools.clang-unwrapped.gcc}" >> $out/nix-support/cc-cflags + '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && !(stdenv.targetPlatform.useLLVM or false)) '' + echo "--gcc-toolchain=${gccForLibs}" >> $out/nix-support/cc-cflags ''; in { @@ -59,7 +60,8 @@ let libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; - libcxx = null; # libstdcxx is smuggled in with clang.gcc + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; extraPackages = [ targetLlvmLibraries.compiler-rt ]; diff --git a/pkgs/development/compilers/llvm/9/clang/default.nix b/pkgs/development/compilers/llvm/9/clang/default.nix index c938a01f8979eb4..d8a7df1424dd01f 100644 --- a/pkgs/development/compilers/llvm/9/clang/default.nix +++ b/pkgs/development/compilers/llvm/9/clang/default.nix @@ -92,8 +92,6 @@ let passthru = { isClang = true; inherit llvm; - } // stdenv.lib.optionalAttrs (stdenv.targetPlatform.isLinux || (stdenv.cc.isGNU && stdenv.cc.cc ? gcc)) { - gcc = if stdenv.cc.isGNU then stdenv.cc.cc else stdenv.cc.cc.gcc; }; meta = { diff --git a/pkgs/development/compilers/llvm/9/default.nix b/pkgs/development/compilers/llvm/9/default.nix index 816a4f3d2302f7d..6f5bdb8e8cc10c2 100644 --- a/pkgs/development/compilers/llvm/9/default.nix +++ b/pkgs/development/compilers/llvm/9/default.nix @@ -1,5 +1,6 @@ -{ lowPrio, newScope, pkgs, stdenv, cmake +{ lowPrio, newScope, pkgs, stdenv, cmake, gccForLibs , libxml2, python3, isl, fetchurl, overrideCC, wrapCCWith, wrapBintoolsWith +, buildPackages , buildLlvmTools # tools, but from the previous stage, for cross , targetLlvmLibraries # libraries, but from the next stage, for cross }: @@ -24,8 +25,8 @@ let ln -s "${cc}/lib/clang/${release_version}/include" "$rsrc" ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib" echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags - '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && tools.clang-unwrapped ? gcc && !(stdenv.targetPlatform.useLLVM or false)) '' - echo "--gcc-toolchain=${tools.clang-unwrapped.gcc}" >> $out/nix-support/cc-cflags + '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && !(stdenv.targetPlatform.useLLVM or false)) '' + echo "--gcc-toolchain=${gccForLibs}" >> $out/nix-support/cc-cflags ''; in { @@ -59,7 +60,8 @@ let libstdcxxClang = wrapCCWith rec { cc = tools.clang-unwrapped; - libcxx = null; # libstdcxx is smuggled in with clang.gcc + # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper. + libcxx = null; extraPackages = [ targetLlvmLibraries.compiler-rt ]; diff --git a/pkgs/development/compilers/swift/default.nix b/pkgs/development/compilers/swift/default.nix index b838aa59177e17e..36929209d598191 100644 --- a/pkgs/development/compilers/swift/default.nix +++ b/pkgs/development/compilers/swift/default.nix @@ -2,6 +2,7 @@ , cmake , coreutils , glibc +, gccForLibs , which , perl , libedit @@ -121,7 +122,7 @@ let cmakeFlags = [ "-DGLIBC_INCLUDE_PATH=${stdenv.cc.libc.dev}/include" "-DC_INCLUDE_DIRS=${stdenv.lib.makeSearchPathOutput "dev" "include" devInputs}:${libxml2.dev}/include/libxml2" - "-DGCC_INSTALL_PREFIX=${clang.cc.gcc}" + "-DGCC_INSTALL_PREFIX=${gccForLibs}" ]; in @@ -199,7 +200,7 @@ stdenv.mkDerivation { substituteInPlace swift/stdlib/public/Platform/CMakeLists.txt \ --replace '/usr/include' "${stdenv.cc.libc.dev}/include" substituteInPlace swift/utils/build-script-impl \ - --replace '/usr/include/c++' "${clang.cc.gcc}/include/c++" + --replace '/usr/include/c++' "${gccForLibs}/include/c++" patch -p1 -d swift -i ${./patches/glibc-arch-headers.patch} patch -p1 -d swift -i ${./patches/0001-build-presets-linux-don-t-require-using-Ninja.patch} patch -p1 -d swift -i ${./patches/0002-build-presets-linux-allow-custom-install-prefix.patch} @@ -264,7 +265,7 @@ stdenv.mkDerivation { export NIX_CFLAGS_COMPILE="$(< $NIX_CC/nix-support/libcxx-cxxflags) $NIX_CFLAGS_COMPILE" # During the Swift build, a full local LLVM build is performed and the resulting clang is invoked. # This compiler is not using the Nix wrappers, so it needs some help to find things. - export NIX_LDFLAGS_BEFORE="-rpath ${clang.cc.gcc.lib}/lib -L${clang.cc.gcc.lib}/lib $NIX_LDFLAGS_BEFORE" + export NIX_LDFLAGS_BEFORE="-rpath ${gccForLibs.lib}/lib -L${gccForLibs.lib}/lib $NIX_LDFLAGS_BEFORE" # However, we want to use the wrapped compiler whenever possible. export CC="${clang}/bin/clang" diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 6666377f7674d57..c3a8d1f9897606e 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -8319,8 +8319,8 @@ in mkdir -p "$rsrc/lib" ln -s "${cc}/lib" "$rsrc/include" echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags - '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && cc ? gcc && !(stdenv.targetPlatform.useLLVM or false)) '' - echo "--gcc-toolchain=${cc.gcc}" >> $out/nix-support/cc-cflags + '' + stdenv.lib.optionalString (stdenv.targetPlatform.isLinux && !(stdenv.targetPlatform.useLLVM or false)) '' + echo "--gcc-toolchain=${gccForLibs}" >> $out/nix-support/cc-cflags ''; }; @@ -9112,55 +9112,41 @@ in llvmPackages = recurseIntoAttrs llvmPackages_7; - llvmPackages_5 = callPackage ../development/compilers/llvm/5 ({ + llvmPackages_5 = callPackage ../development/compilers/llvm/5 { inherit (stdenvAdapters) overrideCC; buildLlvmTools = buildPackages.llvmPackages_5.tools; targetLlvmLibraries = targetPackages.llvmPackages_5.libraries; - } // stdenv.lib.optionalAttrs (stdenv.hostPlatform.isi686 && stdenv.cc.isGNU) { - stdenv = gcc6Stdenv; # with gcc-7: undefined reference to `__divmoddi4' - }); + }; - llvmPackages_6 = callPackage ../development/compilers/llvm/6 ({ + llvmPackages_6 = callPackage ../development/compilers/llvm/6 { inherit (stdenvAdapters) overrideCC; buildLlvmTools = buildPackages.llvmPackages_6.tools; targetLlvmLibraries = targetPackages.llvmPackages_6.libraries; - } // stdenv.lib.optionalAttrs (stdenv.hostPlatform.isi686 && stdenv.cc.isGNU) { - # with gcc-7 on i686: undefined reference to `__divmoddi4' - # Failing tests with gcc8. - stdenv = overrideCC stdenv (if stdenv.hostPlatform.isi686 then gcc6 else gcc7); - }); + }; - llvmPackages_7 = callPackage ../development/compilers/llvm/7 ({ + llvmPackages_7 = callPackage ../development/compilers/llvm/7 { inherit (stdenvAdapters) overrideCC; buildLlvmTools = buildPackages.llvmPackages_7.tools; targetLlvmLibraries = targetPackages.llvmPackages_7.libraries; - } // stdenv.lib.optionalAttrs (stdenv.hostPlatform.isi686 && buildPackages.stdenv.cc.isGNU) { - stdenv = gcc6Stdenv; # with gcc-7: undefined reference to `__divmoddi4' - }); + }; - llvmPackages_8 = callPackage ../development/compilers/llvm/8 ({ + llvmPackages_8 = callPackage ../development/compilers/llvm/8 { inherit (stdenvAdapters) overrideCC; buildLlvmTools = buildPackages.llvmPackages_8.tools; targetLlvmLibraries = targetPackages.llvmPackages_8.libraries; - } // stdenv.lib.optionalAttrs (stdenv.hostPlatform.isi686 && buildPackages.stdenv.cc.isGNU) { - stdenv = gcc6Stdenv; # with gcc-7: undefined reference to `__divmoddi4' - }); + }; - llvmPackages_9 = callPackage ../development/compilers/llvm/9 ({ + llvmPackages_9 = callPackage ../development/compilers/llvm/9 { inherit (stdenvAdapters) overrideCC; buildLlvmTools = buildPackages.llvmPackages_9.tools; targetLlvmLibraries = targetPackages.llvmPackages_9.libraries; - } // stdenv.lib.optionalAttrs (stdenv.hostPlatform.isi686 && buildPackages.stdenv.cc.isGNU) { - stdenv = gcc6Stdenv; # with gcc-7: undefined reference to `__divmoddi4' - }); + }; - llvmPackages_10 = callPackage ../development/compilers/llvm/10 ({ + llvmPackages_10 = callPackage ../development/compilers/llvm/10 { inherit (stdenvAdapters) overrideCC; buildLlvmTools = buildPackages.llvmPackages_10.tools; targetLlvmLibraries = targetPackages.llvmPackages_10.libraries; - } // stdenv.lib.optionalAttrs (stdenv.hostPlatform.isi686 && buildPackages.stdenv.cc.isGNU) { - stdenv = gcc7Stdenv; - }); + }; llvmPackages_latest = llvmPackages_10; @@ -10496,6 +10482,17 @@ in stdenvNoLibs = gccStdenvNoLibs; # cannot be built with clang it seems }; + # This is for e.g. LLVM libraries on linux. + gccForLibs = + # with gcc-7: undefined reference to `__divmoddi4' + if stdenv.targetPlatform.isi686 + then gcc6.cc + else if stdenv.targetPlatform == stdenv.hostPlatform && targetPackages.stdenv.cc.isGNU + # Can only do this is in the native case, otherwise we might get infinite + # recursion if `targetPackages.stdenv.cc.cc` itself uses `gccForLibs`. + then targetPackages.stdenv.cc.cc + else gcc.cc; + libstdcxx5 = callPackage ../development/libraries/gcc/libstdc++/5.nix { }; libsigrok = callPackage ../development/tools/libsigrok { };