aboutsummaryrefslogtreecommitdiff
path: root/nixpkgs/pkgs/development/compilers/llvm/7/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/llvm/7/default.nix')
-rw-r--r--nixpkgs/pkgs/development/compilers/llvm/7/default.nix74
1 files changed, 52 insertions, 22 deletions
diff --git a/nixpkgs/pkgs/development/compilers/llvm/7/default.nix b/nixpkgs/pkgs/development/compilers/llvm/7/default.nix
index 0b71c3a28d2..3dd067ae607 100644
--- a/nixpkgs/pkgs/development/compilers/llvm/7/default.nix
+++ b/nixpkgs/pkgs/development/compilers/llvm/7/default.nix
@@ -1,5 +1,6 @@
-{ lowPrio, newScope, pkgs, stdenv, cmake, gcc, libstdcxxHook
+{ 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,25 +59,18 @@ let
libstdcxxClang = wrapCCWith rec {
cc = tools.clang-unwrapped;
- extraTools = [
- libstdcxxHook
- ];
+ # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper.
+ libcxx = null;
extraPackages = [
targetLlvmLibraries.compiler-rt
];
- extraBuildCommands = ''
- echo "-target ${targetConfig}" >> $out/nix-support/cc-cflags
- echo "-B${gcc.cc}/lib/gcc/${targetConfig}/${gcc.version}" >> $out/nix-support/cc-cflags
- echo "-L${gcc.cc}/lib/gcc/${targetConfig}/${gcc.version}" >> $out/nix-support/cc-ldflags
- echo "-L${gcc.cc.lib}/${targetConfig}/lib" >> $out/nix-support/cc-ldflags
- '' + mkExtraBuildCommands cc;
+ extraBuildCommands = mkExtraBuildCommands cc;
};
libcxxClang = wrapCCWith rec {
cc = tools.clang-unwrapped;
libcxx = targetLlvmLibraries.libcxx;
extraPackages = [
- targetLlvmLibraries.libcxx
targetLlvmLibraries.libcxxabi
targetLlvmLibraries.compiler-rt
];
@@ -87,48 +81,77 @@ let
lldb = callPackage ./lldb.nix {};
+ # Below, is the LLVM bootstrapping logic. It handles building a
+ # fully LLVM toolchain from scratch. No GCC toolchain should be
+ # pulled in. As a consequence, it is very quick to build different
+ # targets provided by LLVM and we can also build for what GCC
+ # doesnโ€™t support like LLVM. Probably we should move to some other
+ # file.
+
bintools = callPackage ./bintools.nix {};
lldClang = wrapCCWith rec {
cc = tools.clang-unwrapped;
+ libcxx = targetLlvmLibraries.libcxx;
+ bintools = wrapBintoolsWith {
+ inherit (tools) bintools;
+ };
+ extraPackages = [
+ targetLlvmLibraries.libcxxabi
+ targetLlvmLibraries.compiler-rt
+ ];
+ extraBuildCommands = ''
+ echo "-rtlib=compiler-rt -Wno-unused-command-line-argument" >> $out/nix-support/cc-cflags
+ echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags
+ '' + stdenv.lib.optionalString (!stdenv.targetPlatform.isWasm) ''
+ echo "--unwindlib=libunwind" >> $out/nix-support/cc-cflags
+ '' + stdenv.lib.optionalString stdenv.targetPlatform.isWasm ''
+ echo "-fno-exceptions" >> $out/nix-support/cc-cflags
+ '' + mkExtraBuildCommands cc;
+ };
+
+ lldClangNoLibcxx = wrapCCWith rec {
+ cc = tools.clang-unwrapped;
+ libcxx = null;
bintools = wrapBintoolsWith {
inherit (tools) bintools;
};
extraPackages = [
- # targetLlvmLibraries.libcxx
- # targetLlvmLibraries.libcxxabi
targetLlvmLibraries.compiler-rt
];
extraBuildCommands = ''
- echo "-target ${stdenv.targetPlatform.config} -rtlib=compiler-rt" >> $out/nix-support/cc-cflags
+ echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags
+ echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags
+ echo "-nostdlib++" >> $out/nix-support/cc-cflags
'' + mkExtraBuildCommands cc;
};
lldClangNoLibc = wrapCCWith rec {
cc = tools.clang-unwrapped;
+ libcxx = null;
bintools = wrapBintoolsWith {
inherit (tools) bintools;
libc = null;
};
extraPackages = [
- # targetLlvmLibraries.libcxx
- # targetLlvmLibraries.libcxxabi
targetLlvmLibraries.compiler-rt
];
extraBuildCommands = ''
- echo "-target ${stdenv.targetPlatform.config} -rtlib=compiler-rt" >> $out/nix-support/cc-cflags
+ echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags
+ echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags
'' + mkExtraBuildCommands cc;
};
lldClangNoCompilerRt = wrapCCWith {
cc = tools.clang-unwrapped;
+ libcxx = null;
bintools = wrapBintoolsWith {
inherit (tools) bintools;
libc = null;
};
extraPackages = [ ];
extraBuildCommands = ''
- echo "-nostartfiles -target ${stdenv.targetPlatform.config}" >> $out/nix-support/cc-cflags
+ echo "-nostartfiles" >> $out/nix-support/cc-cflags
'';
};
@@ -148,9 +171,16 @@ let
libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang;
- libcxx = callPackage ./libc++ {};
+ libcxx = callPackage ./libc++ ({} //
+ (stdenv.lib.optionalAttrs (stdenv.hostPlatform.useLLVM or false) {
+ stdenv = overrideCC stdenv buildLlvmTools.lldClangNoLibcxx;
+ }));
- libcxxabi = callPackage ./libc++abi.nix {};
+ libcxxabi = callPackage ./libc++abi.nix ({} //
+ (stdenv.lib.optionalAttrs (stdenv.hostPlatform.useLLVM or false) {
+ stdenv = overrideCC stdenv buildLlvmTools.lldClangNoLibcxx;
+ libunwind = libraries.libunwind;
+ }));
openmp = callPackage ./openmp.nix {};
});