11{ pname ? "clang" , fetchurl , stdenv , gnumake , linux-headers , cmake , python } :
22
3- stdenv . mkDerivation {
4- pname = pname ;
5- version = "17.0.1" ;
6-
3+ let
74 src = fetchurl { # parsed by other tooling, must be of fixed format
85 # local = /downloads/llvm-project-17.0.1.src.tar.xz;
96 url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.1/llvm-project-17.0.1.src.tar.xz" ;
107 sha256 = "b0e42aafc01ece2ca2b42e3526f54bebc4b1f1dc8de6e34f46a0446a13e882b9" ;
118 } ;
9+ in
10+
11+ stdenv . mkDerivation {
12+ inherit pname src ;
13+ version = "17.0.1" ;
1214
1315 buildInputs = [ stdenv . busybox gnumake cmake python ] ;
1416 # stdenv.clang not added to PATH on purpose to avoid confusion
@@ -28,7 +30,10 @@ stdenv.mkDerivation {
2830 llvm/cmake/modules/AddLLVM.cmake
2931 sed -i 's|numShards = 32;|numShards = 1;|' lld/*/SyntheticSections.*
3032 sed -i 's|numShards = 256;|numShards = 1;|' lld/*/ICF.cpp
31- sed -i 's|__FILE__|__FILE_NAME__|' compiler-rt/lib/builtins/int_util.h
33+ sed -i 's|__FILE__|__FILE_NAME__|' \
34+ libcxx/src/verbose_abort.cpp \
35+ libcxxabi/src/abort_message.cpp \
36+ compiler-rt/lib/builtins/int_util.h
3237 '' ;
3338
3439 preConfigure = ''
@@ -40,6 +45,15 @@ stdenv.mkDerivation {
4045 '' ;
4146
4247 configurePhase = ''
48+ # Shared libs are not relinked on install. Instead, their rpath
49+ # is erased with RPATH_SET: `Set runtime path of
50+ # "/nix/store/.../lib/x86_64-unknown-linux-musl/libc++.so.1.0" to ""`
51+ # One (hacky) workaround to that is using a constant-len build-dir.
52+ build_dir=build; expr "$(pwd)/$build_dir)" '<=' 134
53+ while ! echo "$(pwd)/$build_dir" | wc -c | grep -Fqx 134; do
54+ build_dir="$build_dir."
55+ done; mkdir $build_dir; expr "$(echo $(pwd)/build* | wc -c)" '==' 134
56+
4357 export SHELL=${ stdenv . busybox } /bin/ash
4458 LOADER=${ stdenv . musl } /lib/libc.so
4559
@@ -59,12 +73,12 @@ stdenv.mkDerivation {
5973
6074 export LD_LIBRARY_PATH="${ stdenv . musl } /lib:${ stdenv . clang } /lib"
6175 export LD_LIBRARY_PATH=${ python } /lib:$LD_LIBRARY_PATH
62- export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$(pwd)/build /lib" # libLLVM
76+ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$(pwd)/$build_dir /lib" # libLLVM
6377
6478 REWRITE="-ffile-prefix-map=$(pwd)=/builddir/"
6579 CFLAGS="--sysroot=$(pwd)/sysroot -isystem $EXTRA_INCL $REWRITE"
6680 LDFLAGS="-Wl,--dynamic-linker=$LOADER"
67- cmake -S llvm -B build -G 'Unix Makefiles' \
81+ cmake -S llvm -B build* -G 'Unix Makefiles' \
6882 -DCMAKE_ASM_COMPILER=${ stdenv . clang } /bin/clang \
6983 -DCMAKE_C_COMPILER=${ stdenv . clang } /bin/clang \
7084 -DCMAKE_CXX_COMPILER=${ stdenv . clang } /bin/clang++ \
@@ -124,21 +138,23 @@ stdenv.mkDerivation {
124138 '' ;
125139
126140 buildPhase = ''
141+ build_dir=$(echo build*)
127142 export SHELL=${ stdenv . busybox } /bin/ash
128143 export LD_LIBRARY_PATH="${ stdenv . musl } /lib:${ stdenv . clang } /lib"
129144 export LD_LIBRARY_PATH=${ python } /lib:$LD_LIBRARY_PATH
130- export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$(pwd)/build /lib" # libLLVM
145+ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$(pwd)/$build_dir /lib" # libLLVM
131146
132147 # llvm cmake configuration should pick up ccache automatically from PATH
133- make -C build -j $NPROC
148+ make -C build* -j $NPROC
134149 '' ;
135150
136151 installPhase = ''
152+ build_dir=$(echo build*)
153+ export SHELL=${ stdenv . busybox } /bin/ash
137154 export LD_LIBRARY_PATH="${ stdenv . musl } /lib:${ stdenv . clang } /lib"
138155 export LD_LIBRARY_PATH=${ python } /lib:$LD_LIBRARY_PATH
139- export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$(pwd)/build/lib" # libLLVM
140- export SHELL=${ stdenv . busybox } /bin/ash
141- make -C build -j $NPROC install/strip
156+ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$(pwd)/$build_dir/lib" # libLLVM
157+ make -C build* -j $NPROC install/strip
142158 '' ;
143159
144160 postInstall = ''
0 commit comments