mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-14 09:43:14 +00:00
llvmPackages_15.libcxx: use clang 15 instead of the stdenv's compiler
libc++ has switched to using `__attribute__((using_if_exists))` to handle incomplete libc implementations; see:a9c9183ca4
These essentially require a modern C++ compiler (clang gained support in LLVM 13:369c648399
, gcc appears to not have support yet: https://gcc.gnu.org/bugzilla//show_bug.cgi?id=105584). Previously this was not an issue for us (despite the transition happening around LLVM 13) but something about the changes to the libc++/libc++-abi build has made it so that on platforms with incomplete libc impls (i.e. Darwin is missing `quick_exit`/`at_quick_exit`) we error during the `libcxx-abi` build when the stdenv's (older, not supporting `using_if_exists`) compiler tries to import libc symbols that aren't present. The libc++ docs suggest we use a modern compiler to build libc++ anyways (https://releases.llvm.org/15.0.0/projects/libcxx/docs/index.html#platform-and-compiler-support) so this commit uses stdenv's containing the package set's clang to build libcxx/libcxx-abi. This is similar to how libc++ bootstrapping builds (https://releases.llvm.org/15.0.0/projects/libcxx/docs/BuildingLibcxx.html#bootstrapping-build) work.
This commit is contained in:
parent
4fabcf4945
commit
ca59a201ca
@ -247,27 +247,39 @@ let
|
||||
|
||||
libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang;
|
||||
|
||||
libcxx = callPackage ./libcxx {
|
||||
inherit llvm_meta;
|
||||
stdenv = if stdenv.hostPlatform.useLLVM or false
|
||||
then overrideCC stdenv buildLlvmTools.clangNoLibcxx
|
||||
else stdenv;
|
||||
};
|
||||
|
||||
libcxxabi = let
|
||||
stdenv_ = if stdenv.hostPlatform.useLLVM or false
|
||||
then overrideCC stdenv buildLlvmTools.clangNoLibcxx
|
||||
else stdenv;
|
||||
# CMake will "require" a compiler capable of compiling C++ programs
|
||||
# cxx-header's build does not actually use one so it doesn't really matter
|
||||
# what stdenv we use here, as long as CMake is happy.
|
||||
cxx-headers = callPackage ./libcxx {
|
||||
inherit llvm_meta;
|
||||
stdenv = stdenv_;
|
||||
headersOnly = true;
|
||||
};
|
||||
|
||||
# `libcxxabi` *doesn't* need a compiler with a working C++ stdlib but it
|
||||
# *does* need a relatively modern C++ compiler (see:
|
||||
# https://releases.llvm.org/15.0.0/projects/libcxx/docs/index.html#platform-and-compiler-support).
|
||||
#
|
||||
# So, we use the clang from this LLVM package set, like libc++
|
||||
# "boostrapping builds" do:
|
||||
# https://releases.llvm.org/15.0.0/projects/libcxx/docs/BuildingLibcxx.html#bootstrapping-build
|
||||
#
|
||||
# We cannot use `clangNoLibcxx` because that contains `compiler-rt` which,
|
||||
# on macOS, depends on `libcxxabi`, thus forming a cycle.
|
||||
stdenv_ = overrideCC stdenv buildLlvmTools.clangNoCompilerRtWithLibc;
|
||||
in callPackage ./libcxxabi {
|
||||
stdenv = stdenv_;
|
||||
inherit llvm_meta cxx-headers;
|
||||
};
|
||||
|
||||
# Like `libcxxabi` above, `libcxx` requires a fairly modern C++ compiler,
|
||||
# so: we use the clang from this LLVM package set instead of the regular
|
||||
# stdenv's compiler.
|
||||
libcxx = callPackage ./libcxx {
|
||||
inherit llvm_meta;
|
||||
stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx;
|
||||
};
|
||||
|
||||
libunwind = callPackage ./libunwind {
|
||||
inherit llvm_meta;
|
||||
stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx;
|
||||
|
@ -58,6 +58,13 @@ stdenv.mkDerivation rec {
|
||||
cmakeFlags = [
|
||||
"-DLLVM_ENABLE_RUNTIMES=libcxxabi"
|
||||
"-DLIBCXXABI_LIBCXX_INCLUDES=${cxx-headers}/include/c++/v1"
|
||||
|
||||
# `libcxxabi`'s build does not need a toolchain with a c++ stdlib attached
|
||||
# (we specify the headers it should use explicitly above).
|
||||
#
|
||||
# CMake however checks for this anyways; this flag tells it not to. See:
|
||||
# https://github.com/llvm/llvm-project/blob/4bd3f3759259548e159aeba5c76efb9a0864e6fa/llvm/runtimes/CMakeLists.txt#L243
|
||||
"-DCMAKE_CXX_COMPILER_WORKS=ON"
|
||||
] ++ lib.optionals (stdenv.hostPlatform.useLLVM or false) [
|
||||
"-DLLVM_ENABLE_LIBCXX=ON"
|
||||
"-DLIBCXXABI_USE_LLVM_UNWINDER=ON"
|
||||
|
Loading…
Reference in New Issue
Block a user