File PKGBUILD of Package llvm21

pkgname=('llvm21' 'llvm21-libs')
pkgver=21.1.3
pkgrel=1
arch=('x86_64')
url="https://llvm.org/"
license=('Apache-2.0 WITH LLVM-exception')
makedepends=(
  'cmake' 'ninja' 'zlib' 'zstd'
  'python' 'mold'
)
options=('staticlibs' '!lto') # tools/llvm-shlib/typeids.test fails with LTO
source=(llvm-project.tar)
b2sums=('SKIP')

# Utilizing LLVM_DISTRIBUTION_COMPONENTS to avoid
# installing static libraries; inspired by Gentoo
_get_distribution_components() {
  local target
  ninja -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) ;;
    # used by lldb
    LLVMDebuginfod) ;;
    # 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() {
  cd llvm-project/llvm
  mkdir build

  # Remove CMake find module for zstd; breaks if out of sync with upstream zstd
  rm cmake/modules/Findzstd.cmake
}

build() {
  cd llvm-project/llvm/build

  # Build only minimal debug info to reduce size
  CFLAGS=${CFLAGS/-g /-g1 }
  CXXFLAGS=${CXXFLAGS/-g /-g1 }

  local cmake_args=(
    CMAKE_BUILD_TYPE=Release
    CMAKE_INSTALL_PREFIX=/usr/lib/llvm21
    CMAKE_BUILD_WITH_INSTALL_RPATH=ON
    LLVM_BINUTILS_INCDIR=/usr/include
    LLVM_BUILD_DOCS=OFF
    LLVM_BUILD_LLVM_DYLIB=ON
    LLVM_BUILD_TESTS=OFF
    LLVM_ENABLE_LIBXML2=OFF
    LLVM_ENABLE_LIBEDIT=OFF
    LLVM_ENABLE_BINDINGS=OFF
    LLVM_ENABLE_CURL=OFF
    LLVM_ENABLE_FFI=OFF
    LLVM_ENABLE_RTTI=OFF
    LLVM_ENABLE_SPHINX=OFF
    LLVM_ENABLE_UNWIND_TABLES=OFF
    LLVM_ENABLE_ASSERTIONS=OFF
    LLVM_HOST_TRIPLE=$CHOST
    LLVM_INCLUDE_BENCHMARKS=OFF
    LLVM_INCLUDE_EXAMPLES=OFF
    LLVM_INCLUDE_TESTS=OFF
    LLVM_INSTALL_GTEST=OFF
    LLVM_INSTALL_UTILS=ON
    LLVM_LINK_LLVM_DYLIB=ON
    LLVM_USE_PERF=ON
    LLVM_CCACHE_BUILD=ON

    CMAKE_C_FLAGS="-O3 -march=znver3 -pipe"
    CMAKE_CXX_FLAGS="-O3 -march=znver3 -pipe"
    LLVM_USE_LINKER=mold
  )

  cmake .. -GNinja "${cmake_args[@]/#/-D}"
  local distribution_components=$(_get_distribution_components | paste -sd\;)
  test -n "$distribution_components"
  cmake_args+=(LLVM_DISTRIBUTION_COMPONENTS="$distribution_components")

  cmake .. -GNinja "${cmake_args[@]/#/-D}"
  ninja
}

package_llvm21() {
  pkgdesc="Compiler infrastructure (LLVM 21)"
  depends=('llvm21-libs' 'perl')

  cd llvm-project/llvm/build

  DESTDIR="$pkgdir" ninja install-distribution

  # The runtime libraries go into llvm21-libs
  mv -f "$pkgdir"/usr/lib/llvm21/lib/lib{LLVM,LTO,Remarks}*.so* "$srcdir"
  mv -f "$pkgdir"/usr/lib/llvm21/lib/LLVMgold.so "$srcdir"

  # Create versioned symlinks from /usr/bin/ to /usr/lib/llvm21/bin/
  install -d "$pkgdir/usr/bin"
  local _binary
  for _binary in "$pkgdir"/usr/lib/llvm21/bin/*; do
    local _basename=${_binary##*/}
    ln -s "../lib/llvm21/bin/$_basename" "$pkgdir/usr/bin/$_basename-21"
  done

  install -Dm644 ../LICENSE.TXT "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}

package_llvm21-libs() {
  pkgdesc="LLVM 21 runtime libraries"
  depends=('gcc-libs' 'zlib' 'zstd')

  install -d "$pkgdir/usr/lib/llvm21/lib"
  cp -P \
    "$srcdir"/lib{LLVM,LTO,Remarks}*.so* \
    "$srcdir"/LLVMgold.so \
    "$pkgdir/usr/lib/llvm21/lib/"

  install -Dm644 "$srcdir/llvm-project/llvm/LICENSE.TXT" \
    "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}

# vim:set ts=2 sw=2 et:
openSUSE Build Service is sponsored by