#!/bin/sh set -eu jobs() { if command -v nproc >/dev/null 2>&1; then nproc else getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1 fi } target_triple() { printf '%s\n' "${CHOST:-x86_64-sfg-linux-gnu}" } assert_destdir() { [ "${DESTDIR:-}" != "" ] || { echo "build.sh: DESTDIR is not set" >&2 exit 1 } } haul_from_primary() { pkg=$1 shift old_destdir=$DESTDIR DESTDIR=$DEPOT_PRIMARY_DESTDIR export DESTDIR haul "$pkg" "$@" DESTDIR=$old_destdir export DESTDIR } depot_build() { j=$(jobs) triple=$(target_triple) cmake -G Ninja llvm \ -B build-clang-llvm \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER="$CC" \ -DCMAKE_CXX_COMPILER="$CXX" \ -DCMAKE_C_FLAGS="$CFLAGS" \ -DCMAKE_CXX_FLAGS="$CXXFLAGS" \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_SKIP_INSTALL_RPATH=ON \ -DLLVM_ENABLE_PROJECTS=clang\;lld\;flang \ -DLLVM_ENABLE_RUNTIMES=compiler-rt \ -DLLVM_USE_LINKER=lld \ -DLLVM_DEFAULT_TARGET_TRIPLE="$triple" \ -DLLVM_BUILD_LLVM_DYLIB=ON \ -DLLVM_LINK_LLVM_DYLIB=ON \ -DCLANG_LINK_CLANG_DYLIB=ON \ -DLLVM_ENABLE_RTTI=ON \ -DLLVM_ENABLE_FFI=ON \ -DCLANG_DEFAULT_PIE_ON_LINUX=ON \ -DLLVM_INCLUDE_BENCHMARKS=OFF \ -DCLANG_DEFAULT_CXX_STDLIB=libc++ \ -DCOMPILER_RT_BUILD_GWP_ASAN=OFF \ -DLLVM_INCLUDE_UTILS=ON \ -DLLVM_BUILD_UTILS=ON \ -DSANITIZER_CXX_ABI=libcxxabi \ -DLLVM_INSTALL_BINUTILS_SYMLINKS=ON \ -DCOMPILER_RT_DEFAULT_TARGET_ONLY=OFF \ -DCOMPILER_RT_BUILD_BUILTINS=ON \ -DLLVM_INSTALL_UTILS=ON \ -DCLANG_DEFAULT_UNWINDLIB="none" \ -DCOMPILER_RT_BUILD_SANITIZERS=ON \ -DCOMPILER_RT_BUILD_XRAY=ON \ -DCOMPILER_RT_BUILD_LIBFUZZER=ON \ -DCOMPILER_RT_BUILD_PROFILE=ON \ -DCOMPILER_RT_BUILD_MEMPROF=ON \ -DCOMPILER_RT_BUILD_ORC=ON \ -DCOMPILER_RT_BUILD_CRT=ON \ -DLLVM_BUILD_DOCS=ON \ -DCMAKE_INSTALL_DOCDIR=share/doc \ -DSPHINX_WARNINGS_AS_ERRORS=OFF \ -DLLVM_ENABLE_SPHINX=ON \ -DCOMPILER_RT_DEFAULT_TARGET_ARCH="i686;x86_64" \ -DCLANG_DEFAULT_RTLIB=compiler-rt \ -DLLVM_INCLUDE_TESTS=ON ninja -C build-clang-llvm -j"$j" cmake -G Ninja runtimes/ \ -B build-libcxx \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER="$CC" \ -DCMAKE_CXX_COMPILER="$CXX" \ -DCMAKE_INSTALL_PREFIX=/usr \ -DLLVM_ENABLE_RUNTIMES=libcxx\;libcxxabi\;libunwind \ -DCMAKE_C_COMPILER_TARGET="$triple" \ -DCMAKE_CXX_COMPILER_TARGET="$triple" \ -DLLVM_DEFAULT_TARGET_TRIPLE="$triple" \ -DLLVM_ENABLE_LTO=Thin \ -DLLVM_ENABLE_SPHINX=ON \ -DLIBCXX_INCLUDE_DOCS=ON \ -DCMAKE_INSTALL_DOCDIR=share/doc \ -DSPHINX_WARNINGS_AS_ERRORS=OFF \ -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS -unwindlib=libunwind -rtlib=compiler-rt" \ -DCMAKE_SHARED_LINKER_FLAGS="$LDFLAGS -unwindlib=libunwind -rtlib=compiler-rt" ninja -C build-libcxx -j"$j" cmake -G Ninja llvm-libgcc \ -DCMAKE_C_COMPILER="$CC" \ -DCMAKE_CXX_COMPILER="$CXX" \ -B build-llvm-libgcc \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_INSTALL_LIBDIR=lib \ -DCOMPILER_RT_BUILD_BUILTINS=ON \ -DCOMPILER_RT_BUILD_LIBUNWIND=ON \ -DCOMPILER_RT_BUILD_XRAY=OFF \ -DCOMPILER_RT_BUILD_PROFILE=OFF \ -DLLVM_LIBGCC_EXPLICIT_OPT_IN=Yes \ -DCMAKE_C_COMPILER_TARGET="$triple" \ -DCMAKE_CXX_COMPILER_TARGET="$triple" \ -DLLVM_DEFAULT_TARGET_TRIPLE="$triple" \ -DCOMPILER_RT_BUILD_CRT=ON \ -DCOMPILER_RT_BUILD_ORC=OFF \ -DCOMPILER_RT_BAREMETAL_BUILD=OFF \ -DCOMPILER_RT_USE_LLVM_UNWINDER=ON \ -DCOMPILER_RT_ENABLE_STATIC_UNWINDER=ON \ -DCOMPILER_RT_BUILD_SANITIZERS=OFF \ -DCOMPILER_RT_BUILD_MEMPROF=OFF \ -DCOMPILER_RT_BUILD_CTX_PROFILE=OFF \ -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS -unwindlib=libunwind -rtlib=compiler-rt" \ -DCMAKE_SHARED_LINKER_FLAGS="$LDFLAGS -unwindlib=libunwind -rtlib=compiler-rt" ninja -C build-llvm-libgcc -j"$j" } depot_install() { # Primary package: install the big LLVM/Clang/Flang tree once, then split from it. assert_destdir DESTDIR="$DESTDIR" cmake --install build-clang-llvm ln -snf clang "$DESTDIR/usr/bin/cc" ln -snf clang++ "$DESTDIR/usr/bin/c++" ln -snf flang "$DESTDIR/usr/bin/f95" ln -snf ld.lld "$DESTDIR/usr/bin/ld" ln -snf linux/clang_rt.crtbegin-x86_64.o "$DESTDIR/usr/lib/crtbeginS.o" ln -snf linux/clang_rt.crtend-x86_64.o "$DESTDIR/usr/lib/crtendS.o" ln -snf linux/clang_rt.crtbegin-x86_64.o "$DESTDIR/usr/lib/crtbeginT.o" ln -snf linux/clang_rt.crtend-x86_64.o "$DESTDIR/usr/lib/crtendT.o" ln -snf linux/clang_rt.crtbegin-x86_64.o "$DESTDIR/usr/lib/crtbegin.o" ln -snf linux/clang_rt.crtend-x86_64.o "$DESTDIR/usr/lib/crtend.o" if [ -f "$DESTDIR/usr/share/clang/bash-autocomplete.sh" ]; then mkdir -p "$DESTDIR/usr/share/bash-completion/completions" mv "$DESTDIR/usr/share/clang/bash-autocomplete.sh" \ "$DESTDIR/usr/share/bash-completion/completions/clang" fi } depot_install_llvm_libs() { # Split shared LLVM libraries out of the primary LLVM install tree. haul_from_primary llvm-libs 'usr/lib/libLLVM*.so*' haul_from_primary llvm-libs 'usr/lib/libLTO.so*' haul_from_primary llvm-libs 'usr/lib/libRemarks.so*' } depot_install_clang() { haul_from_primary clang 'usr/bin/analyze-build' haul_from_primary clang 'usr/bin/amdgpu-arch' haul_from_primary clang 'usr/bin/c-index-test' haul_from_primary clang 'usr/bin/clang*' haul_from_primary clang 'usr/bin/diagtool' haul_from_primary clang 'usr/bin/git-clang-format' haul_from_primary clang 'usr/bin/hmaptool' haul_from_primary clang 'usr/bin/intercept-build' haul_from_primary clang 'usr/bin/nvptx-arch' haul_from_primary clang 'usr/bin/scan-build*' haul_from_primary clang 'usr/bin/scan-view' haul_from_primary clang 'usr/bin/cc' haul_from_primary clang 'usr/bin/c++' haul_from_primary clang 'usr/include/clang*' haul_from_primary clang 'usr/lib/clang' haul_from_primary clang 'usr/lib/cmake/clang' haul_from_primary clang 'usr/lib/libclang*.so*' haul_from_primary clang 'usr/share/clang*' haul_from_primary clang 'usr/share/scan-build' haul_from_primary clang 'usr/share/scan-view' haul_from_primary clang 'usr/share/bash-completion/completions/clang' haul_from_primary clang 'usr/lib/crt*' haul_from_primary clang 'usr/share/doc/clang*' haul_from_primary clang 'usr/share/man/man1/clang*' } depot_install_libcxx() { assert_destdir DESTDIR="$DESTDIR" cmake --install build-libcxx # Keep libcxx package focused (libunwind belongs to llvm-libgcc in this split). rm -f "$DESTDIR/usr/include/__libunwind_config.h" \ "$DESTDIR/usr/include/libunwind.h" \ "$DESTDIR/usr/include/libunwind.modulemap" \ "$DESTDIR/usr/include/unwind.h" \ "$DESTDIR/usr/include/unwind_itanium.h" \ "$DESTDIR/usr/include/unwind_arm_ehabi.h" \ "$DESTDIR/usr/include/mach-o/compact_unwind_encoding.h" rm -f "$DESTDIR/usr/lib/libunwind.so" \ "$DESTDIR/usr/lib/libunwind.so.1" \ "$DESTDIR/usr/lib/libunwind.so.1.0" \ "$DESTDIR/usr/lib/libunwind.a" rm -rf "$DESTDIR/usr/lib/cmake/libunwind" rmdir "$DESTDIR/usr/include/mach-o" 2>/dev/null || true } depot_install_llvm_libgcc() { assert_destdir DESTDIR="$DESTDIR" cmake --install build-llvm-libgcc } depot_install_flang() { haul_from_primary flang 'usr/bin/flang*' haul_from_primary flang 'usr/bin/tco' haul_from_primary flang 'usr/bin/fir-*' haul_from_primary flang 'usr/bin/f95' haul_from_primary flang 'usr/include/flang*' haul_from_primary flang 'usr/lib/cmake/flang*' haul_from_primary flang 'usr/lib/libFIR*' haul_from_primary flang 'usr/lib/libFortran*' haul_from_primary flang 'usr/lib/libFlang*' haul_from_primary flang 'usr/lib/libflang*' haul_from_primary flang 'usr/lib/libCUFAttrs.a' haul_from_primary flang 'usr/lib/libCUFDialect.a' haul_from_primary flang 'usr/share/man/man1/flang*' }