llvm: removed static libs attempt again

This commit is contained in:
Moritz Gmeiner 2025-12-07 13:34:36 +01:00
commit 46ec913c55
4 changed files with 0 additions and 1048 deletions

View file

@ -1,3 +0,0 @@
DIST llvm-19.1.0-manpages.tar.bz2 286165 BLAKE2B d96df2e748d2d52af2e8b7023f59af9ab53a9e59480ff228726bf629f1ecd813af80f3ba4126919092beb7ad8214193e828f997d300c705b0d8b90d6aedb22ee SHA512 aed63dee6629fe9116a9ce21e8bfb0e2c0b80ad276c6551f445ef01c71e130fef1615679adba8386ab57cac5104a153919e0b0df6bd66e023c5f0398081d2374
DIST llvm-project-19.1.7.src.tar.xz 141249332 BLAKE2B 1259ed7f9aca7b35e89d818befdee20fd8bed4d2dc2c2c6f6f56451fd43d35ac03a0a5a406e142d22b25137999dc5b17471c196f8fcf79f20a8296832d900f6d SHA512 c7d63286d662707a9cd54758c9e3aaf52794a91900c484c4a6efa62d90bc719d5e7a345e4192feeb0c9fd11c82570d64677c781e5be1d645556b6aa018e47ec8
DIST llvm-project-19.1.7.src.tar.xz.sig 438 BLAKE2B 4015140f4ba77de45039bdbdfbaf6f30e75705123d067ea97175d91d7a5b6a75008df01d99ae7aa16aaa3b101f3f41e38d01f04158f95a261d617b3ede0254cd SHA512 195797b06ac80a742e0ccbc03a50dc06dd2e04377d783d5474e3e72c5a75203b60292b047929312a411d22b137a239943fba414a4d136a2be14cbff978eb6bda

View file

@ -1,476 +0,0 @@
# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
PYTHON_COMPAT=(python3_{11..13})
inherit cmake llvm.org multilib multilib-minimal
inherit prefix python-single-r1 toolchain-funcs
DESCRIPTION="C language family frontend for LLVM"
HOMEPAGE="https://llvm.org/"
# MSVCSetupApi.h: MIT
# sorttable.js: MIT
LICENSE="Apache-2.0-with-LLVM-exceptions UoI-NCSA MIT"
SLOT="${LLVM_MAJOR}/${LLVM_SOABI}"
KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~sparc x86 ~amd64-linux ~arm64-macos ~x64-macos"
IUSE="debug doc +extra ieee-long-double +pie +static-analyzer test xml static-libs"
REQUIRED_USE="${PYTHON_REQUIRED_USE}"
RESTRICT="!test? ( test )"
DEPEND="
~llvm-core/llvm-${PV}:${LLVM_MAJOR}=[debug=,${MULTILIB_USEDEP}]
static-analyzer? ( dev-lang/perl:* )
xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] )
"
RDEPEND="
${PYTHON_DEPS}
${DEPEND}
>=llvm-core/clang-common-${PV}
"
BDEPEND="
${PYTHON_DEPS}
test? ( ~llvm-core/lld-${PV} )
xml? ( virtual/pkgconfig )
"
PDEPEND="
~llvm-runtimes/clang-runtime-${PV}
llvm-core/clang-toolchain-symlinks:${LLVM_MAJOR}
"
LLVM_COMPONENTS=(
clang clang-tools-extra cmake
)
LLVM_MANPAGES=1
LLVM_TEST_COMPONENTS=(
llvm/utils
)
LLVM_USE_TARGETS=llvm
llvm.org_set_globals
[[ -n ${LLVM_MANPAGE_DIST} ]] && BDEPEND+=" doc? ( "
BDEPEND+="
$(python_gen_cond_dep '
dev-python/myst-parser[${PYTHON_USEDEP}]
dev-python/sphinx[${PYTHON_USEDEP}]
')
"
[[ -n ${LLVM_MANPAGE_DIST} ]] && BDEPEND+=" ) "
# Multilib notes:
# 1. ABI_* flags control ABIs libclang* is built for only.
# 2. clang is always capable of compiling code for all ABIs for enabled
# target. However, you will need appropriate crt* files (installed
# e.g. by sys-devel/gcc and sys-libs/glibc).
# 3. ${CHOST}-clang wrappers are always installed for all ABIs included
# in the current profile (i.e. alike supported by sys-devel/gcc).
#
# Therefore: use llvm-core/clang[${MULTILIB_USEDEP}] only if you need
# multilib clang* libraries (not runtime, not wrappers).
src_prepare() {
# create extra parent dir for relative CLANG_RESOURCE_DIR access
mkdir -p x/y || die
BUILD_DIR=${WORKDIR}/x/y/clang
llvm.org_src_prepare
# add Gentoo Portage Prefix for Darwin (see prefix-dirs.patch)
eprefixify \
lib/Lex/InitHeaderSearch.cpp \
lib/Driver/ToolChains/Darwin.cpp || die
if ! use prefix-guest && [[ -n ${EPREFIX} ]]; then
sed -i "/LibDir.*Loader/s@return \"\/\"@return \"${EPREFIX}/\"@" lib/Driver/ToolChains/Linux.cpp || die
fi
}
check_distribution_components() {
if [[ ${CMAKE_MAKEFILE_GENERATOR} == ninja ]]; then
local all_targets=() my_targets=() l
cd "${BUILD_DIR}" || die
while read -r l; do
if [[ ${l} == install-*-stripped:* ]]; then
l=${l#install-}
l=${l%%-stripped*}
case ${l} in
# meta-targets
clang-libraries | distribution)
continue
;;
# tools
clang | clangd | clang-*) ;;
# static libraries
clang* | findAllSymbols)
continue
;;
# conditional to USE=doc
docs-clang-html | docs-clang-tools-html)
use doc || continue
;;
esac
all_targets+=("${l}")
fi
done < <(${NINJA} -t targets all)
while read -r l; do
my_targets+=("${l}")
done < <(get_distribution_components $"\n")
local add=() remove=()
for l in "${all_targets[@]}"; do
if ! has "${l}" "${my_targets[@]}"; then
add+=("${l}")
fi
done
for l in "${my_targets[@]}"; do
if ! has "${l}" "${all_targets[@]}"; then
remove+=("${l}")
fi
done
if [[ ${#add[@]} -gt 0 || ${#remove[@]} -gt 0 ]]; then
eqawarn "get_distribution_components() is outdated!"
eqawarn " Add: ${add[*]}"
eqawarn "Remove: ${remove[*]}"
fi
cd - >/dev/null || die
fi
}
get_distribution_components() {
local sep=${1-;}
local out=(
# common stuff
clang-cmake-exports
clang-headers
clang-resource-headers
libclang-headers
aarch64-resource-headers
arm-common-resource-headers
arm-resource-headers
core-resource-headers
cuda-resource-headers
hexagon-resource-headers
hip-resource-headers
hlsl-resource-headers
mips-resource-headers
opencl-resource-headers
openmp-resource-headers
ppc-htm-resource-headers
ppc-resource-headers
riscv-resource-headers
systemz-resource-headers
utility-resource-headers
ve-resource-headers
webassembly-resource-headers
windows-resource-headers
x86-resource-headers
# libs
clang-cpp
libclang
)
if multilib_is_native_abi; then
out+=(
# common stuff
bash-autocomplete
libclang-python-bindings
# tools
amdgpu-arch
c-index-test
clang
clang-format
clang-installapi
clang-linker-wrapper
clang-nvlink-wrapper
clang-offload-bundler
clang-offload-packager
clang-refactor
clang-repl
clang-rename
clang-scan-deps
diagtool
hmaptool
nvptx-arch
# needed for cross-compiling Clang
clang-tblgen
)
if use extra; then
out+=(
# extra tools
clang-apply-replacements
clang-change-namespace
clang-doc
clang-include-cleaner
clang-include-fixer
clang-move
clang-pseudo
clang-query
clang-reorder-fields
clang-tidy
clang-tidy-headers
clangd
find-all-symbols
modularize
pp-trace
)
fi
if llvm_are_manpages_built; then
out+=(docs-clang-man)
use extra && out+=(docs-clang-tools-man)
fi
if use doc; then
out+=(docs-clang-html)
use extra && out+=(docs-clang-tools-html)
fi
use static-analyzer && out+=(
clang-check
clang-extdef-mapping
scan-build
scan-build-py
scan-view
)
fi
printf "%s${sep}" "${out[@]}"
}
multilib_src_configure() {
local mycmakeargs=(
-DDEFAULT_SYSROOT=$(usex prefix-guest "" "${EPREFIX}")
-DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}"
-DCMAKE_INSTALL_MANDIR="${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}/share/man"
-DLLVM_ROOT="${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}"
-DCLANG_CONFIG_FILE_SYSTEM_DIR="${EPREFIX}/etc/clang"
-DCLANG_CONFIG_FILE_USER_DIR="~/.config/clang"
# relative to bindir
-DCLANG_RESOURCE_DIR="../../../../lib/clang/${LLVM_MAJOR}"
-DBUILD_SHARED_LIBS=OFF
-DCLANG_LINK_CLANG_DYLIB=ON
-DLLVM_DISTRIBUTION_COMPONENTS=$(get_distribution_components)
-DCLANG_INCLUDE_TESTS=$(usex test)
-DLLVM_TARGETS_TO_BUILD="${LLVM_TARGETS// /;}"
# these are not propagated reliably, so redefine them
-DLLVM_ENABLE_EH=ON
-DLLVM_ENABLE_RTTI=ON
# libgomp support fails to find headers without explicit -I
# furthermore, it provides only syntax checking
-DCLANG_DEFAULT_OPENMP_RUNTIME=libomp
-DCLANG_DEFAULT_PIE_ON_LINUX=$(usex pie)
-DCLANG_ENABLE_LIBXML2=$(usex xml)
-DCLANG_ENABLE_ARCMT=$(usex static-analyzer)
-DCLANG_ENABLE_STATIC_ANALYZER=$(usex static-analyzer)
# TODO: CLANG_ENABLE_HLSL?
-DPython3_EXECUTABLE="${PYTHON}"
)
if ! use elibc_musl; then
mycmakeargs+=(
-DPPC_LINUX_DEFAULT_IEEELONGDOUBLE=$(usex ieee-long-double)
)
fi
use test && mycmakeargs+=(
-DLLVM_BUILD_TESTS=ON
-DLLVM_LIT_ARGS="$(get_lit_flags)"
)
if multilib_is_native_abi; then
local build_docs=OFF
if llvm_are_manpages_built; then
build_docs=ON
mycmakeargs+=(
-DLLVM_BUILD_DOCS=ON
-DLLVM_ENABLE_SPHINX=ON
-DCLANG_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/html"
-DSPHINX_WARNINGS_AS_ERRORS=OFF
)
if use extra; then
mycmakeargs+=(
-DCLANG-TOOLS_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/tools-extra"
)
fi
fi
mycmakeargs+=(
-DCLANG_INCLUDE_DOCS=${build_docs}
)
fi
if multilib_native_use extra; then
mycmakeargs+=(
-DLLVM_EXTERNAL_CLANG_TOOLS_EXTRA_SOURCE_DIR="${WORKDIR}"/clang-tools-extra
-DCLANG_TOOLS_EXTRA_INCLUDE_DOCS=${build_docs}
)
else
mycmakeargs+=(
-DLLVM_TOOL_CLANG_TOOLS_EXTRA_BUILD=OFF
)
fi
if tc-is-cross-compiler; then
has_version -b llvm-core/clang:${LLVM_MAJOR} ||
die "llvm-core/clang:${LLVM_MAJOR} is required on the build host."
local tools_bin=${BROOT}/usr/lib/llvm/${LLVM_MAJOR}/bin
mycmakeargs+=(
-DLLVM_TOOLS_BINARY_DIR="${tools_bin}"
-DCLANG_TABLEGEN="${tools_bin}"/clang-tblgen
)
fi
# LLVM can have very high memory consumption while linking,
# exhausting the limit on 32-bit linker executable
use x86 && local -x LDFLAGS="${LDFLAGS} -Wl,--no-keep-memory"
# LLVM_ENABLE_ASSERTIONS=NO does not guarantee this for us, #614844
use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG"
cmake_src_configure
multilib_is_native_abi && check_distribution_components
}
multilib_src_compile() {
cmake_build distribution
}
multilib_src_test() {
# respect TMPDIR!
local -x LIT_PRESERVES_TMP=1
local test_targets=(check-clang)
if multilib_native_use extra; then
test_targets+=(
check-clang-tools
check-clangd
)
fi
cmake_build "${test_targets[@]}"
}
src_install() {
MULTILIB_WRAPPED_HEADERS=(
/usr/include/clang/Config/config.h
)
multilib-minimal_src_install
# Move runtime headers to /usr/lib/clang, where they belong
mv "${ED}"/usr/include/clangrt "${ED}"/usr/lib/clang || die
# move (remaining) wrapped headers back
if use extra; then
mv "${T}"/clang-tidy "${ED}"/usr/include/ || die
fi
mv "${ED}"/usr/include "${ED}"/usr/lib/llvm/${LLVM_MAJOR}/include || die
# Apply CHOST and version suffix to clang tools
local clang_tools=(clang clang++ clang-cl clang-cpp)
local abi i
# cmake gives us:
# - clang-X
# - clang -> clang-X
# - clang++, clang-cl, clang-cpp -> clang
# we want to have:
# - clang-X
# - clang++-X, clang-cl-X, clang-cpp-X -> clang-X
# - clang, clang++, clang-cl, clang-cpp -> clang*-X
# also in CHOST variant
for i in "${clang_tools[@]:1}"; do
rm "${ED}/usr/lib/llvm/${LLVM_MAJOR}/bin/${i}" || die
dosym "clang-${LLVM_MAJOR}" "/usr/lib/llvm/${LLVM_MAJOR}/bin/${i}-${LLVM_MAJOR}"
dosym "${i}-${LLVM_MAJOR}" "/usr/lib/llvm/${LLVM_MAJOR}/bin/${i}"
done
# now create target symlinks for all supported ABIs
for abi in $(get_all_abis); do
local abi_chost=$(get_abi_CHOST "${abi}")
for i in "${clang_tools[@]}"; do
dosym "${i}-${LLVM_MAJOR}" \
"/usr/lib/llvm/${LLVM_MAJOR}/bin/${abi_chost}-${i}-${LLVM_MAJOR}"
dosym "${abi_chost}-${i}-${LLVM_MAJOR}" \
"/usr/lib/llvm/${LLVM_MAJOR}/bin/${abi_chost}-${i}"
done
done
}
multilib_src_install() {
DESTDIR=${D} cmake_build install-distribution
# move headers to /usr/include for wrapping & ABI mismatch checks
# (also drop the version suffix from runtime headers)
rm -rf "${ED}"/usr/include || die
mv "${ED}"/usr/lib/llvm/${LLVM_MAJOR}/include "${ED}"/usr/include || die
mv "${ED}"/usr/lib/clang "${ED}"/usr/include/clangrt || die
if multilib_native_use extra; then
# don't wrap clang-tidy headers, the list is too long
# (they're fine for non-native ABI but enabling the targets is problematic)
mv "${ED}"/usr/include/clang-tidy "${T}/" || die
fi
if use static-libs; then
local libdir=$(get_libdir)
insinto "/usr/lib/llvm/${LLVM_MAJOR}/${libdir}"
for lib in "${BUILD_DIR}/${libdir}"/libclang*.a; do
if [[ -f ${lib} ]]; then
doins "${lib}"
fi
done
fi
}
multilib_src_install_all() {
python_fix_shebang "${ED}"
if use static-analyzer; then
python_optimize "${ED}"/usr/lib/llvm/${LLVM_MAJOR}/share/scan-view
fi
docompress "/usr/lib/llvm/${LLVM_MAJOR}/share/man"
llvm_install_manpages
# match 'html' non-compression
use doc && docompress -x "/usr/share/doc/${PF}/tools-extra"
# +x for some reason; TODO: investigate
use static-analyzer && fperms a-x "/usr/lib/llvm/${LLVM_MAJOR}/share/man/man1/scan-build.1"
}
pkg_postinst() {
if [[ -z ${ROOT} && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]]; then
eselect compiler-shadow update all
fi
elog "You can find additional utility scripts in:"
elog " ${EROOT}/usr/lib/llvm/${LLVM_MAJOR}/share/clang"
if use extra; then
elog "Some of them are vim integration scripts (with instructions inside)."
elog "The run-clang-tidy.py script requires the following additional package:"
elog " dev-python/pyyaml"
fi
}
pkg_postrm() {
if [[ -z ${ROOT} && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]]; then
eselect compiler-shadow clean all
fi
}

View file

@ -1,6 +0,0 @@
DIST llvm-19.1.0-manpages.tar.bz2 286165 BLAKE2B d96df2e748d2d52af2e8b7023f59af9ab53a9e59480ff228726bf629f1ecd813af80f3ba4126919092beb7ad8214193e828f997d300c705b0d8b90d6aedb22ee SHA512 aed63dee6629fe9116a9ce21e8bfb0e2c0b80ad276c6551f445ef01c71e130fef1615679adba8386ab57cac5104a153919e0b0df6bd66e023c5f0398081d2374
DIST llvm-21.1.0-manpages.tar.xz 303556 BLAKE2B 93e844bb13826e0154a24bfcdc108c9e373903621b797d3382dbccd4d24ae5af17e994f9ffeb482a89e0c123c82b3b61cd45e3f9376c9223075915377a4dc7fc SHA512 9940332e94439ba57fe7ef5ef4439f505d28c2ddfbbdb3d79e8a664a7164bd80b874c29c9c4abdde1eadaadc975daa4254bf110e57359c3012464be6eac6fb87
DIST llvm-project-19.1.7.src.tar.xz 141249332 BLAKE2B 1259ed7f9aca7b35e89d818befdee20fd8bed4d2dc2c2c6f6f56451fd43d35ac03a0a5a406e142d22b25137999dc5b17471c196f8fcf79f20a8296832d900f6d SHA512 c7d63286d662707a9cd54758c9e3aaf52794a91900c484c4a6efa62d90bc719d5e7a345e4192feeb0c9fd11c82570d64677c781e5be1d645556b6aa018e47ec8
DIST llvm-project-19.1.7.src.tar.xz.sig 438 BLAKE2B 4015140f4ba77de45039bdbdfbaf6f30e75705123d067ea97175d91d7a5b6a75008df01d99ae7aa16aaa3b101f3f41e38d01f04158f95a261d617b3ede0254cd SHA512 195797b06ac80a742e0ccbc03a50dc06dd2e04377d783d5474e3e72c5a75203b60292b047929312a411d22b137a239943fba414a4d136a2be14cbff978eb6bda
DIST llvm-project-21.1.5.src.tar.xz 158957032 BLAKE2B c056049214b18a17a3fd2dc86ae82121a821841002b8386b1fe35fc34f1f0faeb681f39880814e4a47f976b2744bfd2c4f1316156469c6b6a79c013d200dab30 SHA512 865ad44575c9288f06da8c48acbb60779f6c38aaf2ee85eac2002452f83892b704263f2ef51d3596abf06dccc1559f1d9dcdc89120363efd8ce1b1239ae83f6b
DIST llvm-project-21.1.5.src.tar.xz.sig 119 BLAKE2B abf014908e981ea358ee38f6d1ef6c745ebbe51011fa7e83a514672bbad152fac92c95dd32a7b52a8d9c2a2a9ea1b44e447bb0bc5953f0f7bbd9ced34aa3c0cc SHA512 4e327c7d60525526ff3ac6ca58f1e753a57f841b88078a9bfe2a2ce91e4a5e17bcc52fd2f27f75801540610c1a56d57a3070243f13ad583e3526901b1f7be4a5

View file

@ -1,563 +0,0 @@
# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
PYTHON_COMPAT=( python3_{11..13} )
inherit cmake flag-o-matic llvm.org multilib-minimal pax-utils python-any-r1
inherit toolchain-funcs
DESCRIPTION="Low Level Virtual Machine"
HOMEPAGE="https://llvm.org/"
# Additional licenses:
# 1. OpenBSD regex: Henry Spencer's license ('rc' in Gentoo) + BSD.
# 2. xxhash: BSD.
# 3. MD5 code: public-domain.
# 4. ConvertUTF.h: TODO.
LICENSE="Apache-2.0-with-LLVM-exceptions UoI-NCSA BSD public-domain rc"
SLOT="${LLVM_MAJOR}/${LLVM_SOABI}"
KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~sparc x86 ~amd64-linux ~arm64-macos ~ppc-macos ~x64-macos"
IUSE="
+binutils-plugin debug debuginfod doc exegesis libedit +libffi
test xml z3 zstd static-libs
"
RESTRICT="!test? ( test )"
RDEPEND="
virtual/zlib:=[${MULTILIB_USEDEP}]
debuginfod? (
net-misc/curl:=
dev-cpp/cpp-httplib:=
)
exegesis? ( dev-libs/libpfm:= )
libedit? ( dev-libs/libedit:0=[${MULTILIB_USEDEP}] )
libffi? ( >=dev-libs/libffi-3.0.13-r1:0=[${MULTILIB_USEDEP}] )
xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] )
z3? ( >=sci-mathematics/z3-4.7.1:0=[${MULTILIB_USEDEP}] )
zstd? ( app-arch/zstd:=[${MULTILIB_USEDEP}] )
"
DEPEND="
${RDEPEND}
binutils-plugin? ( sys-libs/binutils-libs )
"
BDEPEND="
${PYTHON_DEPS}
dev-lang/perl
sys-devel/gnuconfig
kernel_Darwin? (
<llvm-runtimes/libcxx-${LLVM_VERSION}.9999
)
libffi? ( virtual/pkgconfig )
"
# There are no file collisions between these versions but having :0
# installed means llvm-config there will take precedence.
RDEPEND="
${RDEPEND}
!llvm-core/llvm:0
"
PDEPEND="
llvm-core/llvm-common
llvm-core/llvm-toolchain-symlinks:${LLVM_MAJOR}
binutils-plugin? ( >=llvm-core/llvmgold-${LLVM_MAJOR} )
"
LLVM_COMPONENTS=( llvm cmake third-party )
LLVM_MANPAGES=1
LLVM_USE_TARGETS=provide
llvm.org_set_globals
[[ -n ${LLVM_MANPAGE_DIST} ]] && BDEPEND+=" doc? ( "
BDEPEND+="
$(python_gen_any_dep '
dev-python/myst-parser[${PYTHON_USEDEP}]
dev-python/sphinx[${PYTHON_USEDEP}]
')
"
[[ -n ${LLVM_MANPAGE_DIST} ]] && BDEPEND+=" ) "
python_check_deps() {
llvm_are_manpages_built || return 0
python_has_version -b "dev-python/myst-parser[${PYTHON_USEDEP}]" &&
python_has_version -b "dev-python/sphinx[${PYTHON_USEDEP}]"
}
check_uptodate() {
local prod_targets=(
$(sed -n -e '/set(LLVM_ALL_TARGETS/,/)/p' CMakeLists.txt \
| tail -n +2 | head -n -1)
)
local all_targets=(
lib/Target/*/
)
all_targets=( "${all_targets[@]#lib/Target/}" )
all_targets=( "${all_targets[@]%/}" )
local exp_targets=() i
for i in "${all_targets[@]}"; do
has "${i}" "${prod_targets[@]}" || exp_targets+=( "${i}" )
done
if [[ ${exp_targets[*]} != ${ALL_LLVM_EXPERIMENTAL_TARGETS[*]} ]]; then
eqawarn "ALL_LLVM_EXPERIMENTAL_TARGETS is outdated!"
eqawarn " Have: ${ALL_LLVM_EXPERIMENTAL_TARGETS[*]}"
eqawarn "Expected: ${exp_targets[*]}"
eqawarn
fi
if [[ ${prod_targets[*]} != ${ALL_LLVM_PRODUCTION_TARGETS[*]} ]]; then
eqawarn "ALL_LLVM_PRODUCTION_TARGETS is outdated!"
eqawarn " Have: ${ALL_LLVM_PRODUCTION_TARGETS[*]}"
eqawarn "Expected: ${prod_targets[*]}"
fi
}
check_distribution_components() {
if [[ ${CMAKE_MAKEFILE_GENERATOR} == ninja ]]; then
local all_targets=() my_targets=() l
cd "${BUILD_DIR}" || die
while read -r l; do
if [[ ${l} == install-*-stripped:* ]]; then
l=${l#install-}
l=${l%%-stripped*}
case ${l} in
# shared libs
LLVM|LLVMgold)
;;
# TableGen lib + deps
LLVMDemangle|LLVMSupport|LLVMTableGen)
;;
# used by lldb
LLVMDebuginfod)
;;
# testing libraries
LLVMTestingAnnotations|LLVMTestingSupport)
;;
# static libs
LLVM*)
continue
;;
# meta-targets
distribution|llvm-libraries)
continue
;;
# used only w/ USE=doc
docs-llvm-html)
use doc || continue
;;
esac
all_targets+=( "${l}" )
fi
done < <(${NINJA} -t targets all)
while read -r l; do
my_targets+=( "${l}" )
done < <(get_distribution_components $"\n")
local add=() remove=()
for l in "${all_targets[@]}"; do
if ! has "${l}" "${my_targets[@]}"; then
add+=( "${l}" )
fi
done
for l in "${my_targets[@]}"; do
if ! has "${l}" "${all_targets[@]}"; then
remove+=( "${l}" )
fi
done
if [[ ${#add[@]} -gt 0 || ${#remove[@]} -gt 0 ]]; then
eqawarn "get_distribution_components() is outdated!"
eqawarn " Add: ${add[*]}"
eqawarn "Remove: ${remove[*]}"
fi
cd - >/dev/null || die
fi
}
src_prepare() {
# disable use of SDK on OSX, bug #568758
sed -i -e 's/xcrun/false/' utils/lit/lit/util.py || die
# Update config.guess to support more systems
cp "${BROOT}/usr/share/gnuconfig/config.guess" cmake/ || die
# Verify that the ebuild is up-to-date
check_uptodate
llvm.org_src_prepare
if has_version ">=sys-libs/glibc-2.40"; then
# https://github.com/llvm/llvm-project/issues/100791
rm -r test/tools/llvm-exegesis/X86/latency || die
fi
}
get_distribution_components() {
local sep=${1-;}
local out=(
# shared libs
LLVM
LTO
Remarks
# tools
llvm-config
# common stuff
cmake-exports
llvm-headers
# libraries needed for clang-tblgen
LLVMDemangle
LLVMSupport
LLVMTableGen
# testing libraries
llvm_gtest
llvm_gtest_main
LLVMTestingAnnotations
LLVMTestingSupport
)
if multilib_is_native_abi; then
out+=(
# library used by lldb
LLVMDebuginfod
# utilities
llvm-tblgen
FileCheck
llvm-PerfectShuffle
count
not
yaml-bench
UnicodeNameMappingGenerator
# tools
bugpoint
dsymutil
llc
lli
lli-child-target
llvm-addr2line
llvm-ar
llvm-as
llvm-bcanalyzer
llvm-bitcode-strip
llvm-c-test
llvm-cat
llvm-cfi-verify
llvm-config
llvm-cov
llvm-cvtres
llvm-cxxdump
llvm-cxxfilt
llvm-cxxmap
llvm-debuginfo-analyzer
llvm-debuginfod-find
llvm-diff
llvm-dis
llvm-dlltool
llvm-dwarfdump
llvm-dwarfutil
llvm-dwp
llvm-exegesis
llvm-extract
llvm-gsymutil
llvm-ifs
llvm-install-name-tool
llvm-jitlink
llvm-jitlink-executor
llvm-lib
llvm-libtool-darwin
llvm-link
llvm-lipo
llvm-lto
llvm-lto2
llvm-mc
llvm-mca
llvm-ml
llvm-modextract
llvm-mt
llvm-nm
llvm-objcopy
llvm-objdump
llvm-opt-report
llvm-otool
llvm-pdbutil
llvm-profdata
llvm-profgen
llvm-ranlib
llvm-rc
llvm-readelf
llvm-readobj
llvm-readtapi
llvm-reduce
llvm-remarkutil
llvm-rtdyld
llvm-sim
llvm-size
llvm-split
llvm-stress
llvm-strings
llvm-strip
llvm-symbolizer
llvm-tli-checker
llvm-undname
llvm-windres
llvm-xray
obj2yaml
opt
reduce-chunk-list
sancov
sanstats
split-file
verify-uselistorder
yaml2obj
# python modules
opt-viewer
)
if llvm_are_manpages_built; then
out+=(
# manpages
docs-dsymutil-man
docs-llvm-dwarfdump-man
docs-llvm-man
)
fi
use doc && out+=(
docs-llvm-html
)
use binutils-plugin && out+=(
LLVMgold
)
use debuginfod && out+=(
llvm-debuginfod
)
fi
printf "%s${sep}" "${out[@]}"
}
multilib_src_configure() {
# ODR violations (bug #917536, bug #926529). Just do it for GCC for now
# to avoid people grumbling. GCC is, anecdotally, more likely to miscompile
# LLVM with LTO anyway (which is not necessarily its fault).
tc-is-gcc && filter-lto
local ffi_cflags ffi_ldflags
if use libffi; then
ffi_cflags=$($(tc-getPKG_CONFIG) --cflags-only-I libffi)
ffi_ldflags=$($(tc-getPKG_CONFIG) --libs-only-L libffi)
fi
local libdir=$(get_libdir)
local mycmakeargs=(
# disable appending VCS revision to the version to improve
# direct cache hit ratio
-DLLVM_APPEND_VC_REV=OFF
-DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}"
-DLLVM_LIBDIR_SUFFIX=${libdir#lib}
-DBUILD_SHARED_LIBS=OFF
-DLLVM_BUILD_LLVM_DYLIB=ON
-DLLVM_LINK_LLVM_DYLIB=ON
-DLLVM_DISTRIBUTION_COMPONENTS=$(get_distribution_components)
# cheap hack: LLVM combines both anyway, and the only difference
# is that the former list is explicitly verified at cmake time
-DLLVM_TARGETS_TO_BUILD=""
-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="${LLVM_TARGETS// /;}"
-DLLVM_INCLUDE_BENCHMARKS=OFF
-DLLVM_INCLUDE_TESTS=ON
-DLLVM_BUILD_TESTS=$(usex test)
-DLLVM_INSTALL_GTEST=ON
-DLLVM_ENABLE_FFI=$(usex libffi)
-DLLVM_ENABLE_LIBEDIT=$(usex libedit)
-DLLVM_ENABLE_LIBXML2=$(usex xml)
-DLLVM_ENABLE_ASSERTIONS=$(usex debug)
-DLLVM_ENABLE_LIBPFM=$(usex exegesis)
-DLLVM_ENABLE_EH=ON
-DLLVM_ENABLE_RTTI=ON
-DLLVM_ENABLE_Z3_SOLVER=$(usex z3)
-DLLVM_ENABLE_ZLIB=FORCE_ON
-DLLVM_ENABLE_ZSTD=$(usex zstd FORCE_ON OFF)
-DLLVM_ENABLE_CURL=$(usex debuginfod)
-DLLVM_ENABLE_HTTPLIB=$(usex debuginfod)
-DLLVM_HOST_TRIPLE="${CHOST}"
-DFFI_INCLUDE_DIR="${ffi_cflags#-I}"
-DFFI_LIBRARY_DIR="${ffi_ldflags#-L}"
-DPython3_EXECUTABLE="${PYTHON}"
# disable OCaml bindings (now in dev-ml/llvm)
-DOCAMLFIND=NO
)
local suffix=
if [[ -n ${EGIT_VERSION} && ${EGIT_BRANCH} != release/* ]]; then
# the ABI of the main branch is not stable, so let's include
# the commit id in the SOVERSION to contain the breakage
suffix+="git${EGIT_VERSION::8}"
fi
if [[ $(tc-get-cxx-stdlib) == libc++ ]]; then
# Smart hack: alter version suffix -> SOVERSION when linking
# against libc++. This way we won't end up mixing LLVM libc++
# libraries with libstdc++ clang, and the other way around.
suffix+="+libcxx"
mycmakeargs+=(
-DLLVM_ENABLE_LIBCXX=ON
)
fi
mycmakeargs+=(
-DLLVM_VERSION_SUFFIX="${suffix}"
)
use test && mycmakeargs+=(
-DLLVM_LIT_ARGS="$(get_lit_flags)"
)
if multilib_is_native_abi; then
local build_docs=OFF
if llvm_are_manpages_built; then
build_docs=ON
mycmakeargs+=(
-DCMAKE_INSTALL_MANDIR="${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}/share/man"
-DLLVM_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/html"
-DSPHINX_WARNINGS_AS_ERRORS=OFF
)
fi
mycmakeargs+=(
-DLLVM_BUILD_DOCS=${build_docs}
-DLLVM_ENABLE_OCAMLDOC=OFF
-DLLVM_ENABLE_SPHINX=${build_docs}
-DLLVM_ENABLE_DOXYGEN=OFF
-DLLVM_INSTALL_UTILS=ON
)
use binutils-plugin && mycmakeargs+=(
-DLLVM_BINUTILS_INCDIR="${EPREFIX}"/usr/include
)
fi
use kernel_Darwin && mycmakeargs+=(
# Use our libtool instead of looking it up with xcrun
-DCMAKE_LIBTOOL="${EPREFIX}/usr/bin/${CHOST}-libtool"
)
# LLVM can have very high memory consumption while linking,
# exhausting the limit on 32-bit linker executable
use x86 && local -x LDFLAGS="${LDFLAGS} -Wl,--no-keep-memory"
# LLVM_ENABLE_ASSERTIONS=NO does not guarantee this for us, #614844
use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG"
cmake_src_configure
grep -q -E "^CMAKE_PROJECT_VERSION_MAJOR(:.*)?=${LLVM_MAJOR}$" \
CMakeCache.txt ||
die "Incorrect version, did you update _LLVM_MAIN_MAJOR?"
multilib_is_native_abi && check_distribution_components
}
multilib_src_compile() {
tc-env_build cmake_build distribution
pax-mark m "${BUILD_DIR}"/bin/llvm-rtdyld
pax-mark m "${BUILD_DIR}"/bin/lli
pax-mark m "${BUILD_DIR}"/bin/lli-child-target
if use test; then
pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/Orc/OrcJITTests
pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/MCJIT/MCJITTests
pax-mark m "${BUILD_DIR}"/unittests/Support/SupportTests
fi
}
multilib_src_test() {
# respect TMPDIR!
local -x LIT_PRESERVES_TMP=1
cmake_build check
}
src_install() {
local MULTILIB_CHOST_TOOLS=(
/usr/lib/llvm/${LLVM_MAJOR}/bin/llvm-config
)
local MULTILIB_WRAPPED_HEADERS=(
/usr/include/llvm/Config/llvm-config.h
)
local LLVM_LDPATHS=()
multilib-minimal_src_install
# move wrapped headers back
mv "${ED}"/usr/include "${ED}"/usr/lib/llvm/${LLVM_MAJOR}/include || die
}
multilib_src_install() {
DESTDIR=${D} cmake_build install-distribution
# move headers to /usr/include for wrapping
rm -rf "${ED}"/usr/include || die
mv "${ED}"/usr/lib/llvm/${LLVM_MAJOR}/include "${ED}"/usr/include || die
# MODIFICATION: Manually install static libraries if requested
if use static-libs; then
# The build directory structure for static libs is usually just inside /lib
# We look inside the cmake build directory for .a files starting with libLLVM
# Note: We use dolib.a to install them to the correct /usr/lib/llvm/.../lib location
# The 'into' directory is already set by the eclass context or defaults,
# but we want them specifically in LLVM's libdir.
local libdir=$(get_libdir)
insinto /usr/lib/llvm/${LLVM_MAJOR}/${libdir}
# Loop ensures we only get what we built, handling the 'lib' prefix correctly
local lib
for lib in "${BUILD_DIR}/${libdir}"/libLLVM*.a; do
[[ -f ${lib} ]] && doins "${lib}"
done
fi
LLVM_LDPATHS+=( "${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}/$(get_libdir)" )
}
multilib_src_install_all() {
local revord=$(( 9999 - ${LLVM_MAJOR} ))
newenvd - "60llvm-${revord}" <<-_EOF_
PATH="${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}/bin"
# we need to duplicate it in ROOTPATH for Portage to respect...
ROOTPATH="${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}/bin"
MANPATH="${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}/share/man"
LDPATH="$( IFS=:; echo "${LLVM_LDPATHS[*]}" )"
_EOF_
docompress "/usr/lib/llvm/${LLVM_MAJOR}/share/man"
llvm_install_manpages
}
pkg_postinst() {
elog "You can find additional opt-viewer utility scripts in:"
elog " ${EROOT}/usr/lib/llvm/${LLVM_MAJOR}/share/opt-viewer"
elog "To use these scripts, you will need Python along with the following"
elog "packages:"
elog " dev-python/pygments (for opt-viewer)"
elog " dev-python/pyyaml (for all of them)"
}