1 { lowPrio, newScope, pkgs, lib, stdenv, cmake, gccForLibs
2 , libxml2, python3, isl, fetchurl, overrideCC, wrapCCWith, wrapBintoolsWith
4 , buildLlvmTools # tools, but from the previous stage, for cross
5 , targetLlvmLibraries # libraries, but from the next stage, for cross
9 release_version = "8.0.1";
10 version = release_version; # differentiating these is important for rc's
11 targetConfig = stdenv.targetPlatform.config;
13 fetch = name: sha256: fetchurl {
14 url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-${release_version}/${name}-${version}.src.tar.xz";
18 clang-tools-extra_src = fetch "clang-tools-extra" "1qf3097bc5ia8p6cpmbx985rjr3yaah5s8fc0nv7pw742yv7jw8q";
20 tools = lib.makeExtensible (tools: let
21 callPackage = newScope (tools // { inherit stdenv cmake libxml2 python3 isl release_version version fetch; });
22 mkExtraBuildCommands = cc: ''
23 rsrc="$out/resource-root"
25 ln -s "${cc}/lib/clang/${release_version}/include" "$rsrc"
26 ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib"
27 echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
31 llvm = callPackage ./llvm { };
33 llvm-polly = callPackage ./llvm { enablePolly = true; };
35 clang-unwrapped = callPackage ./clang {
37 inherit clang-tools-extra_src;
39 clang-polly-unwrapped = callPackage ./clang {
40 inherit clang-tools-extra_src;
41 llvm = tools.llvm-polly;
45 # disabled until recommonmark supports sphinx 3
46 #llvm-manpages = lowPrio (tools.llvm.override {
47 # enableManpages = true;
48 # python3 = pkgs.python3; # don't use python-boot
51 clang-manpages = lowPrio (tools.clang-unwrapped.override {
52 enableManpages = true;
53 python3 = pkgs.python3; # don't use python-boot
56 libclang = tools.clang-unwrapped.lib;
58 clang = if stdenv.cc.isGNU then tools.libstdcxxClang else tools.libcxxClang;
60 libstdcxxClang = wrapCCWith rec {
61 cc = tools.clang-unwrapped;
62 # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper.
65 targetLlvmLibraries.compiler-rt
67 extraBuildCommands = mkExtraBuildCommands cc;
70 libcxxClang = wrapCCWith rec {
71 cc = tools.clang-unwrapped;
72 libcxx = targetLlvmLibraries.libcxx;
74 targetLlvmLibraries.libcxxabi
75 targetLlvmLibraries.compiler-rt
77 extraBuildCommands = mkExtraBuildCommands cc;
80 lld = callPackage ./lld {};
82 lldb = callPackage ./lldb {};
84 # Below, is the LLVM bootstrapping logic. It handles building a
85 # fully LLVM toolchain from scratch. No GCC toolchain should be
86 # pulled in. As a consequence, it is very quick to build different
87 # targets provided by LLVM and we can also build for what GCC
88 # doesn’t support like LLVM. Probably we should move to some other
91 bintools = callPackage ./bintools.nix {};
93 lldClang = wrapCCWith rec {
94 cc = tools.clang-unwrapped;
95 libcxx = targetLlvmLibraries.libcxx;
96 bintools = wrapBintoolsWith {
97 inherit (tools) bintools;
100 targetLlvmLibraries.libcxxabi
101 targetLlvmLibraries.compiler-rt
102 ] ++ lib.optionals (!stdenv.targetPlatform.isWasm) [
103 targetLlvmLibraries.libunwind
105 extraBuildCommands = ''
106 echo "-rtlib=compiler-rt -Wno-unused-command-line-argument" >> $out/nix-support/cc-cflags
107 echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags
108 '' + lib.optionalString (!stdenv.targetPlatform.isWasm) ''
109 echo "--unwindlib=libunwind" >> $out/nix-support/cc-cflags
110 '' + lib.optionalString stdenv.targetPlatform.isWasm ''
111 echo "-fno-exceptions" >> $out/nix-support/cc-cflags
112 '' + mkExtraBuildCommands cc;
115 lldClangNoLibcxx = wrapCCWith rec {
116 cc = tools.clang-unwrapped;
118 bintools = wrapBintoolsWith {
119 inherit (tools) bintools;
122 targetLlvmLibraries.compiler-rt
124 extraBuildCommands = ''
125 echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags
126 echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags
127 echo "-nostdlib++" >> $out/nix-support/cc-cflags
128 '' + mkExtraBuildCommands cc;
131 lldClangNoLibc = wrapCCWith rec {
132 cc = tools.clang-unwrapped;
134 bintools = wrapBintoolsWith {
135 inherit (tools) bintools;
139 targetLlvmLibraries.compiler-rt
141 extraBuildCommands = ''
142 echo "-rtlib=compiler-rt" >> $out/nix-support/cc-cflags
143 echo "-B${targetLlvmLibraries.compiler-rt}/lib" >> $out/nix-support/cc-cflags
144 '' + mkExtraBuildCommands cc;
147 lldClangNoCompilerRt = wrapCCWith {
148 cc = tools.clang-unwrapped;
150 bintools = wrapBintoolsWith {
151 inherit (tools) bintools;
155 extraBuildCommands = ''
156 echo "-nostartfiles" >> $out/nix-support/cc-cflags
162 libraries = lib.makeExtensible (libraries: let
163 callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake libxml2 python3 isl release_version version fetch; });
166 compiler-rt = callPackage ./compiler-rt ({} //
167 (lib.optionalAttrs (stdenv.hostPlatform.useLLVM or false) {
168 stdenv = overrideCC stdenv buildLlvmTools.lldClangNoCompilerRt;
171 stdenv = overrideCC stdenv buildLlvmTools.clang;
173 libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang;
175 libcxx = callPackage ./libc++ ({} //
176 (lib.optionalAttrs (stdenv.hostPlatform.useLLVM or false) {
177 stdenv = overrideCC stdenv buildLlvmTools.lldClangNoLibcxx;
180 libcxxabi = callPackage ./libc++abi ({} //
181 (lib.optionalAttrs (stdenv.hostPlatform.useLLVM or false) {
182 stdenv = overrideCC stdenv buildLlvmTools.lldClangNoLibcxx;
183 libunwind = libraries.libunwind;
186 openmp = callPackage ./openmp.nix {};
188 libunwind = callPackage ./libunwind ({} //
189 (lib.optionalAttrs (stdenv.hostPlatform.useLLVM or false) {
190 stdenv = overrideCC stdenv buildLlvmTools.lldClangNoLibcxx;
195 in { inherit tools libraries; } // libraries // tools