pkgname=llvm-git pkgdesc="LLVM Toolchain with clang, clang-tools-extra, compiler-rt, openmp, polly, lldb, lld" pkgver=18.0.0_r481075.7d1a9e81b0b5 pkgrel=1 arch=('x86_64') url="https://llvm.org/" license=('custom:Apache 2.0 with LLVM Exception') provides=('aur-llvm-git' 'compiler-rt-git' 'clang-git' 'lld-git' 'polly-git' 'aur-llvm-libs-git' 'llvm-libs' 'polly-git' 'openmp-git' 'pstl-git' 'llvm' 'compiler-rt' 'clang' 'polly' 'lld' 'openmp' 'pstl') # A package always provides itself, so there's no need to provide llvm-git conflicts=('llvm' 'compiler-rt' 'clang' 'polly' 'lld' 'llvm-libs' 'openmp' 'pstl') depends=('libelf' 'libffi' 'libedit' 'libxml2' 'ncurses') _ocaml_ver=5.0.0 makedepends=( 'git' 'ninja' 'cmake' "ocaml>=${_ocaml_ver}" 'ocaml-ctypes' 'ocaml-findlib' 'ocaml-stdlib-shims' 'python-setuptools' 'python-psutil' 'python-recommonmark' 'clang' 'lld' 'llvm-libs' 'llvm' 'mold' ) makedepends_x86_64=('lib32-gcc-libs') source=( "llvm-project::git+https://github.com/llvm/llvm-project.git" 'llvm-config.h' 'improve-kernel-compile.patch' 'fmafusion.patch' 'haswell.patch' 'corecount.patch' ) sha256sums=('SKIP' '597dc5968c695bbdbb0eac9e8eb5117fcd2773bc91edf5ec103ecffffab8bc48' '593ed385298623711070dffce9225cb448dfc29f30c9d950887882b19bd124fb') options=('staticlibs') pkgver() { cd llvm-project/llvm # This will almost match the output of `llvm-config --version` when the # LLVM_APPEND_VC_REV cmake flag is turned on. The only difference is # dash being replaced with underscore because of Pacman requirements. local _pkgver=$(awk -F 'MAJOR |MINOR |PATCH |)' \ 'BEGIN { ORS="." ; i=0 } \ /set\(LLVM_VERSION_/ { print $2 ; i++ ; if (i==2) ORS="" } \ END { print "\n" }' \ CMakeLists.txt)_r$(git rev-list --count HEAD).$(git rev-parse --short HEAD) echo "$_pkgver" } _rpatch() { echo -e "\E[1;33m Revert patch: ${1}\E[0m" patch --forward --reverse --strip=1 --input="${srcdir:?}/${1}" } _patch() { echo -e "\E[1;33m Apply patch: ${1}\E[0m" patch --forward --strip=1 --input="${srcdir:?}/${1}" } prepare() { cd "${srcdir:?}/llvm-project" || ( echo -e "\E[1;31mCan't cd to ${srcdir}/llvm-project directory! Prepare Failed! \E[0m" exit 1 ) _patch fmafusion.patch _patch corecount.patch _patch haswell.patch _patch improve-kernel-compile.patch # Attempt to convert script to Python 3 2to3 -wn --no-diffs \ clang-tools-extra/clang-include-fixer/find-all-symbols/tool/run-find-all-symbols.py } build() { cd "${srcdir:?}/llvm-project" || ( echo -e "\E[1;31mCan't cd to ${srcdir}/llvm-project directory! Build Failed! \E[0m" exit 1 ) if clang --version 2>/dev/null | grep -iq "clang\s*version\s*[0-9]"; then export CC=clang export CXX=clang++ export AR=llvm-ar export AS=llvm-as export NM=llvm-nm export STRIP=llvm-strip export OBJCOPY=llvm-objcopy export OBJDUMP=llvm-objdump export READELF=llvm-readelf export HOSTCC=clang export HOSTCXX=clang++ export HOSTAR=llvm-ar export DEBUG_CFLAGS="-g0" export DEBUG_CXXFLAGS="-g0" _extra_build_flags+=( -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ) else echo -e "\E[1;31mClang not found. Will use default system compiler! \E[0m" fi if ld.mold --version 2>/dev/null | grep -iq "LLD\s*[0-9]"; then export LD=ld.lld export CC_LD=lld export CXX_LD=lld export HOSTLD=ld.lld _extra_build_flags+=(-DLLVM_USE_LINKER=lld) fi cmake -S llvm -B build -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr \ -DLLVM_BINUTILS_INCDIR=/usr/include \ -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \ -DLLVM_HOST_TRIPLE=$CHOST \ -DLLVM_DEFAULT_TARGET_TRIPLE="x86_64-pc-linux-gnu" \ -DLLVM_BUILD_RUNTIME=ON \ -DLLVM_BUILD_LLVM_DYLIB=ON \ -DLLVM_LINK_LLVM_DYLIB=ON \ -DCLANG_LINK_CLANG_DYLIB=ON \ -DLLVM_DYLIB_COMPONENTS="all" \ -DLLVM_INSTALL_UTILS=ON \ -DLLVM_ENABLE_RTTI=ON \ -DLLVM_ENABLE_FFI=ON \ -DLLVM_ENABLE_BINDINGS=OFF \ -DCMAKE_C_FLAGS="$CFLAGS -g0 -Wp,-D_FORTIFY_SOURCE=0" \ -DCMAKE_CXX_FLAGS="$CXXFLAGS -g0 -Wp,-D_FORTIFY_SOURCE=0" \ -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" \ -DCMAKE_MODULE_LINKER_FLAGS="$LDFLAGS" \ -DCMAKE_SHARED_LINKER_FLAGS="$LDFLAGS" \ -DLLVM_INCLUDE_BENCHMARKS=OFF \ -DLLVM_INCLUDE_TESTS=OFF \ -DLLVM_INCLUDE_EXAMPLES=OFF \ -DLLVM_BUILD_DOCS=OFF \ -DLLVM_INCLUDE_DOCS=OFF \ -DLLVM_ENABLE_OCAMLDOC=OFF \ -DLLVM_ENABLE_SPHINX=OFF \ -DLLVM_ENABLE_DOXYGEN=OFF \ -DLLVM_POLLY_LINK_INTO_TOOLS=ON \ -DLLVM_TARGETS_TO_BUILD="AMDGPU;X86;BPF" \ -DLLVM_ENABLE_PROJECTS="clang;lld;polly;openmp;compiler-rt;bolt" \ -D LLVM_ENABLE_ZLIB=ON \ -D LLVM_ENABLE_ZSTD=ON \ -D LIBCLANG_BUILD_STATIC=ON \ -DLIBOMP_ARCH="i386;x86_64" \ -DLIBOMP_ENABLE_OFFLOADING=OFF \ -DLIBOMP_INSTALL_ALIASES=ON \ -DLIBOMP_ENABLE_SHARED=ON \ -DOPENMP_ENABLE_LIBOMP_PROFILING=OFF \ -DLIBOMP_OMPT_SUPPORT=OFF \ -DLLVM_INSTALL_TOOLCHAIN_ONLY=OFF \ -DCLANG_DEFAULT_PIE_ON_LINUX=OFF \ "${_extra_build_flags[@]}" ninja -C build } _python_optimize() { python -m compileall "$@" python -O -m compileall "$@" python -OO -m compileall "$@" } package() { cd "${srcdir:?}/llvm-project" || ( echo -e "\E[1;31mCan't cd to ${srcdir}/llvm-project directory! Package Failed! \E[0m" exit 1 ) if [[ _build_documentation -eq 0 ]]; then mkdir -p "${srcdir:?}/llvm-project/build/docs/ocamldoc/html/" fi DESTDIR="${pkgdir:?}" ninja -C build install pushd llvm/utils/lit || ( echo -e "\E[1;31mpushd utils/lit - Package Failed! \E[0m" exit 1 ) python setup.py install --root="${pkgdir:?}" -O1 popd || ( echo -e "\E[1;31mpopd - Package Failed! \E[0m" exit 1 ) if [[ "${CARCH:?}" == "x86_64" ]]; then mv "${pkgdir:?}/usr/include/llvm/Config/llvm-config"{,-64}.h cp "${srcdir:?}/llvm-config.h" "${pkgdir:?}/usr/include/llvm/Config/llvm-config.h" fi # Symlink LLVMgold.so from /usr/lib/bfd-plugins # https://bugs.archlinux.org/task/28479 mkdir -p "${pkgdir:?}/usr/lib/bfd-plugins" ln -s ../LLVMgold.so "${pkgdir:?}/usr/lib/bfd-plugins/LLVMgold.so" # Clang site_packages=$(python -c "import site; print(site.getsitepackages()[0])") install -d "${pkgdir:?}/${site_packages}" mv "${pkgdir:?}/usr/lib/"{libear,libscanbuild} "${pkgdir:?}/${site_packages}/" #cp -a llvm/bindings/python/llvm "${pkgdir:?}/${site_packages}/" #cp -a clang/bindings/python/clang "${pkgdir:?}/${site_packages}/" mv "${pkgdir:?}"/usr/libexec/* "${pkgdir:?}/usr/lib/clang/" rm -fr "${pkgdir:?}/usr/libexec" sed -i 's|libexec|lib/clang|' \ "${pkgdir:?}/usr/bin/scan-build" \ "${pkgdir:?}/${site_packages}/libscanbuild/analyze.py" _python_optimize "${pkgdir:?}/usr/share" "${pkgdir:?}/${site_packages}" # Remove html documentation if [[ _build_documentation -eq 0 ]]; then rm -fr "${pkgdir:?}/usr/share/doc" fi # Licenses install -Dm644 "${srcdir:?}/llvm-project/llvm/LICENSE.TXT" "${pkgdir:?}/usr/share/licenses/${pkgname}/llvm-LICENSE" install -Dm644 "${srcdir:?}/llvm-project/clang/LICENSE.TXT" "${pkgdir:?}/usr/share/licenses/${pkgname}/clang-LICENSE" install -Dm644 "${srcdir:?}/llvm-project/clang-tools-extra/LICENSE.TXT" "${pkgdir:?}/usr/share/licenses/${pkgname}/clang-tools-extra-LICENSE" install -Dm644 "${srcdir:?}/llvm-project/compiler-rt/LICENSE.TXT" "${pkgdir:?}/usr/share/licenses/${pkgname}/compiler-rt-LICENSE" install -Dm644 "${srcdir:?}/llvm-project/lld/LICENSE.TXT" "${pkgdir:?}/usr/share/licenses/${pkgname}/lld-LICENSE" install -Dm644 "${srcdir:?}/llvm-project/polly/LICENSE.TXT" "${pkgdir:?}/usr/share/licenses/${pkgname}/polly-LICENSE" install -Dm644 "${srcdir:?}/llvm-project/openmp/LICENSE.TXT" "${pkgdir:?}/usr/share/licenses/${pkgname}/openmp-LICENSE" }