From 6ba1b5b0b3e57a7def4e837f5599aa3ac68589a8 Mon Sep 17 00:00:00 2001
From: Peter Waller
Date: Tue, 1 Aug 2023 15:09:18 +0100
Subject: [PATCH 1/2] llvmPackages_15, llvmPackages_16: Make the
pkgsLLVM.stdenv work
What changed:
* Fixed crtbeginS.o and crtendS.o missing
(they may or may not be called crt{begin_end},{,_shared}.
* Fixed implicit function declaration causing build errors for various
builds by supplying -Wno-implicit-function-declaration.
* Fixed __cxxabi_config.h missing, by adding -I${cxxabi}/include/c++/v1
in the wrapper.
* Fixed libcxx failing to build due to missing libunwind symbols by
including libunwind as a buildInput, and setting
-DLIBCXX_ADDITIONAL_LIBRARIES=unwind for stdenv.hostPlatform.useLLVM == true.
* libcxxabi wants to find libunwind at libunwind_shared.so, so symlink
it there in libunwind.
* llvmPackages_16.libcxxabi: Pass -nostdlib via CMAKE_*_LINKER_FLAGS
Without this flag, the link of libcxxabi.so tries to pull in libgcc and
friends, from the clang compiler driver.
* Drop unneeded musl hack patch from libcxx.
* Pass -Wno-error=implicit-function-declaration only to compiler-rt
See LLVM forum discussion:
https://discourse.llvm.org/t/configure-script-breakage-with-the-new-werror-implicit-function-declaration/65213
In summary, LLVM 16 made implicit function declaration an error. This
happens a lot in configure scripts which can break things.
* llvmPackages_16: !isDarwin: Supply -DLIBCXX_ABI_USE_LLVM_UNWINDER=On
Otherwise it fails with various undefined references to _Unwind_*
functions: (full list: _Unwind_DeleteException _Unwind_GetIP
_Unwind_GetLanguageSpecificData _Unwind_GetRegionStart
_Unwind_RaiseException _Unwind_Resume _Unwind_SetGR _Unwind_SetIP).
* 16.libcxxabi: Only pass -nostdlib for useLLVM and Darwin builds
What was tested:
* x86_64-linux, aarch64-linux, the stdenv builds.
* Additionally I was able to get nix to build, with an overlay to fix
a couple of minor issues in downstream packages (overlay supplied in
PR #246577.
* aarch64-darwin fails spuriously in a single LLVM test
strip-preserve-atime.test checking atime timestamps.
* The same for pkgsLLVM with llvmPackages = llvmPackages_15.
Signed-off-by: Peter Waller
---
.../compilers/llvm/15/libcxx/default.nix | 20 ++++++++++++++----
.../compilers/llvm/15/libcxxabi/default.nix | 7 +++++++
.../compilers/llvm/15/libunwind/default.nix | 5 +++++
.../compilers/llvm/16/compiler-rt/default.nix | 19 ++++++++++++++---
.../development/compilers/llvm/16/default.nix | 8 +++++++
.../compilers/llvm/16/libcxx/default.nix | 19 +++++++++++------
.../compilers/llvm/16/libcxxabi/default.nix | 7 +++++++
.../compilers/llvm/16/libunwind/default.nix | 5 +++++
.../compilers/llvm/git/libcxx/default.nix | 21 +++++++++++++++----
.../compilers/llvm/git/libcxxabi/default.nix | 7 +++++++
.../compilers/llvm/git/libunwind/default.nix | 5 +++++
11 files changed, 106 insertions(+), 17 deletions(-)
diff --git a/pkgs/development/compilers/llvm/15/libcxx/default.nix b/pkgs/development/compilers/llvm/15/libcxx/default.nix
index 94374c8a312df..cc4e9bc830584 100644
--- a/pkgs/development/compilers/llvm/15/libcxx/default.nix
+++ b/pkgs/development/compilers/llvm/15/libcxx/default.nix
@@ -2,7 +2,7 @@
, monorepoSrc, runCommand
, cmake, ninja, python3, fixDarwinDylibNames, version
, cxxabi ? if stdenv.hostPlatform.isFreeBSD then libcxxrt else libcxxabi
-, libcxxabi, libcxxrt
+, libcxxabi, libcxxrt, libunwind
, enableShared ? !stdenv.hostPlatform.isStatic
# If headersOnly is true, the resulting package would only include the headers.
@@ -62,7 +62,9 @@ stdenv.mkDerivation rec {
nativeBuildInputs = [ cmake ninja python3 ]
++ lib.optional stdenv.isDarwin fixDarwinDylibNames;
- buildInputs = lib.optionals (!headersOnly) [ cxxabi ];
+ buildInputs =
+ lib.optionals (!headersOnly) [ cxxabi ]
+ ++ lib.optionals (stdenv.hostPlatform.useLLVM or false) [ libunwind ];
cmakeFlags = let
# See: https://libcxx.llvm.org/BuildingLibcxx.html#cmdoption-arg-libcxx-cxx-abi-string
@@ -75,8 +77,18 @@ stdenv.mkDerivation rec {
"-DLIBCXX_CXX_ABI=${if headersOnly then "none" else libcxx_cxx_abi_opt}"
] ++ lib.optional (!headersOnly && cxxabi.libName == "c++abi") "-DLIBCXX_CXX_ABI_INCLUDE_PATHS=${cxxabi.dev}/include/c++/v1"
++ lib.optional (stdenv.hostPlatform.isMusl || stdenv.hostPlatform.isWasi) "-DLIBCXX_HAS_MUSL_LIBC=1"
- ++ lib.optional (stdenv.hostPlatform.useLLVM or false) "-DLIBCXX_USE_COMPILER_RT=ON"
- ++ lib.optionals stdenv.hostPlatform.isWasm [
+ ++ lib.optionals (stdenv.hostPlatform.useLLVM or false) [
+ "-DLIBCXX_USE_COMPILER_RT=ON"
+ # (Backport fix from 16, which has LIBCXX_ADDITIONAL_LIBRARIES, but 15
+ # does not appear to)
+ # There's precedent for this in llvm-project/libcxx/cmake/caches.
+ # In a monorepo build you might do the following in the libcxxabi build:
+ # -DLLVM_ENABLE_PROJECTS=libcxxabi;libunwind
+ # -DLIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY=On
+ # libcxx appears to require unwind and doesn't pull it in via other means.
+ # "-DLIBCXX_ADDITIONAL_LIBRARIES=unwind"
+ "-DCMAKE_SHARED_LINKER_FLAGS=-lunwind"
+ ] ++ lib.optionals stdenv.hostPlatform.isWasm [
"-DLIBCXX_ENABLE_THREADS=OFF"
"-DLIBCXX_ENABLE_FILESYSTEM=OFF"
"-DLIBCXX_ENABLE_EXCEPTIONS=OFF"
diff --git a/pkgs/development/compilers/llvm/15/libcxxabi/default.nix b/pkgs/development/compilers/llvm/15/libcxxabi/default.nix
index cb5fa44f07009..692a0256e901a 100644
--- a/pkgs/development/compilers/llvm/15/libcxxabi/default.nix
+++ b/pkgs/development/compilers/llvm/15/libcxxabi/default.nix
@@ -68,6 +68,13 @@ stdenv.mkDerivation rec {
] ++ lib.optionals (stdenv.hostPlatform.useLLVM or false) [
"-DLLVM_ENABLE_LIBCXX=ON"
"-DLIBCXXABI_USE_LLVM_UNWINDER=ON"
+ ] ++ lib.optionals ((stdenv.hostPlatform.useLLVM or false) ||
+ (stdenv.hostPlatform.isDarwin && enableShared)) [
+ # libcxxabi's CMake looks as though it treats -nostdlib++ as implying -nostdlib,
+ # but that does not appear to be the case for example when building
+ # pkgsLLVM.libcxxabi (which uses clangNoCompilerRtWithLibc).
+ "-DCMAKE_EXE_LINKER_FLAGS=-nostdlib"
+ "-DCMAKE_SHARED_LINKER_FLAGS=-nostdlib"
] ++ lib.optionals stdenv.hostPlatform.isWasm [
"-DLIBCXXABI_ENABLE_THREADS=OFF"
"-DLIBCXXABI_ENABLE_EXCEPTIONS=OFF"
diff --git a/pkgs/development/compilers/llvm/15/libunwind/default.nix b/pkgs/development/compilers/llvm/15/libunwind/default.nix
index dd14e2acaf869..1b677a7a2c0d7 100644
--- a/pkgs/development/compilers/llvm/15/libunwind/default.nix
+++ b/pkgs/development/compilers/llvm/15/libunwind/default.nix
@@ -40,6 +40,11 @@ stdenv.mkDerivation rec {
cd ../runtimes
'';
+ postInstall = lib.optionalString (enableShared && !stdenv.hostPlatform.isDarwin) ''
+ # libcxxabi wants to link to libunwind_shared.so (?).
+ ln -s $out/lib/libunwind.so $out/lib/libunwind_shared.so
+ '';
+
outputs = [ "out" "dev" ];
nativeBuildInputs = [ cmake ninja python3 ];
diff --git a/pkgs/development/compilers/llvm/16/compiler-rt/default.nix b/pkgs/development/compilers/llvm/16/compiler-rt/default.nix
index aa248c0e60eba..fc0d7533c9949 100644
--- a/pkgs/development/compilers/llvm/16/compiler-rt/default.nix
+++ b/pkgs/development/compilers/llvm/16/compiler-rt/default.nix
@@ -32,9 +32,16 @@ stdenv.mkDerivation {
++ lib.optional stdenv.isDarwin xcbuild.xcrun;
buildInputs = lib.optional stdenv.hostPlatform.isDarwin libcxxabi;
- env.NIX_CFLAGS_COMPILE = toString [
+ env.NIX_CFLAGS_COMPILE = toString ([
"-DSCUDO_DEFAULT_OPTIONS=DeleteSizeMismatch=0:DeallocationTypeMismatch=0"
- ];
+ ] ++ lib.optionals (!haveLibc) [
+ # The compiler got stricter about this, and there is a usellvm patch below
+ # which patches out the assert include causing an implicit definition of
+ # assert. It would be nicer to understand why compiler-rt thinks it should
+ # be able to #include in the first place; perhaps it's in the
+ # wrong, or perhaps there is a way to provide an assert.h.
+ "-Wno-error=implicit-function-declaration"
+ ]);
cmakeFlags = [
"-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON"
@@ -102,7 +109,7 @@ stdenv.mkDerivation {
'' + lib.optionalString stdenv.isDarwin ''
substituteInPlace cmake/config-ix.cmake \
--replace 'set(COMPILER_RT_HAS_TSAN TRUE)' 'set(COMPILER_RT_HAS_TSAN FALSE)'
- '' + lib.optionalString (useLLVM) ''
+ '' + lib.optionalString (useLLVM && !haveLibc) ''
substituteInPlace lib/builtins/int_util.c \
--replace "#include " ""
substituteInPlace lib/builtins/clear_cache.c \
@@ -117,6 +124,12 @@ stdenv.mkDerivation {
'' + lib.optionalString (useLLVM) ''
ln -s $out/lib/*/clang_rt.crtbegin-*.o $out/lib/crtbegin.o
ln -s $out/lib/*/clang_rt.crtend-*.o $out/lib/crtend.o
+ # Note the history of crt{begin,end}S in previous versions of llvm in nixpkg:
+ # The presence of crtbegin_shared has been added and removed; it's possible
+ # people have added/removed it to get it working on their platforms.
+ # Try each in turn for now.
+ ln -s $out/lib/*/clang_rt.crtbegin-*.o $out/lib/crtbeginS.o
+ ln -s $out/lib/*/clang_rt.crtend-*.o $out/lib/crtendS.o
ln -s $out/lib/*/clang_rt.crtbegin_shared-*.o $out/lib/crtbeginS.o
ln -s $out/lib/*/clang_rt.crtend_shared-*.o $out/lib/crtendS.o
'' + lib.optionalString doFakeLibgcc ''
diff --git a/pkgs/development/compilers/llvm/16/default.nix b/pkgs/development/compilers/llvm/16/default.nix
index 0c0ff44e155f8..d9a363037a920 100644
--- a/pkgs/development/compilers/llvm/16/default.nix
+++ b/pkgs/development/compilers/llvm/16/default.nix
@@ -254,6 +254,14 @@ in let
[ "-rtlib=compiler-rt"
"-Wno-unused-command-line-argument"
"-B${targetLlvmLibraries.compiler-rt}/lib"
+
+ # Combat "__cxxabi_config.h not found". Maybe this could be fixed by
+ # copying these headers into libcxx? Note that building libcxx
+ # outside of monorepo isn't supported anymore, might be related to
+ # https://github.com/llvm/llvm-project/issues/55632
+ # ("16.0.3 libcxx, libcxxabi: circular build dependencies")
+ # Looks like the machinery changed in https://reviews.llvm.org/D120727.
+ "-I${lib.getDev targetLlvmLibraries.libcxx.cxxabi}/include/c++/v1"
]
++ lib.optional (!stdenv.targetPlatform.isWasm) "--unwindlib=libunwind"
++ lib.optional
diff --git a/pkgs/development/compilers/llvm/16/libcxx/default.nix b/pkgs/development/compilers/llvm/16/libcxx/default.nix
index 94374c8a312df..c387764b4f650 100644
--- a/pkgs/development/compilers/llvm/16/libcxx/default.nix
+++ b/pkgs/development/compilers/llvm/16/libcxx/default.nix
@@ -2,7 +2,7 @@
, monorepoSrc, runCommand
, cmake, ninja, python3, fixDarwinDylibNames, version
, cxxabi ? if stdenv.hostPlatform.isFreeBSD then libcxxrt else libcxxabi
-, libcxxabi, libcxxrt
+, libcxxabi, libcxxrt, libunwind
, enableShared ? !stdenv.hostPlatform.isStatic
# If headersOnly is true, the resulting package would only include the headers.
@@ -47,8 +47,6 @@ stdenv.mkDerivation rec {
patches = [
./gnu-install-dirs.patch
- ] ++ lib.optionals stdenv.hostPlatform.isMusl [
- ../../libcxx-0001-musl-hacks.patch
];
postPatch = ''
@@ -62,7 +60,9 @@ stdenv.mkDerivation rec {
nativeBuildInputs = [ cmake ninja python3 ]
++ lib.optional stdenv.isDarwin fixDarwinDylibNames;
- buildInputs = lib.optionals (!headersOnly) [ cxxabi ];
+ buildInputs =
+ lib.optionals (!headersOnly) [ cxxabi ]
+ ++ lib.optionals (stdenv.hostPlatform.useLLVM or false) [ libunwind ];
cmakeFlags = let
# See: https://libcxx.llvm.org/BuildingLibcxx.html#cmdoption-arg-libcxx-cxx-abi-string
@@ -75,8 +75,15 @@ stdenv.mkDerivation rec {
"-DLIBCXX_CXX_ABI=${if headersOnly then "none" else libcxx_cxx_abi_opt}"
] ++ lib.optional (!headersOnly && cxxabi.libName == "c++abi") "-DLIBCXX_CXX_ABI_INCLUDE_PATHS=${cxxabi.dev}/include/c++/v1"
++ lib.optional (stdenv.hostPlatform.isMusl || stdenv.hostPlatform.isWasi) "-DLIBCXX_HAS_MUSL_LIBC=1"
- ++ lib.optional (stdenv.hostPlatform.useLLVM or false) "-DLIBCXX_USE_COMPILER_RT=ON"
- ++ lib.optionals stdenv.hostPlatform.isWasm [
+ ++ lib.optionals (stdenv.hostPlatform.useLLVM or false) [
+ "-DLIBCXX_USE_COMPILER_RT=ON"
+ # There's precedent for this in llvm-project/libcxx/cmake/caches.
+ # In a monorepo build you might do the following in the libcxxabi build:
+ # -DLLVM_ENABLE_PROJECTS=libcxxabi;libunwinder
+ # -DLIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY=On
+ # libcxx appears to require unwind and doesn't pull it in via other means.
+ "-DLIBCXX_ADDITIONAL_LIBRARIES=unwind"
+ ] ++ lib.optionals stdenv.hostPlatform.isWasm [
"-DLIBCXX_ENABLE_THREADS=OFF"
"-DLIBCXX_ENABLE_FILESYSTEM=OFF"
"-DLIBCXX_ENABLE_EXCEPTIONS=OFF"
diff --git a/pkgs/development/compilers/llvm/16/libcxxabi/default.nix b/pkgs/development/compilers/llvm/16/libcxxabi/default.nix
index cb5fa44f07009..692a0256e901a 100644
--- a/pkgs/development/compilers/llvm/16/libcxxabi/default.nix
+++ b/pkgs/development/compilers/llvm/16/libcxxabi/default.nix
@@ -68,6 +68,13 @@ stdenv.mkDerivation rec {
] ++ lib.optionals (stdenv.hostPlatform.useLLVM or false) [
"-DLLVM_ENABLE_LIBCXX=ON"
"-DLIBCXXABI_USE_LLVM_UNWINDER=ON"
+ ] ++ lib.optionals ((stdenv.hostPlatform.useLLVM or false) ||
+ (stdenv.hostPlatform.isDarwin && enableShared)) [
+ # libcxxabi's CMake looks as though it treats -nostdlib++ as implying -nostdlib,
+ # but that does not appear to be the case for example when building
+ # pkgsLLVM.libcxxabi (which uses clangNoCompilerRtWithLibc).
+ "-DCMAKE_EXE_LINKER_FLAGS=-nostdlib"
+ "-DCMAKE_SHARED_LINKER_FLAGS=-nostdlib"
] ++ lib.optionals stdenv.hostPlatform.isWasm [
"-DLIBCXXABI_ENABLE_THREADS=OFF"
"-DLIBCXXABI_ENABLE_EXCEPTIONS=OFF"
diff --git a/pkgs/development/compilers/llvm/16/libunwind/default.nix b/pkgs/development/compilers/llvm/16/libunwind/default.nix
index dd14e2acaf869..1b677a7a2c0d7 100644
--- a/pkgs/development/compilers/llvm/16/libunwind/default.nix
+++ b/pkgs/development/compilers/llvm/16/libunwind/default.nix
@@ -40,6 +40,11 @@ stdenv.mkDerivation rec {
cd ../runtimes
'';
+ postInstall = lib.optionalString (enableShared && !stdenv.hostPlatform.isDarwin) ''
+ # libcxxabi wants to link to libunwind_shared.so (?).
+ ln -s $out/lib/libunwind.so $out/lib/libunwind_shared.so
+ '';
+
outputs = [ "out" "dev" ];
nativeBuildInputs = [ cmake ninja python3 ];
diff --git a/pkgs/development/compilers/llvm/git/libcxx/default.nix b/pkgs/development/compilers/llvm/git/libcxx/default.nix
index 94374c8a312df..f267b753b24ab 100644
--- a/pkgs/development/compilers/llvm/git/libcxx/default.nix
+++ b/pkgs/development/compilers/llvm/git/libcxx/default.nix
@@ -2,7 +2,7 @@
, monorepoSrc, runCommand
, cmake, ninja, python3, fixDarwinDylibNames, version
, cxxabi ? if stdenv.hostPlatform.isFreeBSD then libcxxrt else libcxxabi
-, libcxxabi, libcxxrt
+, libcxxabi, libcxxrt, libunwind
, enableShared ? !stdenv.hostPlatform.isStatic
# If headersOnly is true, the resulting package would only include the headers.
@@ -62,7 +62,10 @@ stdenv.mkDerivation rec {
nativeBuildInputs = [ cmake ninja python3 ]
++ lib.optional stdenv.isDarwin fixDarwinDylibNames;
- buildInputs = lib.optionals (!headersOnly) [ cxxabi ];
+ buildInputs =
+ lib.optionals (!headersOnly) [ cxxabi ]
+ ++ lib.optionals (stdenv.hostPlatform.useLLVM or false) [ libunwind ];
+
cmakeFlags = let
# See: https://libcxx.llvm.org/BuildingLibcxx.html#cmdoption-arg-libcxx-cxx-abi-string
@@ -75,8 +78,18 @@ stdenv.mkDerivation rec {
"-DLIBCXX_CXX_ABI=${if headersOnly then "none" else libcxx_cxx_abi_opt}"
] ++ lib.optional (!headersOnly && cxxabi.libName == "c++abi") "-DLIBCXX_CXX_ABI_INCLUDE_PATHS=${cxxabi.dev}/include/c++/v1"
++ lib.optional (stdenv.hostPlatform.isMusl || stdenv.hostPlatform.isWasi) "-DLIBCXX_HAS_MUSL_LIBC=1"
- ++ lib.optional (stdenv.hostPlatform.useLLVM or false) "-DLIBCXX_USE_COMPILER_RT=ON"
- ++ lib.optionals stdenv.hostPlatform.isWasm [
+ ++ lib.optionals (stdenv.hostPlatform.useLLVM or false) [
+ "-DLIBCXX_USE_COMPILER_RT=ON"
+ # (Backport fix from 16, which has LIBCXX_ADDITIONAL_LIBRARIES, but 15
+ # does not appear to)
+ # There's precedent for this in llvm-project/libcxx/cmake/caches.
+ # In a monorepo build you might do the following in the libcxxabi build:
+ # -DLLVM_ENABLE_PROJECTS=libcxxabi;libunwinder
+ # -DLIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY=On
+ # libcxx appears to require unwind and doesn't pull it in via other means.
+ # "-DLIBCXX_ADDITIONAL_LIBRARIES=unwind"
+ "-DCMAKE_SHARED_LINKER_FLAGS=-lunwind"
+ ] ++ lib.optionals stdenv.hostPlatform.isWasm [
"-DLIBCXX_ENABLE_THREADS=OFF"
"-DLIBCXX_ENABLE_FILESYSTEM=OFF"
"-DLIBCXX_ENABLE_EXCEPTIONS=OFF"
diff --git a/pkgs/development/compilers/llvm/git/libcxxabi/default.nix b/pkgs/development/compilers/llvm/git/libcxxabi/default.nix
index 65c585181a702..51020fcdb0caf 100644
--- a/pkgs/development/compilers/llvm/git/libcxxabi/default.nix
+++ b/pkgs/development/compilers/llvm/git/libcxxabi/default.nix
@@ -68,6 +68,13 @@ stdenv.mkDerivation rec {
] ++ lib.optionals (stdenv.hostPlatform.useLLVM or false) [
"-DLLVM_ENABLE_LIBCXX=ON"
"-DLIBCXXABI_USE_LLVM_UNWINDER=ON"
+ ] ++ lib.optionals ((stdenv.hostPlatform.useLLVM or false) ||
+ (stdenv.hostPlatform.isDarwin && enableShared)) [
+ # libcxxabi's CMake looks as though it treats -nostdlib++ as implying -nostdlib,
+ # but that does not appear to be the case for example when building
+ # pkgsLLVM.libcxxabi (which uses clangNoCompilerRtWithLibc).
+ "-DCMAKE_EXE_LINKER_FLAGS=-nostdlib"
+ "-DCMAKE_SHARED_LINKER_FLAGS=-nostdlib"
] ++ lib.optionals stdenv.hostPlatform.isWasm [
"-DLIBCXXABI_ENABLE_THREADS=OFF"
"-DLIBCXXABI_ENABLE_EXCEPTIONS=OFF"
diff --git a/pkgs/development/compilers/llvm/git/libunwind/default.nix b/pkgs/development/compilers/llvm/git/libunwind/default.nix
index dd14e2acaf869..1b677a7a2c0d7 100644
--- a/pkgs/development/compilers/llvm/git/libunwind/default.nix
+++ b/pkgs/development/compilers/llvm/git/libunwind/default.nix
@@ -40,6 +40,11 @@ stdenv.mkDerivation rec {
cd ../runtimes
'';
+ postInstall = lib.optionalString (enableShared && !stdenv.hostPlatform.isDarwin) ''
+ # libcxxabi wants to link to libunwind_shared.so (?).
+ ln -s $out/lib/libunwind.so $out/lib/libunwind_shared.so
+ '';
+
outputs = [ "out" "dev" ];
nativeBuildInputs = [ cmake ninja python3 ];
From 044e8c4e443c6f5c9e4a8f763c6e6314bf90732c Mon Sep 17 00:00:00 2001
From: Peter Waller
Date: Mon, 21 Aug 2023 13:02:04 +0100
Subject: [PATCH 2/2] llvmPackages_git: Port stdenv fix for cxx-headers
Signed-off-by: Peter Waller
---
pkgs/development/compilers/llvm/git/default.nix | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/pkgs/development/compilers/llvm/git/default.nix b/pkgs/development/compilers/llvm/git/default.nix
index 8cf311e9b23ac..5ec5d35dcec51 100644
--- a/pkgs/development/compilers/llvm/git/default.nix
+++ b/pkgs/development/compilers/llvm/git/default.nix
@@ -313,6 +313,19 @@ in let
# what stdenv we use here, as long as CMake is happy.
cxx-headers = callPackage ./libcxx {
inherit llvm_meta;
+ # Note that if we use the regular stdenv here we'll get cycle errors
+ # when attempting to use this compiler in the stdenv.
+ #
+ # The final stdenv pulls `cxx-headers` from the package set where
+ # hostPlatform *is* the target platform which means that `stdenv` at
+ # that point attempts to use this toolchain.
+ #
+ # So, we use `stdenv_` (the stdenv containing `clang` from this package
+ # set, defined below) to sidestep this issue.
+ #
+ # Because we only use `cxx-headers` in `libcxxabi` (which depends on the
+ # clang stdenv _anyways_), this is okay.
+ stdenv = stdenv_;
headersOnly = true;
};