1 # Copyright 1999-2020 Gentoo Authors
2 # Distributed under the terms of the GNU General Public License v2
6 PYTHON_COMPAT=( python3_{6,7} )
7 inherit cmake-utils llvm.org multilib-minimal multiprocessing \
8 pax-utils python-any-r1 toolchain-funcs
10 DESCRIPTION="Low Level Virtual Machine"
11 HOMEPAGE="https://llvm.org/"
12 LLVM_COMPONENTS=( llvm )
15 # Those are in lib/Targets, without explicit CMakeLists.txt mention
16 ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC AVR VE )
17 # Keep in sync with CMakeLists.txt
18 ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM BPF Hexagon Lanai Mips MSP430
19 NVPTX PowerPC RISCV Sparc SystemZ WebAssembly X86 XCore
20 "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}" )
21 ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" )
23 # Additional licenses:
24 # 1. OpenBSD regex: Henry Spencer's license ('rc' in Gentoo) + BSD.
26 # 3. MD5 code: public-domain.
27 # 4. ConvertUTF.h: TODO.
29 LICENSE="Apache-2.0-with-LLVM-exceptions UoI-NCSA BSD public-domain rc"
32 IUSE="debug doc exegesis gold libedit +libffi ncurses test xar xml z3
33 kernel_Darwin ${ALL_LLVM_TARGETS[*]}"
34 REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} )"
35 RESTRICT="!test? ( test )"
38 sys-libs/zlib:0=[${MULTILIB_USEDEP}]
39 exegesis? ( dev-libs/libpfm:= )
42 >=sys-devel/binutils-2.31.1-r4:*[plugins]
43 <sys-devel/binutils-2.31.1-r4:*[cxx]
46 libedit? ( dev-libs/libedit:0=[${MULTILIB_USEDEP}] )
47 libffi? ( >=virtual/libffi-3.0.13-r1:0=[${MULTILIB_USEDEP}] )
48 ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[${MULTILIB_USEDEP}] )
50 xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] )
51 z3? ( >=sci-mathematics/z3-4.7.1:0=[${MULTILIB_USEDEP}] )"
53 gold? ( sys-libs/binutils-libs )"
57 || ( >=sys-devel/gcc-3.0 >=sys-devel/llvm-3.5
58 ( >=sys-freebsd/freebsd-lib-9.1-r10 sys-libs/libcxx )
61 <sys-libs/libcxx-$(ver_cut 1-3).9999
62 >=sys-devel/binutils-apple-5.1
64 doc? ( $(python_gen_any_dep '
65 dev-python/recommonmark[${PYTHON_USEDEP}]
66 dev-python/sphinx[${PYTHON_USEDEP}]
68 libffi? ( virtual/pkgconfig )
70 # There are no file collisions between these versions but having :0
71 # installed means llvm-config there will take precedence.
74 PDEPEND="sys-devel/llvm-common
75 gold? ( >=sys-devel/llvmgold-${SLOT} )"
77 # least intrusive of all
78 CMAKE_BUILD_TYPE=RelWithDebInfo
83 has_version -b "dev-python/recommonmark[${PYTHON_USEDEP}]" &&
84 has_version -b "dev-python/sphinx[${PYTHON_USEDEP}]"
89 $(sed -n -e '/set(LLVM_ALL_TARGETS/,/)/p' CMakeLists.txt \
90 | tail -n +2 | head -n -1)
95 all_targets=( "${all_targets[@]#lib/Target/}" )
96 all_targets=( "${all_targets[@]%/}" )
98 local exp_targets=() i
99 for i in "${all_targets[@]}"; do
100 has "${i}" "${prod_targets[@]}" || exp_targets+=( "${i}" )
103 all_targets=( "${prod_targets[@]}" "${exp_targets[@]}" )
105 if [[ ${exp_targets[*]} != ${ALL_LLVM_EXPERIMENTAL_TARGETS[*]} ]]; then
106 eqawarn "ALL_LLVM_EXPERIMENTAL_TARGETS is outdated!"
107 eqawarn " Have: ${ALL_LLVM_EXPERIMENTAL_TARGETS[*]}"
108 eqawarn "Expected: ${exp_targets[*]}"
112 if [[ ${all_targets[*]} != ${ALL_LLVM_TARGETS[*]#llvm_targets_} ]]; then
113 eqawarn "ALL_LLVM_TARGETS is outdated!"
114 eqawarn " Have: ${ALL_LLVM_TARGETS[*]#llvm_targets_}"
115 eqawarn "Expected: ${all_targets[*]}"
119 check_distribution_components() {
120 if [[ ${CMAKE_MAKEFILE_GENERATOR} == ninja ]]; then
121 local all_targets=() my_targets=() l
122 cd "${BUILD_DIR}" || die
125 if [[ ${l} == install-*-stripped:* ]]; then
133 # TableGen lib + deps
134 LLVMDemangle|LLVMSupport|LLVMTableGen)
141 distribution|llvm-libraries)
146 all_targets+=( "${l}" )
148 done < <(ninja -t targets all)
151 my_targets+=( "${l}" )
152 done < <(get_distribution_components $"\n")
154 local add=() remove=()
155 for l in "${all_targets[@]}"; do
156 if ! has "${l}" "${my_targets[@]}"; then
160 for l in "${my_targets[@]}"; do
161 if ! has "${l}" "${all_targets[@]}"; then
166 if [[ ${#add[@]} -gt 0 || ${#remove[@]} -gt 0 ]]; then
167 eqawarn "get_distribution_components() is outdated!"
168 eqawarn " Add: ${add[*]}"
169 eqawarn "Remove: ${remove[*]}"
171 cd - >/dev/null || die
176 # Fix llvm-config for shared linking and sane flags
177 # https://bugs.gentoo.org/show_bug.cgi?id=565358
178 eapply "${FILESDIR}"/9999/0007-llvm-config-Clean-up-exported-values-update-for-shar.patch
180 # disable use of SDK on OSX, bug #568758
181 sed -i -e 's/xcrun/false/' utils/lit/lit/util.py || die
183 # Update config.guess to support more systems
184 cp "${BROOT}/usr/share/gnuconfig/config.guess" cmake/ || die
187 cmake-utils_src_prepare
189 # Verify that the live ebuild is up-to-date
193 # Is LLVM being linked against libc++?
195 local code='#include <ciso646>
196 #if defined(_LIBCPP_VERSION)
200 local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1
202 [[ ${out} == *HAVE_LIBCXX* ]]
205 get_distribution_components() {
221 # libraries needed for clang-tblgen
227 if multilib_is_native_abi; then
265 llvm-install-name-tool
309 docs-llvm-dwarfdump-man
319 printf "%s${sep}" "${out[@]}"
322 multilib_src_configure() {
323 local ffi_cflags ffi_ldflags
325 ffi_cflags=$($(tc-getPKG_CONFIG) --cflags-only-I libffi)
326 ffi_ldflags=$($(tc-getPKG_CONFIG) --libs-only-L libffi)
329 local libdir=$(get_libdir)
331 # disable appending VCS revision to the version to improve
332 # direct cache hit ratio
333 -DLLVM_APPEND_VC_REV=OFF
334 -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm/${SLOT}"
335 -DLLVM_LIBDIR_SUFFIX=${libdir#lib}
337 -DBUILD_SHARED_LIBS=OFF
338 -DLLVM_BUILD_LLVM_DYLIB=ON
339 -DLLVM_LINK_LLVM_DYLIB=ON
340 -DLLVM_DISTRIBUTION_COMPONENTS=$(get_distribution_components)
342 # cheap hack: LLVM combines both anyway, and the only difference
343 # is that the former list is explicitly verified at cmake time
344 -DLLVM_TARGETS_TO_BUILD=""
345 -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="${LLVM_TARGETS// /;}"
346 -DLLVM_BUILD_TESTS=$(usex test)
348 -DLLVM_ENABLE_FFI=$(usex libffi)
349 -DLLVM_ENABLE_LIBEDIT=$(usex libedit)
350 -DLLVM_ENABLE_TERMINFO=$(usex ncurses)
351 -DLLVM_ENABLE_LIBXML2=$(usex xml)
352 -DLLVM_ENABLE_ASSERTIONS=$(usex debug)
353 -DLLVM_ENABLE_LIBPFM=$(usex exegesis)
355 -DLLVM_ENABLE_RTTI=ON
356 -DLLVM_ENABLE_Z3_SOLVER=$(usex z3)
358 -DWITH_POLLY=OFF # TODO
360 -DLLVM_HOST_TRIPLE="${CHOST}"
362 -DFFI_INCLUDE_DIR="${ffi_cflags#-I}"
363 -DFFI_LIBRARY_DIR="${ffi_ldflags#-L}"
364 # used only for llvm-objdump tool
365 -DHAVE_LIBXAR=$(multilib_native_usex xar 1 0)
367 # disable OCaml bindings (now in dev-ml/llvm-ocaml)
371 if is_libcxx_linked; then
372 # Smart hack: alter version suffix -> SOVERSION when linking
373 # against libc++. This way we won't end up mixing LLVM libc++
374 # libraries with libstdc++ clang, and the other way around.
376 -DLLVM_VERSION_SUFFIX="libcxx"
380 # Note: go bindings have no CMake rules at the moment
381 # but let's kill the check in case they are introduced
382 # if ! multilib_is_native_abi || ! use go; then
384 -DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND
388 use test && mycmakeargs+=(
389 -DLLVM_LIT_ARGS="-vv;-j;${LIT_JOBS:-$(makeopts_jobs "${MAKEOPTS}" "$(get_nproc)")}"
392 if multilib_is_native_abi; then
394 -DLLVM_BUILD_DOCS=$(usex doc)
395 -DLLVM_ENABLE_OCAMLDOC=OFF
396 -DLLVM_ENABLE_SPHINX=$(usex doc)
397 -DLLVM_ENABLE_DOXYGEN=OFF
398 -DLLVM_INSTALL_UTILS=ON
400 use doc && mycmakeargs+=(
401 -DCMAKE_INSTALL_MANDIR="${EPREFIX}/usr/lib/llvm/${SLOT}/share/man"
402 -DLLVM_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/html"
403 -DSPHINX_WARNINGS_AS_ERRORS=OFF
405 use gold && mycmakeargs+=(
406 -DLLVM_BINUTILS_INCDIR="${EPREFIX}"/usr/include
410 if tc-is-cross-compiler; then
411 local tblgen="${EPREFIX}/usr/lib/llvm/${SLOT}/bin/llvm-tblgen"
412 [[ -x "${tblgen}" ]] \
413 || die "${tblgen} not found or usable"
415 -DCMAKE_CROSSCOMPILING=ON
416 -DLLVM_TABLEGEN="${tblgen}"
420 # workaround BMI bug in gcc-7 (fixed in 7.4)
421 # https://bugs.gentoo.org/649880
422 # apply only to x86, https://bugs.gentoo.org/650506
423 if tc-is-gcc && [[ ${MULTILIB_ABI_FLAG} == abi_x86* ]] &&
424 [[ $(gcc-major-version) -eq 7 && $(gcc-minor-version) -lt 4 ]]
426 local CFLAGS="${CFLAGS} -mno-bmi"
427 local CXXFLAGS="${CXXFLAGS} -mno-bmi"
430 # LLVM_ENABLE_ASSERTIONS=NO does not guarantee this for us, #614844
431 use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG"
432 cmake-utils_src_configure
434 multilib_is_native_abi && check_distribution_components
437 multilib_src_compile() {
438 cmake-utils_src_compile
440 pax-mark m "${BUILD_DIR}"/bin/llvm-rtdyld
441 pax-mark m "${BUILD_DIR}"/bin/lli
442 pax-mark m "${BUILD_DIR}"/bin/lli-child-target
445 pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/Orc/OrcJITTests
446 pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/MCJIT/MCJITTests
447 pax-mark m "${BUILD_DIR}"/unittests/Support/SupportTests
451 multilib_src_test() {
453 local -x LIT_PRESERVES_TMP=1
454 cmake-utils_src_make check
458 local MULTILIB_CHOST_TOOLS=(
459 /usr/lib/llvm/${SLOT}/bin/llvm-config
462 local MULTILIB_WRAPPED_HEADERS=(
463 /usr/include/llvm/Config/llvm-config.h
466 local LLVM_LDPATHS=()
467 multilib-minimal_src_install
469 # move wrapped headers back
470 mv "${ED}"/usr/include "${ED}"/usr/lib/llvm/${SLOT}/include || die
473 multilib_src_install() {
474 DESTDIR=${D} cmake-utils_src_make install-distribution
476 # move headers to /usr/include for wrapping
477 rm -rf "${ED}"/usr/include || die
478 mv "${ED}"/usr/lib/llvm/${SLOT}/include "${ED}"/usr/include || die
480 LLVM_LDPATHS+=( "${EPREFIX}/usr/lib/llvm/${SLOT}/$(get_libdir)" )
483 multilib_src_install_all() {
484 local revord=$(( 9999 - ${SLOT} ))
485 newenvd - "60llvm-${revord}" <<-_EOF_
486 PATH="${EPREFIX}/usr/lib/llvm/${SLOT}/bin"
487 # we need to duplicate it in ROOTPATH for Portage to respect...
488 ROOTPATH="${EPREFIX}/usr/lib/llvm/${SLOT}/bin"
489 MANPATH="${EPREFIX}/usr/lib/llvm/${SLOT}/share/man"
490 LDPATH="$( IFS=:; echo "${LLVM_LDPATHS[*]}" )"
493 docompress "/usr/lib/llvm/${SLOT}/share/man"
497 elog "You can find additional opt-viewer utility scripts in:"
498 elog " ${EROOT}/usr/lib/llvm/${SLOT}/share/opt-viewer"
499 elog "To use these scripts, you will need Python along with the following"
501 elog " dev-python/pygments (for opt-viewer)"
502 elog " dev-python/pyyaml (for all of them)"