mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-01-16 01:45:11 +00:00
766f5ffb76
llvmPackages_*.clang should check the default compiler for the package set it is targeting (targetPackages.stdenv.cc) instead of the compiler that has been used to build it (stdenv.cc) in order to get some sense of whether to use libc++ or libstdc++. Since we are now inspecting targetPackages in the llvmPackages.clang attribute, we need to avoid using it in the cross stdenv — which just forces us to explicitly request libcxxClang for darwin instead of relying on the clang attribute to pick it for us. We also need to do something similar for targetPackages.stdenv.cc: Here the llvmPackages.clang logic would work as we want (inspect targetPackages.stdenv.cc and if it doesn't exist, make the choice based on stdenv.cc), but it gets locked in a cycle with the previous package. We can easily break this, however: We know that the previous set had clang and the next one doesn't exist, so we'd choose libcxxClang any day of the week.
129 lines
3.8 KiB
Nix
129 lines
3.8 KiB
Nix
{ lowPrio, newScope, pkgs, lib, stdenv, cmake, gccForLibs
|
|
, libxml2, python3, isl, fetchurl, overrideCC, wrapCCWith
|
|
, buildLlvmTools # tools, but from the previous stage, for cross
|
|
, targetLlvmLibraries # libraries, but from the next stage, for cross
|
|
}:
|
|
|
|
let
|
|
release_version = "5.0.2";
|
|
version = release_version; # differentiating these is important for rc's
|
|
targetConfig = stdenv.targetPlatform.config;
|
|
|
|
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" "018b3fiwah8f8br5i26qmzh6sjvzchpn358sn8v079m49f2jldm3";
|
|
|
|
llvm_meta = {
|
|
license = lib.licenses.ncsa;
|
|
maintainers = with lib.maintainers; [ lovek323 raskin dtzWill primeos ];
|
|
platforms = lib.platforms.all;
|
|
};
|
|
|
|
tools = lib.makeExtensible (tools: let
|
|
callPackage = newScope (tools // { inherit stdenv cmake libxml2 python3 isl release_version version fetch buildLlvmTools; });
|
|
mkExtraBuildCommands = cc: ''
|
|
rsrc="$out/resource-root"
|
|
mkdir "$rsrc"
|
|
ln -s "${cc.lib}/lib/clang/${release_version}/include" "$rsrc"
|
|
echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
|
|
ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib"
|
|
'';
|
|
|
|
in {
|
|
|
|
libllvm = callPackage ./llvm {
|
|
inherit llvm_meta;
|
|
};
|
|
|
|
# `llvm` historically had the binaries. When choosing an output explicitly,
|
|
# we need to reintroduce `outputSpecified` to get the expected behavior e.g. of lib.get*
|
|
llvm = tools.libllvm.out // { outputSpecified = false; };
|
|
|
|
libllvm-polly = callPackage ./llvm {
|
|
inherit llvm_meta;
|
|
enablePolly = true;
|
|
};
|
|
|
|
llvm-polly = tools.libllvm-polly.lib // { outputSpecified = false; };
|
|
|
|
libclang = callPackage ./clang {
|
|
inherit clang-tools-extra_src llvm_meta;
|
|
};
|
|
|
|
clang-unwrapped = tools.libclang.out // { outputSpecified = false; };
|
|
|
|
llvm-manpages = lowPrio (tools.libllvm.override {
|
|
enableManpages = true;
|
|
python3 = pkgs.python3; # don't use python-boot
|
|
});
|
|
|
|
clang-manpages = lowPrio (tools.libclang.override {
|
|
enableManpages = true;
|
|
python3 = pkgs.python3; # don't use python-boot
|
|
});
|
|
|
|
# pick clang appropriate for package set we are targeting
|
|
clang =
|
|
if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU
|
|
then tools.libstdcxxClang
|
|
else tools.libcxxClang;
|
|
|
|
libstdcxxClang = wrapCCWith rec {
|
|
cc = tools.clang-unwrapped;
|
|
# libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper.
|
|
libcxx = null;
|
|
extraPackages = [
|
|
targetLlvmLibraries.compiler-rt
|
|
];
|
|
extraBuildCommands = mkExtraBuildCommands cc;
|
|
};
|
|
|
|
libcxxClang = wrapCCWith rec {
|
|
cc = tools.clang-unwrapped;
|
|
libcxx = targetLlvmLibraries.libcxx;
|
|
extraPackages = [
|
|
targetLlvmLibraries.libcxxabi
|
|
targetLlvmLibraries.compiler-rt
|
|
];
|
|
extraBuildCommands = mkExtraBuildCommands cc;
|
|
};
|
|
|
|
lld = callPackage ./lld {
|
|
inherit llvm_meta;
|
|
};
|
|
|
|
lldb = callPackage ./lldb {
|
|
inherit llvm_meta;
|
|
};
|
|
});
|
|
|
|
libraries = lib.makeExtensible (libraries: let
|
|
callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake libxml2 python3 isl release_version version fetch; });
|
|
in {
|
|
|
|
compiler-rt = callPackage ./compiler-rt {
|
|
inherit llvm_meta;
|
|
};
|
|
|
|
stdenv = overrideCC stdenv buildLlvmTools.clang;
|
|
|
|
libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang;
|
|
|
|
libcxx = callPackage ./libcxx {
|
|
inherit llvm_meta;
|
|
};
|
|
|
|
libcxxabi = callPackage ./libcxxabi {
|
|
inherit llvm_meta;
|
|
};
|
|
|
|
openmp = callPackage ./openmp {
|
|
inherit llvm_meta;
|
|
};
|
|
});
|
|
|
|
in { inherit tools libraries release_version; } // libraries // tools
|