Skip to content

Some building suggestions #2

@fcharlie

Description

@fcharlie

This project is fantastic, and I might incorporate it into my Github project. I have a few suggestions to help make it even better.

Clang defaults to libc++/libc++abi/libunwind

Advantages:

  • No longer depends on libstdc++/libgcc, etc.
  • One toolchain can support multiple architectures (similar to llvm-mingw).

Disadvantages: Requires adaptation.

Suggest

Additionally, LLVM_DISTRIBUTION_COMPONENTS can be used for trimming during the build process. Here is my script:

LLVM_TOOLCHAIN_TOOLS="llvm-ar;llvm-ranlib;llvm-objdump;llvm-rc;llvm-cvtres;llvm-nm;llvm-strings;llvm-readobj;llvm-dlltool;llvm-pdbutil;llvm-objcopy;llvm-strip;llvm-cov;llvm-profdata;llvm-addr2line;llvm-symbolizer;llvm-windres;llvm-ml;llvm-ml64;llvm-readelf;llvm-size;llvm-cxxfilt;llvm-lib;llvm-undname;llvm-dwarfdump"
LLVM_DISTRIBUTION_COMPONENTS="LLVM;clang;clang-resource-headers;lld;LTO;clang-format;$LLVM_TOOLCHAIN_TOOLS"
RUNTIME_TARGET="x86_64-unknown-linux-gnu"
cmake -GNinja -B build -S llvm \
	-DCMAKE_PREFIX_PATH=/usr/local \
	-DCMAKE_INSTALL_PREFIX="$INSTALL_PREFIX" \
	-DCMAKE_BUILD_TYPE=Release \
	-DCMAKE_INSTALL_RPATH="\$ORIGIN/../lib" \
	-DCMAKE_EXE_LINKER_FLAGS="-no-pie" \
	-DBUILD_SHARED_LIBS=OFF \
	-DLLVM_APPEND_VC_REV=OFF \
	-DLLVM_ENABLE_PROJECTS="clang;lld" \
	-DLLVM_TARGETS_TO_BUILD="X86;AArch64;RISCV;LoongArch" \
	-DLLVM_RUNTIME_TARGETS="$RUNTIME_TARGET" \
	-DLLVM_ENABLE_PLUGINS=OFF \
	-DLLVM_ENABLE_PIC=ON \
	-DLLVM_ENABLE_ZSTD=ON \
	-DZLIB_ROOT=/usr/local \
	-DZLIB_LIBRARY=/usr/local/lib64/libz.a \
	-DZLIB_INCLUDE_DIR=/usr/local/include \
	-DLLVM_ENABLE_LIBXML2=OFF \
	-DLLVM_ENABLE_LTO=Thin \
	-DLLVM_USE_LINKER="lld" \
	-DLLVM_BUILD_LLVM_DYLIB=ON \
	-DLLVM_LINK_LLVM_DYLIB=ON \
	-DLLVM_ENABLE_TELEMETRY=OFF \
	-DLLVM_TOOLCHAIN_TOOLS="$LLVM_TOOLCHAIN_TOOLS" \
	-DLLVM_DISTRIBUTION_COMPONENTS="$LLVM_DISTRIBUTION_COMPONENTS" \
	-DLLVM_INCLUDE_TESTS=OFF \
	-DCLANG_DEFAULT_PIE_ON_LINUX=ON \
	-DCLANG_LINK_CLANG_DYLIB=OFF \
	-DCLANG_ENABLE_STATIC_ANALYZER=OFF \
	-DCLANG_DEFAULT_LINKER="lld" \
	-DCLANG_DEFAULT_CXX_STDLIB="libc++" \
	-DCLANG_DEFAULT_UNWINDLIB="libunwind" \
	-DCLANG_DEFAULT_RTLIB="compiler-rt" \
	-DCLANG_ENABLE_OBJC_REWRITER=OFF \
	-DCLANG_ENABLE_CIR=OFF
ninja -C build distribution || exit

INSTALL_DEST="$SOURCE_DIR/rpm/_prefix"

DESTDIR="${INSTALL_DEST}"  ninja -C build install-distribution-stripped || exit

# build runtimes
mkdir runtimes_build || exit
LLVM_MAJOR_VERSION=$(echo "$LLVM_VERSION" | cut -d. -f1)
echo "LLVM_MAJOR_VERSION: ${LLVM_MAJOR_VERSION}"

CFLAGS="$CFLAGS -DNDEBUG -DSANITIZER_CAN_USE_PREINIT_ARRAY=0"
CXXFLAGS="$CXXFLAGS -DNDEBUG -DSANITIZER_CAN_USE_PREINIT_ARRAY=0"

cmake -B runtimes_build -G Ninja -Wno-dev -S runtimes \
	-DLLVM_ENABLE_RUNTIMES="compiler-rt;libunwind;libcxx;libcxxabi" \
	-DCMAKE_BUILD_TYPE=Release \
	-DCMAKE_INSTALL_PREFIX="$INSTALL_PREFIX" \
	-DLLVM_INCLUDE_TESTS=OFF \
	-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON \
	-DCOMPILER_RT_INCLUDE_TESTS=OFF \
	-DCOMPILER_RT_EXCLUDE_ATOMIC_BUILTIN=OFF \
	-DCOMPILER_RT_BUILD_SANITIZERS=ON \
	-DCOMPILER_RT_BUILD_GWP_ASAN=OFF \
	-DCOMPILER_RT_USE_BUILTINS_LIBRARY=ON \
	-DCOMPILER_RT_SCUDO_STANDALONE_BUILD_SHARED=OFF \
	-DCOMPILER_RT_INSTALL_PATH="$INSTALL_PREFIX/lib/clang/$LLVM_MAJOR_VERSION" \
	-DLIBUNWIND_ENABLE_SHARED=OFF \
	-DLIBUNWIND_ENABLE_ASSERTIONS=OFF \
	-DLIBUNWIND_USE_COMPILER_RT=OFF \
	-DLIBCXXABI_USE_LLVM_UNWINDER=OFF \
	-DLIBCXXABI_ENABLE_SHARED=OFF \
	-DLIBCXX_ENABLE_SHARED=OFF \
	-DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=OFF \
	-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON \
	-DLIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY=ON
# CMAKE_VERBOSE_MAKEFILE=ON
cmake --build runtimes_build || exit 1
DESTDIR="${INSTALL_DEST}" cmake --install runtimes_build || exit 1

rm -rf "${INSTALL_DEST}${INSTALL_PREFIX}/lib/cmake"
rm -rf "${INSTALL_DEST}${INSTALL_PREFIX}/include/llvm-c"
# show disk usage
du -sh "${INSTALL_DEST}"

cd "$SOURCE_DIR/rpm" || exit
nfpm package -f llvm-minimal.yml -p rpm -t . || exit

Packaging options: You can use nfpm to create deb, rpm, or apk installation packages.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions