aboutsummaryrefslogtreecommitdiff
path: root/nixpkgs/pkgs/development/compilers/llvm/9/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/llvm/9/default.nix')
-rw-r--r--nixpkgs/pkgs/development/compilers/llvm/9/default.nix197
1 files changed, 197 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/compilers/llvm/9/default.nix b/nixpkgs/pkgs/development/compilers/llvm/9/default.nix
new file mode 100644
index 00000000000..1590d180c3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/compilers/llvm/9/default.nix
@@ -0,0 +1,197 @@
+{ lowPrio, newScope, pkgs, stdenv, cmake, libstdcxxHook
+, libxml2, python, isl, fetchurl, overrideCC, wrapCCWith, wrapBintoolsWith
+, buildLlvmTools # tools, but from the previous stage, for cross
+, targetLlvmLibraries # libraries, but from the next stage, for cross
+}:
+
+let
+ release_version = "9.0.0";
+ version = release_version; # differentiating these is important for rc's
+
+ fetch = name: sha256: fetchurl {
+ url = "https://releases.llvm.org/${release_version}/${name}-${version}.src.tar.xz";
+ inherit sha256;
+ };
+
+ clang-tools-extra_src = fetch "clang-tools-extra" "045cldmcfd8s33wyjlviifgpnw52yqicd6v4ysvdg4i96p78c77a";
+
+ tools = stdenv.lib.makeExtensible (tools: let
+ callPackage = newScope (tools // { inherit stdenv cmake libxml2 python isl release_version version fetch; });
+ mkExtraBuildCommands = cc: ''
+ rsrc="$out/resource-root"
+ mkdir "$rsrc"
+ 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
+ '';
+ in {
+
+ llvm = callPackage ./llvm.nix { };
+ llvm-polly = callPackage ./llvm.nix { enablePolly = true; };
+
+ clang-unwrapped = callPackage ./clang {
+ inherit clang-tools-extra_src;
+ };
+ clang-polly-unwrapped = callPackage ./clang {
+ inherit clang-tools-extra_src;
+ llvm = tools.llvm-polly;
+ enablePolly = true;
+ };
+
+ llvm-manpages = lowPrio (tools.llvm.override {
+ enableManpages = true;
+ python = pkgs.python; # don't use python-boot
+ });
+
+ clang-manpages = lowPrio (tools.clang-unwrapped.override {
+ enableManpages = true;
+ python = pkgs.python; # don't use python-boot
+ });
+
+ libclang = tools.clang-unwrapped.lib;
+
+ clang = if stdenv.cc.isGNU then tools.libstdcxxClang else tools.libcxxClang;
+
+ libstdcxxClang = wrapCCWith rec {
+ cc = tools.clang-unwrapped;
+ extraPackages = [
+ libstdcxxHook
+ targetLlvmLibraries.compiler-rt
+ ];
+ extraBuildCommands = mkExtraBuildCommands cc;
+ };
+
+ libcxxClang = wrapCCWith rec {
+ cc = tools.clang-unwrapped;
+ libcxx = targetLlvmLibraries.libcxx;
+ extraPackages = [
+ targetLlvmLibraries.libcxx
+ targetLlvmLibraries.libcxxabi
+ targetLlvmLibraries.compiler-rt
+ ];
+ extraBuildCommands = mkExtraBuildCommands cc;
+ };
+
+ lld = callPackage ./lld.nix {};
+
+ 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.libcxx
+ targetLlvmLibraries.libcxxabi
+ targetLlvmLibraries.compiler-rt
+ ] ++ stdenv.lib.optionals (!stdenv.targetPlatform.isWasm) [
+ targetLlvmLibraries.libunwind
+ ];
+ extraBuildCommands = ''
+ echo "-target ${stdenv.targetPlatform.config}" >> $out/nix-support/cc-cflags
+ 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.compiler-rt
+ ];
+ extraBuildCommands = ''
+ echo "-target ${stdenv.targetPlatform.config}" >> $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.compiler-rt
+ ];
+ extraBuildCommands = ''
+ echo "-target ${stdenv.targetPlatform.config}" >> $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" >> $out/nix-support/cc-cflags
+ echo "-target ${stdenv.targetPlatform.config}" >> $out/nix-support/cc-cflags
+ '';
+ };
+
+ });
+
+ libraries = stdenv.lib.makeExtensible (libraries: let
+ callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake libxml2 python isl release_version version fetch; });
+ in {
+
+ compiler-rt = callPackage ./compiler-rt.nix ({} //
+ (stdenv.lib.optionalAttrs (stdenv.hostPlatform.useLLVM or false) {
+ stdenv = overrideCC stdenv buildLlvmTools.lldClangNoCompilerRt;
+ }));
+
+ stdenv = overrideCC stdenv buildLlvmTools.clang;
+
+ libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang;
+
+ libcxx = callPackage ./libc++ ({} //
+ (stdenv.lib.optionalAttrs (stdenv.hostPlatform.useLLVM or false) {
+ stdenv = overrideCC stdenv buildLlvmTools.lldClangNoLibcxx;
+ }));
+
+ 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 {};
+
+ libunwind = callPackage ./libunwind.nix ({} //
+ (stdenv.lib.optionalAttrs (stdenv.hostPlatform.useLLVM or false) {
+ stdenv = overrideCC stdenv buildLlvmTools.lldClangNoLibcxx;
+ }));
+
+ });
+
+in { inherit tools libraries; } // libraries // tools