nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{ lowPrio, newScope, pkgs, lib, stdenv, cmake, gccForLibs
2, libxml2, python3, isl, fetchurl, overrideCC, wrapCCWith
3, buildLlvmTools # tools, but from the previous stage, for cross
4, targetLlvmLibraries # libraries, but from the next stage, for cross
5, targetLlvm
6}:
7
8let
9 release_version = "6.0.1";
10 version = release_version; # differentiating these is important for rc's
11 targetConfig = stdenv.targetPlatform.config;
12
13 fetch = name: sha256: fetchurl {
14 url = "https://releases.llvm.org/${release_version}/${name}-${version}.src.tar.xz";
15 inherit sha256;
16 };
17
18 clang-tools-extra_src = fetch "clang-tools-extra" "1w8ml7fyn4vyxmy59n2qm4r1k1kgwgwkaldp6m45fdv4g0kkfbhd";
19
20 llvm_meta = {
21 license = lib.licenses.ncsa;
22 maintainers = lib.teams.llvm.members;
23
24 # See llvm/cmake/config-ix.cmake.
25 platforms =
26 lib.platforms.aarch64 ++
27 lib.platforms.arm ++
28 lib.platforms.mips ++
29 lib.platforms.power ++
30 lib.platforms.s390x ++
31 lib.platforms.wasi ++
32 lib.platforms.x86;
33 };
34
35 tools = lib.makeExtensible (tools: let
36 callPackage = newScope (tools // { inherit stdenv cmake libxml2 python3 isl release_version version fetch buildLlvmTools; });
37 mkExtraBuildCommands = cc: ''
38 rsrc="$out/resource-root"
39 mkdir "$rsrc"
40 ln -s "${cc.lib}/lib/clang/${release_version}/include" "$rsrc"
41 echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
42 ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib"
43 '';
44
45 in {
46
47 libllvm = callPackage ./llvm {
48 inherit llvm_meta;
49 };
50
51 # `llvm` historically had the binaries. When choosing an output explicitly,
52 # we need to reintroduce `outputSpecified` to get the expected behavior e.g. of lib.get*
53 llvm = tools.libllvm;
54
55 libllvm-polly = callPackage ./llvm {
56 inherit llvm_meta;
57 enablePolly = true;
58 };
59
60 llvm-polly = tools.libllvm-polly.lib // { outputSpecified = false; };
61
62 libclang = callPackage ./clang {
63 inherit clang-tools-extra_src llvm_meta;
64 };
65
66 clang-unwrapped = tools.libclang;
67
68 llvm-manpages = lowPrio (tools.libllvm.override {
69 enableManpages = true;
70 enableSharedLibraries = false;
71 python3 = pkgs.python3; # don't use python-boot
72 });
73
74 clang-manpages = lowPrio (tools.libclang.override {
75 enableManpages = true;
76 python3 = pkgs.python3; # don't use python-boot
77 });
78
79 # pick clang appropriate for package set we are targeting
80 clang =
81 /**/ if stdenv.targetPlatform.libc == null then tools.clangNoLibc
82 else if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM
83 else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang
84 else tools.libcxxClang;
85
86 libstdcxxClang = wrapCCWith rec {
87 cc = tools.clang-unwrapped;
88 # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper.
89 libcxx = null;
90 extraPackages = [
91 targetLlvmLibraries.compiler-rt
92 ];
93 extraBuildCommands = mkExtraBuildCommands cc;
94 };
95
96 libcxxClang = wrapCCWith rec {
97 cc = tools.clang-unwrapped;
98 libcxx = targetLlvmLibraries.libcxx;
99 extraPackages = [
100 libcxx.cxxabi
101 targetLlvmLibraries.compiler-rt
102 ];
103 extraBuildCommands = mkExtraBuildCommands cc;
104 };
105
106 lld = callPackage ./lld {
107 inherit llvm_meta;
108 };
109
110 lldb = callPackage ./lldb {
111 inherit llvm_meta;
112 };
113 });
114
115 libraries = lib.makeExtensible (libraries: let
116 callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake libxml2 python3 isl release_version version fetch; });
117 in {
118
119 compiler-rt = callPackage ./compiler-rt {
120 inherit llvm_meta;
121 };
122
123 stdenv = overrideCC stdenv buildLlvmTools.clang;
124
125 libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang;
126
127 libcxx = callPackage ./libcxx {
128 inherit llvm_meta;
129 };
130
131 libcxxabi = callPackage ./libcxxabi {
132 inherit llvm_meta;
133 };
134
135 openmp = callPackage ./openmp {
136 inherit llvm_meta targetLlvm;
137 };
138 });
139
140in { inherit tools libraries release_version; } // libraries // tools