158 lines
6.9 KiB
Nix
158 lines
6.9 KiB
Nix
|
{ fetchurl, mkDerivationStage2
|
||
|
, stage1, static-gnumake, musl, intermediate-clang
|
||
|
, linux-headers, cmake, python}:
|
||
|
|
||
|
let
|
||
|
source-tarball-llvm = fetchurl {
|
||
|
# local = /downloads/llvm-project-17.0.1.src.tar.xz;
|
||
|
url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.1/llvm-project-17.0.1.src.tar.xz";
|
||
|
sha256 = "b0e42aafc01ece2ca2b42e3526f54bebc4b1f1dc8de6e34f46a0446a13e882b9";
|
||
|
};
|
||
|
in
|
||
|
mkDerivationStage2 {
|
||
|
name = "bootstrap-2b1-clang";
|
||
|
buildInputPaths = [
|
||
|
"${stage1.protobusybox}/bin"
|
||
|
"${static-gnumake}/wrappers"
|
||
|
"${cmake}/bin"
|
||
|
"${python}/bin"
|
||
|
# 2a9-intermediate-clang intentionally not added to $PATH
|
||
|
# to prevent confusion
|
||
|
];
|
||
|
script = ''
|
||
|
# Shared libs are not relinked on install. Instead, their rpath
|
||
|
# is erased with RPATH_SET: `Set runtime path of
|
||
|
# "/nix/store/.../lib/x86_64-unknown-linux-musl/libc++.so.1.0" to ""`
|
||
|
# One (hacky) workaround to that is using a constant-len build-dir.
|
||
|
build_dir=build-dir; expr "$(pwd)/$build_dir)" '<=' 128
|
||
|
while ! echo "$(pwd)/$build_dir" | wc -c | grep -Fqx 128; do
|
||
|
build_dir="$build_dir."
|
||
|
done; expr "$(echo $(pwd)/$build_dir | wc -c)" '==' 128
|
||
|
mkdir $build_dir; cd $build_dir
|
||
|
export SHELL=${stage1.protobusybox}/bin/ash
|
||
|
# llvm cmake configuration should pick up ccache automatically from PATH
|
||
|
export PATH="$PATH:/ccache/bin"
|
||
|
command -v ccache && USE_CCACHE=YES || USE_CCACHE=NO
|
||
|
# prepare future sysroot:
|
||
|
SYSROOT=$out/sysroot
|
||
|
mkdir -p $SYSROOT/lib $SYSROOT/include
|
||
|
ln -s ${musl}/lib/* $SYSROOT/lib/
|
||
|
ln -s ${musl}/include/* $SYSROOT/include/
|
||
|
# unpack:
|
||
|
unpack ${source-tarball-llvm}
|
||
|
# fixup:
|
||
|
sed -i "s|COMMAND sh|COMMAND ${stage1.protobusybox}/bin/ash|" \
|
||
|
llvm/cmake/modules/GetHostTriple.cmake clang/CMakeLists.txt
|
||
|
echo 'echo x86_64-unknown-linux-musl' > llvm/cmake/config.guess
|
||
|
LOADER=${musl}/lib/libc.so
|
||
|
sed -i "s|/lib/ld-musl-\" + ArchName + \".so.1|$LOADER|" \
|
||
|
clang/lib/Driver/ToolChains/Linux.cpp
|
||
|
BEGINEND='const bool HasCRTBeginEndFiles'
|
||
|
sed -i "s|$BEGINEND =|$BEGINEND = false; ''${BEGINEND}_unused =|" \
|
||
|
clang/lib/Driver/ToolChains/Gnu.cpp
|
||
|
REL_ORIGIN='_install_rpath \"\$ORIGIN/../lib''${LLVM_LIBDIR_SUFFIX}\"'
|
||
|
sed -i "s|_install_rpath \"\\\\\$ORIGIN/..|_install_rpath \"$out|" \
|
||
|
llvm/cmake/modules/AddLLVM.cmake
|
||
|
sed -i 's|numShards = 32;|numShards = 1;|' lld/*/SyntheticSections.*
|
||
|
sed -i 's|numShards = 256;|numShards = 1;|' lld/*/ICF.cpp
|
||
|
sed -i 's|__FILE__|"__FILE__"|' \
|
||
|
libcxx/src/verbose_abort.cpp \
|
||
|
libcxxabi/src/abort_message.cpp \
|
||
|
compiler-rt/lib/builtins/int_util.h
|
||
|
sed -i 's|"@LLVM_SRC_ROOT@"|"REDACTED"|' \
|
||
|
llvm/tools/llvm-config/BuildVariables.inc.in
|
||
|
sed -i 's|"@LLVM_OBJ_ROOT@"|"REDACTED"|' \
|
||
|
llvm/tools/llvm-config/BuildVariables.inc.in
|
||
|
# figure out includes:
|
||
|
EXTRA_INCL="$(pwd)/extra_includes"
|
||
|
mkdir -p $EXTRA_INCL
|
||
|
cp clang/lib/Headers/*intrin*.h $EXTRA_INCL/
|
||
|
cp clang/lib/Headers/mm_malloc.h $EXTRA_INCL/
|
||
|
[ -e $EXTRA_INCL/immintrin.h ]
|
||
|
# configure:
|
||
|
export LD_LIBRARY_PATH="${musl}/lib:${intermediate-clang}/lib"
|
||
|
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$(pwd)/build/lib" # libLLVM
|
||
|
OPTS=""
|
||
|
add_opt() {
|
||
|
OPTS="$OPTS -D$1"
|
||
|
}
|
||
|
add_opt CMAKE_BUILD_TYPE=Release
|
||
|
add_opt LLVM_OPTIMIZED_TABLEGEN=YES
|
||
|
add_opt LLVM_CCACHE_BUILD=$USE_CCACHE
|
||
|
add_opt DEFAULT_SYSROOT=$SYSROOT
|
||
|
add_opt CMAKE_INSTALL_PREFIX=$out
|
||
|
add_opt LLVM_INSTALL_BINUTILS_SYMLINKS=YES
|
||
|
add_opt LLVM_INSTALL_CCTOOLS_SYMLINKS=YES
|
||
|
add_opt CMAKE_INSTALL_DO_STRIP=YES
|
||
|
add_opt LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=YES
|
||
|
add_opt LLVM_TARGET_ARCH=X86
|
||
|
add_opt LLVM_TARGETS_TO_BUILD=Native
|
||
|
add_opt LLVM_BUILTIN_TARGETS=x86_64-unknown-linux-musl
|
||
|
add_opt LLVM_DEFAULT_TARGET_TRIPLE=x86_64-unknown-linux-musl
|
||
|
add_opt LLVM_HOST_TRIPLE=x86_64-unknown-linux-musl
|
||
|
add_opt COMPILER_RT_DEFAULT_TARGET_TRIPLE=x86_64-unknown-linux-musl
|
||
|
add_opt LLVM_APPEND_VC_REV=NO
|
||
|
add_opt LLVM_INCLUDE_TESTS=NO
|
||
|
add_opt LLVM_INCLUDE_EXAMPLES=NO
|
||
|
add_opt LLVM_INCLUDE_BENCHMARKS=NO
|
||
|
add_opt LLVM_ENABLE_BACKTRACES=NO
|
||
|
add_opt LLVM_ENABLE_EH=YES
|
||
|
add_opt LLVM_ENABLE_RTTI=YES
|
||
|
add_opt CLANG_ENABLE_ARCMT=NO
|
||
|
add_opt CLANG_ENABLE_STATIC_ANALYZER=NO
|
||
|
add_opt COMPILER_RT_BUILD_SANITIZERS=NO
|
||
|
add_opt COMPILER_RT_BUILD_XRAY=NO
|
||
|
add_opt COMPILER_RT_BUILD_LIBFUZZER=NO
|
||
|
add_opt COMPILER_RT_BUILD_PROFILE=NO
|
||
|
add_opt COMPILER_RT_BUILD_MEMPROF=NO
|
||
|
add_opt COMPILER_RT_BUILD_ORC=NO
|
||
|
add_opt COMPILER_RT_USE_BUILTINS_LIBRARY=YES
|
||
|
add_opt CLANG_DEFAULT_CXX_STDLIB=libc++
|
||
|
add_opt CLANG_DEFAULT_LINKER=lld
|
||
|
add_opt CLANG_DEFAULT_RTLIB=compiler-rt
|
||
|
add_opt LIBCXX_HAS_MUSL_LIBC=YES
|
||
|
add_opt LIBCXX_USE_COMPILER_RT=YES
|
||
|
add_opt LIBCXX_INCLUDE_BENCHMARKS=NO
|
||
|
add_opt LIBCXX_CXX_ABI=libcxxabi
|
||
|
add_opt LIBCXX_ADDITIONAL_COMPILE_FLAGS=-I${linux-headers}/include
|
||
|
add_opt LIBCXXABI_USE_COMPILER_RT=YES
|
||
|
add_opt LIBCXXABI_USE_LLVM_UNWINDER=YES
|
||
|
add_opt LLVM_INSTALL_TOOLCHAIN_ONLY=YES
|
||
|
add_opt LIBUNWIND_USE_COMPILER_RT=YES
|
||
|
add_opt LLVM_ENABLE_THREADS=NO
|
||
|
REWRITE="-ffile-prefix-map=$(pwd)=/builddir/"
|
||
|
CFLAGS="--sysroot=$SYSROOT -I$EXTRA_INCL $REWRITE"
|
||
|
LDFLAGS="-Wl,--dynamic-linker=$LOADER"
|
||
|
cmake -S llvm -B build -G 'Unix Makefiles' \
|
||
|
-DCMAKE_ASM_COMPILER=${intermediate-clang}/bin/clang \
|
||
|
-DCMAKE_C_COMPILER=${intermediate-clang}/bin/clang \
|
||
|
-DCMAKE_CXX_COMPILER=${intermediate-clang}/bin/clang++ \
|
||
|
-DLLVM_ENABLE_PROJECTS='clang;lld' \
|
||
|
-DLLVM_ENABLE_RUNTIMES='compiler-rt;libcxx;libcxxabi;libunwind' \
|
||
|
-DCMAKE_C_FLAGS="$CFLAGS" \
|
||
|
-DCMAKE_CXX_FLAGS="$CFLAGS" \
|
||
|
-DCMAKE_C_LINK_FLAGS="$LDFLAGS" \
|
||
|
-DCMAKE_CXX_LINK_FLAGS="$LDFLAGS" \
|
||
|
-DLLVM_BUILD_LLVM_DYLIB=YES \
|
||
|
-DLLVM_LINK_LLVM_DYLIB=YES \
|
||
|
-DCLANG_LINK_LLVM_DYLIB=YES \
|
||
|
$OPTS
|
||
|
# build:
|
||
|
make -C build -j $NPROC
|
||
|
# install:
|
||
|
make -C build install/strip
|
||
|
ln -s $out/lib/x86_64-unknown-linux-musl/* $out/lib/
|
||
|
mkdir -p $out/bin
|
||
|
ln -s $out/bin/clang $out/bin/cc
|
||
|
ln -s $out/bin/clang++ $out/bin/c++
|
||
|
ln -s $out/bin/clang-cpp $out/bin/cpp
|
||
|
ln -s $out/bin/lld $out/bin/ld
|
||
|
# mix new stuff into sysroot:
|
||
|
ln -s $out/lib/* $out/sysroot/lib/
|
||
|
# check for build path leaks:
|
||
|
( ! grep -rF $(pwd) $out )
|
||
|
'';
|
||
|
extra.allowedRequisites = [ "out" musl ];
|
||
|
extra.allowedReferences = [ "out" musl ];
|
||
|
}
|