Skip to content

Commit

Permalink
llvmPackages_git.libcxx: use clang from git instead of the stdenv's c…
Browse files Browse the repository at this point in the history
…ompiler

Port of ca59a20 ("llvmPackages_15.libcxx: use clang 15 instead of
the stdenv's compiler").
  • Loading branch information
alyssais committed Mar 11, 2023
1 parent 4f6f5f4 commit 4ffa52e
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 11 deletions.
34 changes: 23 additions & 11 deletions pkgs/development/compilers/llvm/git/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -257,27 +257,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;
Expand Down
7 changes: 7 additions & 0 deletions pkgs/development/compilers/llvm/git/libcxxabi/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down

0 comments on commit 4ffa52e

Please sign in to comment.