pkgname=('llvm' 'llvm-libs') pkgver=19.1.6 pkgrel=2 arch=('x86_64') url="https://llvm.org/" license=('Apache-2.0 WITH LLVM-exception') makedepends=( 'cmake' 'curl' 'libedit' 'libffi' 'libxml2' 'ninja' 'python-myst-parser' 'python-psutil' 'python-setuptools' 'python-sphinx' 'zlib' 'zstd' ) options=('!staticlibs' '!lto') # tools/llvm-shlib/typeids.test fails with LTO source=(https://github.com/llvm/llvm-project/releases/download/llvmorg-${pkgver}/llvm-${pkgver}.src.tar.xz https://github.com/llvm/llvm-project/releases/download/llvmorg-${pkgver}/cmake-${pkgver}.src.tar.xz https://github.com/llvm/llvm-project/releases/download/llvmorg-${pkgver}/third-party-${pkgver}.src.tar.xz) sha256sums=(ad1a3b125ff014ded290094088de40efb9193ce81a24278184230b7d401f8a3e 9c7ec82d9a240dc2287b8de89d6881bb64ceea0dcd6ce133c34ef65bda22d99e 0e8048333bab2ba3607910e5d074259f08dccf00615778d03a2a55416718eb45) # Utilizing LLVM_DISTRIBUTION_COMPONENTS to avoid # installing static libraries; inspired by Gentoo _get_distribution_components() { local target ninja -C flarebird-build -t targets | grep -Po 'install-\K.*(?=-stripped:)' | while read -r target; do case ${target} in llvm-libraries|distribution) continue ;; # shared libraries LLVM|LLVMgold) ;; # libraries needed for clang-tblgen LLVMDemangle|LLVMSupport|LLVMTableGen) ;; # testing libraries LLVMTestingAnnotations|LLVMTestingSupport) ;; # exclude static libraries LLVM*) continue ;; # exclude llvm-exegesis (doesn't seem useful without libpfm) llvm-exegesis) continue ;; esac echo ${target} done } prepare() { rename -v -- "-${pkgver}.src" '' {cmake,third-party}-${pkgver}.src cd llvm-${pkgver}.src # Remove CMake find module for zstd; breaks if out of sync with upstream zstd rm cmake/modules/Findzstd.cmake } build() { cd llvm-${pkgver}.src # Build only minimal debug info to reduce size CFLAGS=${CFLAGS/-g /-g1 } CXXFLAGS=${CXXFLAGS/-g /-g1 } local cmake_args=( # 指定编译输出目录为 flarebird-build -B flarebird-build # 使用 Ninja 构建系统,Ninja 是一个小型的、注重速度的构建系统 -G Ninja # 设置编译类型为 Release,这种模式下编译器会进行各种优化,生成的可执行文件或库更适合生产环境 -D CMAKE_BUILD_TYPE=Release # 设置安装文档的目录为 /usr/share/doc -D CMAKE_INSTALL_DOCDIR=share/doc # 设置 LLVM 的安装路径为 /usr -D CMAKE_INSTALL_PREFIX=/usr # 设置库目录的后缀为 64,通常用于区分不同架构或安装配置下的库目录 -D LLVM_LIBDIR_SUFFIX=64 # 告诉 CMake 跳过生成运行时搜索路径(RPATH),这在某些情况下可以避免运行时链接问题 -D CMAKE_SKIP_RPATH=ON # 指定 LLVM 二进制工具的包含目录,用于查找相关的头文件 -D LLVM_BINUTILS_INCDIR=/usr/include # 开启 LLVM 文档的构建 -D LLVM_BUILD_DOCS=ON # 构建 LLVM 动态库 -D LLVM_BUILD_LLVM_DYLIB=ON # 开启 LLVM 测试的构建 -D LLVM_BUILD_TESTS=ON # 不启用 LLVM 的绑定(例如 Python 绑定等) -D LLVM_ENABLE_BINDINGS=OFF # 启用 CURL 支持,这可能用于 LLVM 中需要网络请求的功能 -D LLVM_ENABLE_CURL=ON # 启用 Foreign Function Interface(FFI)支持,允许 LLVM 与外部 C 语言函数进行交互 -D LLVM_ENABLE_FFI=ON # 启用运行时类型信息(RTTI),这对于支持 C++ 的某些特性(如 dynamic_cast)是必要的 -D LLVM_ENABLE_RTTI=ON # 启用 Sphinx 支持,Sphinx 用于生成文档,结合 LLVM_BUILD_DOCS=ON 可以生成 LLVM 的文档 -D LLVM_ENABLE_SPHINX=ON # 设置 LLVM 主机的三元组,这里使用环境变量 ${CHOST},主机三元组描述了主机的架构、操作系统等信息 -D LLVM_HOST_TRIPLE=${CHOST} # 不包含基准测试代码,基准测试通常用于性能评估,不包含可以减少编译时间和生成文件的大小 -D LLVM_INCLUDE_BENCHMARKS=OFF # 安装 Google Test(GTest),GTest 是一个广泛使用的 C++ 测试框架,用于 LLVM 的测试 -D LLVM_INSTALL_GTEST=ON # 安装 LLVM 的实用工具 -D LLVM_INSTALL_UTILS=ON # 链接 LLVM 动态库 -D LLVM_LINK_LLVM_DYLIB=ON # 启用性能相关的功能,这可能用于性能分析和优化 -D LLVM_USE_PERF=ON # 不将 Sphinx 生成文档时的警告视为错误,这样即使有一些小的警告,文档生成也不会失败 -D SPHINX_WARNINGS_AS_ERRORS=OFF # 指定要构建的目标架构为 X86 和 AMDGPU,这意味着 LLVM 将生成针对这两种架构的代码和支持 -D LLVM_TARGETS_TO_BUILD="X86;AMDGPU" ) cmake ${cmake_args[@]} local distribution_components=$(_get_distribution_components | paste -sd\;) test -n ${distribution_components} cmake_args+=(-DLLVM_DISTRIBUTION_COMPONENTS=${distribution_components}) cmake ${cmake_args[@]} ninja -C flarebird-build } package_llvm() { pkgdesc="Compiler infrastructure" depends=('llvm-libs' 'curl' 'perl') cd llvm-${pkgver}.src DESTDIR=${pkgdir} ninja -C flarebird-build install # Include lit for running lit-based tests in other projects pushd utils/lit python3 setup.py install --root=${pkgdir} -O1 popd # The runtime libraries go into llvm-libs _pick llvm-libs ${pkgdir}/usr/lib64/lib{LLVM,LTO,Remarks}*.so* _pick llvm-libs ${pkgdir}/usr/lib64/LLVMgold.so # Remove documentation sources rm -r ${pkgdir}/usr/share/doc/llvm/html/{_sources,.buildinfo} } package_llvm-libs() { pkgdesc="LLVM runtime libraries" depends=('gcc-libs' 'zlib' 'zstd' 'libffi' 'libedit' 'libxml2') mv ${pkgname}/* ${pkgdir} # Symlink LLVMgold.so from /usr/lib/bfd-plugins # https://bugs.archlinux.org/task/28479 install -d ${pkgdir}/usr/lib64/bfd-plugins ln -s ../LLVMgold.so ${pkgdir}/usr/lib64/bfd-plugins/LLVMgold.so }