Gentoo Archives: gentoo-commits

From: "Michał Górny" <mgorny@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] repo/gentoo:master commit in: sys-devel/llvm/
Date: Fri, 05 Aug 2022 19:50:10
Message-Id: 1659728989.563a09ee701ad0a02a8a5357a9bce83bb079cb86.mgorny@gentoo
1 commit: 563a09ee701ad0a02a8a5357a9bce83bb079cb86
2 Author: Michał Górny <mgorny <AT> gentoo <DOT> org>
3 AuthorDate: Fri Aug 5 19:48:29 2022 +0000
4 Commit: Michał Górny <mgorny <AT> gentoo <DOT> org>
5 CommitDate: Fri Aug 5 19:49:49 2022 +0000
6 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=563a09ee
7
8 sys-devel/llvm: Add 16.* live ebuilds
9
10 Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>
11
12 sys-devel/llvm/llvm-16.0.0.9999.ebuild | 527 +++++++++++++++++++++++++++++++++
13 1 file changed, 527 insertions(+)
14
15 diff --git a/sys-devel/llvm/llvm-16.0.0.9999.ebuild b/sys-devel/llvm/llvm-16.0.0.9999.ebuild
16 new file mode 100644
17 index 000000000000..a28eef0e4888
18 --- /dev/null
19 +++ b/sys-devel/llvm/llvm-16.0.0.9999.ebuild
20 @@ -0,0 +1,527 @@
21 +# Copyright 1999-2022 Gentoo Authors
22 +# Distributed under the terms of the GNU General Public License v2
23 +
24 +EAPI=8
25 +
26 +PYTHON_COMPAT=( python3_{8..11} )
27 +inherit cmake llvm.org multilib-minimal pax-utils python-any-r1 \
28 + toolchain-funcs
29 +
30 +DESCRIPTION="Low Level Virtual Machine"
31 +HOMEPAGE="https://llvm.org/"
32 +
33 +# Additional licenses:
34 +# 1. OpenBSD regex: Henry Spencer's license ('rc' in Gentoo) + BSD.
35 +# 2. xxhash: BSD.
36 +# 3. MD5 code: public-domain.
37 +# 4. ConvertUTF.h: TODO.
38 +
39 +LICENSE="Apache-2.0-with-LLVM-exceptions UoI-NCSA BSD public-domain rc"
40 +SLOT="$(ver_cut 1)"
41 +KEYWORDS=""
42 +IUSE="+binutils-plugin debug doc exegesis libedit +libffi ncurses test xar xml z3"
43 +RESTRICT="!test? ( test )"
44 +
45 +RDEPEND="
46 + sys-libs/zlib:0=[${MULTILIB_USEDEP}]
47 + binutils-plugin? ( >=sys-devel/binutils-2.31.1-r4:*[plugins] )
48 + exegesis? ( dev-libs/libpfm:= )
49 + libedit? ( dev-libs/libedit:0=[${MULTILIB_USEDEP}] )
50 + libffi? ( >=dev-libs/libffi-3.0.13-r1:0=[${MULTILIB_USEDEP}] )
51 + ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[${MULTILIB_USEDEP}] )
52 + xar? ( app-arch/xar )
53 + xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] )
54 + z3? ( >=sci-mathematics/z3-4.7.1:0=[${MULTILIB_USEDEP}] )
55 +"
56 +DEPEND="
57 + ${RDEPEND}
58 + binutils-plugin? ( sys-libs/binutils-libs )
59 +"
60 +BDEPEND="
61 + ${PYTHON_DEPS}
62 + dev-lang/perl
63 + >=dev-util/cmake-3.16
64 + sys-devel/gnuconfig
65 + kernel_Darwin? (
66 + <sys-libs/libcxx-$(ver_cut 1-3).9999
67 + >=sys-devel/binutils-apple-5.1
68 + )
69 + doc? ( $(python_gen_any_dep '
70 + dev-python/recommonmark[${PYTHON_USEDEP}]
71 + dev-python/sphinx[${PYTHON_USEDEP}]
72 + ') )
73 + libffi? ( virtual/pkgconfig )
74 +"
75 +# There are no file collisions between these versions but having :0
76 +# installed means llvm-config there will take precedence.
77 +RDEPEND="
78 + ${RDEPEND}
79 + !sys-devel/llvm:0
80 +"
81 +PDEPEND="
82 + sys-devel/llvm-common
83 + binutils-plugin? ( >=sys-devel/llvmgold-${SLOT} )
84 +"
85 +
86 +LLVM_COMPONENTS=( llvm cmake third-party )
87 +LLVM_MANPAGES=1
88 +LLVM_PATCHSET=9999-r3
89 +LLVM_USE_TARGETS=provide
90 +llvm.org_set_globals
91 +
92 +python_check_deps() {
93 + use doc || return 0
94 +
95 + python_has_version -b "dev-python/recommonmark[${PYTHON_USEDEP}]" &&
96 + python_has_version -b "dev-python/sphinx[${PYTHON_USEDEP}]"
97 +}
98 +
99 +check_uptodate() {
100 + local prod_targets=(
101 + $(sed -n -e '/set(LLVM_ALL_TARGETS/,/)/p' CMakeLists.txt \
102 + | tail -n +2 | head -n -1)
103 + )
104 + local all_targets=(
105 + lib/Target/*/
106 + )
107 + all_targets=( "${all_targets[@]#lib/Target/}" )
108 + all_targets=( "${all_targets[@]%/}" )
109 +
110 + local exp_targets=() i
111 + for i in "${all_targets[@]}"; do
112 + has "${i}" "${prod_targets[@]}" || exp_targets+=( "${i}" )
113 + done
114 +
115 + if [[ ${exp_targets[*]} != ${ALL_LLVM_EXPERIMENTAL_TARGETS[*]} ]]; then
116 + eqawarn "ALL_LLVM_EXPERIMENTAL_TARGETS is outdated!"
117 + eqawarn " Have: ${ALL_LLVM_EXPERIMENTAL_TARGETS[*]}"
118 + eqawarn "Expected: ${exp_targets[*]}"
119 + eqawarn
120 + fi
121 +
122 + if [[ ${prod_targets[*]} != ${ALL_LLVM_PRODUCTION_TARGETS[*]} ]]; then
123 + eqawarn "ALL_LLVM_PRODUCTION_TARGETS is outdated!"
124 + eqawarn " Have: ${ALL_LLVM_PRODUCTION_TARGETS[*]}"
125 + eqawarn "Expected: ${prod_targets[*]}"
126 + fi
127 +}
128 +
129 +check_distribution_components() {
130 + if [[ ${CMAKE_MAKEFILE_GENERATOR} == ninja ]]; then
131 + local all_targets=() my_targets=() l
132 + cd "${BUILD_DIR}" || die
133 +
134 + while read -r l; do
135 + if [[ ${l} == install-*-stripped:* ]]; then
136 + l=${l#install-}
137 + l=${l%%-stripped*}
138 +
139 + case ${l} in
140 + # shared libs
141 + LLVM|LLVMgold)
142 + ;;
143 + # TableGen lib + deps
144 + LLVMDemangle|LLVMSupport|LLVMTableGen)
145 + ;;
146 + # static libs
147 + LLVM*)
148 + continue
149 + ;;
150 + # meta-targets
151 + distribution|llvm-libraries)
152 + continue
153 + ;;
154 + # used only w/ USE=doc
155 + docs-llvm-html)
156 + use doc || continue
157 + ;;
158 + esac
159 +
160 + all_targets+=( "${l}" )
161 + fi
162 + done < <(${NINJA} -t targets all)
163 +
164 + while read -r l; do
165 + my_targets+=( "${l}" )
166 + done < <(get_distribution_components $"\n")
167 +
168 + local add=() remove=()
169 + for l in "${all_targets[@]}"; do
170 + if ! has "${l}" "${my_targets[@]}"; then
171 + add+=( "${l}" )
172 + fi
173 + done
174 + for l in "${my_targets[@]}"; do
175 + if ! has "${l}" "${all_targets[@]}"; then
176 + remove+=( "${l}" )
177 + fi
178 + done
179 +
180 + if [[ ${#add[@]} -gt 0 || ${#remove[@]} -gt 0 ]]; then
181 + eqawarn "get_distribution_components() is outdated!"
182 + eqawarn " Add: ${add[*]}"
183 + eqawarn "Remove: ${remove[*]}"
184 + fi
185 + cd - >/dev/null || die
186 + fi
187 +}
188 +
189 +src_prepare() {
190 + # disable use of SDK on OSX, bug #568758
191 + sed -i -e 's/xcrun/false/' utils/lit/lit/util.py || die
192 +
193 + # Update config.guess to support more systems
194 + cp "${BROOT}/usr/share/gnuconfig/config.guess" cmake/ || die
195 +
196 + # Verify that the ebuild is up-to-date
197 + check_uptodate
198 +
199 + llvm.org_src_prepare
200 +}
201 +
202 +# Is LLVM being linked against libc++?
203 +is_libcxx_linked() {
204 + local code='#include <ciso646>
205 +#if defined(_LIBCPP_VERSION)
206 + HAVE_LIBCXX
207 +#endif
208 +'
209 + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1
210 +
211 + [[ ${out} == *HAVE_LIBCXX* ]]
212 +}
213 +
214 +get_distribution_components() {
215 + local sep=${1-;}
216 +
217 + local out=(
218 + # shared libs
219 + LLVM
220 + LTO
221 + Remarks
222 +
223 + # tools
224 + llvm-config
225 +
226 + # common stuff
227 + cmake-exports
228 + llvm-headers
229 +
230 + # libraries needed for clang-tblgen
231 + LLVMDemangle
232 + LLVMSupport
233 + LLVMTableGen
234 + )
235 +
236 + if multilib_is_native_abi; then
237 + out+=(
238 + # utilities
239 + llvm-tblgen
240 + FileCheck
241 + llvm-PerfectShuffle
242 + count
243 + not
244 + yaml-bench
245 + UnicodeNameMappingGenerator
246 +
247 + # tools
248 + bugpoint
249 + dsymutil
250 + llc
251 + lli
252 + lli-child-target
253 + llvm-addr2line
254 + llvm-ar
255 + llvm-as
256 + llvm-bcanalyzer
257 + llvm-bitcode-strip
258 + llvm-c-test
259 + llvm-cat
260 + llvm-cfi-verify
261 + llvm-config
262 + llvm-cov
263 + llvm-cvtres
264 + llvm-cxxdump
265 + llvm-cxxfilt
266 + llvm-cxxmap
267 + llvm-debuginfod
268 + llvm-debuginfod-find
269 + llvm-diff
270 + llvm-dis
271 + llvm-dlltool
272 + llvm-dwarfdump
273 + llvm-dwarfutil
274 + llvm-dwp
275 + llvm-exegesis
276 + llvm-extract
277 + llvm-gsymutil
278 + llvm-ifs
279 + llvm-install-name-tool
280 + llvm-jitlink
281 + llvm-jitlink-executor
282 + llvm-lib
283 + llvm-libtool-darwin
284 + llvm-link
285 + llvm-lipo
286 + llvm-lto
287 + llvm-lto2
288 + llvm-mc
289 + llvm-mca
290 + llvm-ml
291 + llvm-modextract
292 + llvm-mt
293 + llvm-nm
294 + llvm-objcopy
295 + llvm-objdump
296 + llvm-opt-report
297 + llvm-otool
298 + llvm-pdbutil
299 + llvm-profdata
300 + llvm-profgen
301 + llvm-ranlib
302 + llvm-rc
303 + llvm-readelf
304 + llvm-readobj
305 + llvm-reduce
306 + llvm-remark-size-diff
307 + llvm-rtdyld
308 + llvm-sim
309 + llvm-size
310 + llvm-split
311 + llvm-stress
312 + llvm-strings
313 + llvm-strip
314 + llvm-symbolizer
315 + llvm-tapi-diff
316 + llvm-tli-checker
317 + llvm-undname
318 + llvm-windres
319 + llvm-xray
320 + obj2yaml
321 + opt
322 + sancov
323 + sanstats
324 + split-file
325 + verify-uselistorder
326 + yaml2obj
327 +
328 + # python modules
329 + opt-viewer
330 + )
331 +
332 + if llvm_are_manpages_built; then
333 + out+=(
334 + # manpages
335 + docs-dsymutil-man
336 + docs-llvm-dwarfdump-man
337 + docs-llvm-man
338 + )
339 + fi
340 + use doc && out+=(
341 + docs-llvm-html
342 + )
343 +
344 + use binutils-plugin && out+=(
345 + LLVMgold
346 + )
347 + fi
348 +
349 + printf "%s${sep}" "${out[@]}"
350 +}
351 +
352 +multilib_src_configure() {
353 + local ffi_cflags ffi_ldflags
354 + if use libffi; then
355 + ffi_cflags=$($(tc-getPKG_CONFIG) --cflags-only-I libffi)
356 + ffi_ldflags=$($(tc-getPKG_CONFIG) --libs-only-L libffi)
357 + fi
358 +
359 + local libdir=$(get_libdir)
360 + local mycmakeargs=(
361 + # disable appending VCS revision to the version to improve
362 + # direct cache hit ratio
363 + -DLLVM_APPEND_VC_REV=OFF
364 + -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm/${SLOT}"
365 + -DLLVM_LIBDIR_SUFFIX=${libdir#lib}
366 +
367 + -DBUILD_SHARED_LIBS=OFF
368 + -DLLVM_BUILD_LLVM_DYLIB=ON
369 + -DLLVM_LINK_LLVM_DYLIB=ON
370 + -DLLVM_DISTRIBUTION_COMPONENTS=$(get_distribution_components)
371 +
372 + # cheap hack: LLVM combines both anyway, and the only difference
373 + # is that the former list is explicitly verified at cmake time
374 + -DLLVM_TARGETS_TO_BUILD=""
375 + -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="${LLVM_TARGETS// /;}"
376 + -DLLVM_BUILD_TESTS=$(usex test)
377 +
378 + -DLLVM_ENABLE_FFI=$(usex libffi)
379 + -DLLVM_ENABLE_LIBEDIT=$(usex libedit)
380 + -DLLVM_ENABLE_TERMINFO=$(usex ncurses)
381 + -DLLVM_ENABLE_LIBXML2=$(usex xml)
382 + -DLLVM_ENABLE_ASSERTIONS=$(usex debug)
383 + -DLLVM_ENABLE_LIBPFM=$(usex exegesis)
384 + -DLLVM_ENABLE_EH=ON
385 + -DLLVM_ENABLE_RTTI=ON
386 + -DLLVM_ENABLE_Z3_SOLVER=$(usex z3)
387 +
388 + -DLLVM_HOST_TRIPLE="${CHOST}"
389 +
390 + -DFFI_INCLUDE_DIR="${ffi_cflags#-I}"
391 + -DFFI_LIBRARY_DIR="${ffi_ldflags#-L}"
392 + # used only for llvm-objdump tool
393 + -DLLVM_HAVE_LIBXAR=$(multilib_native_usex xar 1 0)
394 +
395 + -DPython3_EXECUTABLE="${PYTHON}"
396 +
397 + # disable OCaml bindings (now in dev-ml/llvm-ocaml)
398 + -DOCAMLFIND=NO
399 + )
400 +
401 + if is_libcxx_linked; then
402 + # Smart hack: alter version suffix -> SOVERSION when linking
403 + # against libc++. This way we won't end up mixing LLVM libc++
404 + # libraries with libstdc++ clang, and the other way around.
405 + mycmakeargs+=(
406 + -DLLVM_VERSION_SUFFIX="libcxx"
407 + -DLLVM_ENABLE_LIBCXX=ON
408 + )
409 + fi
410 +
411 +# Note: go bindings have no CMake rules at the moment
412 +# but let's kill the check in case they are introduced
413 +# if ! multilib_is_native_abi || ! use go; then
414 + mycmakeargs+=(
415 + -DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND
416 + )
417 +# fi
418 +
419 + use test && mycmakeargs+=(
420 + -DLLVM_LIT_ARGS="$(get_lit_flags)"
421 + )
422 +
423 + if multilib_is_native_abi; then
424 + local build_docs=OFF
425 + if llvm_are_manpages_built; then
426 + build_docs=ON
427 + mycmakeargs+=(
428 + -DCMAKE_INSTALL_MANDIR="${EPREFIX}/usr/lib/llvm/${SLOT}/share/man"
429 + -DLLVM_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/html"
430 + -DSPHINX_WARNINGS_AS_ERRORS=OFF
431 + )
432 + fi
433 +
434 + mycmakeargs+=(
435 + -DLLVM_BUILD_DOCS=${build_docs}
436 + -DLLVM_ENABLE_OCAMLDOC=OFF
437 + -DLLVM_ENABLE_SPHINX=${build_docs}
438 + -DLLVM_ENABLE_DOXYGEN=OFF
439 + -DLLVM_INSTALL_UTILS=ON
440 + )
441 + use binutils-plugin && mycmakeargs+=(
442 + -DLLVM_BINUTILS_INCDIR="${EPREFIX}"/usr/include
443 + )
444 + fi
445 +
446 + if tc-is-cross-compiler; then
447 + local tblgen="${EPREFIX}/usr/lib/llvm/${SLOT}/bin/llvm-tblgen"
448 + [[ -x "${tblgen}" ]] \
449 + || die "${tblgen} not found or usable"
450 + mycmakeargs+=(
451 + -DCMAKE_CROSSCOMPILING=ON
452 + -DLLVM_TABLEGEN="${tblgen}"
453 + )
454 + fi
455 +
456 + # workaround BMI bug in gcc-7 (fixed in 7.4)
457 + # https://bugs.gentoo.org/649880
458 + # apply only to x86, https://bugs.gentoo.org/650506
459 + if tc-is-gcc && [[ ${MULTILIB_ABI_FLAG} == abi_x86* ]] &&
460 + [[ $(gcc-major-version) -eq 7 && $(gcc-minor-version) -lt 4 ]]
461 + then
462 + local CFLAGS="${CFLAGS} -mno-bmi"
463 + local CXXFLAGS="${CXXFLAGS} -mno-bmi"
464 + fi
465 +
466 + # LLVM can have very high memory consumption while linking,
467 + # exhausting the limit on 32-bit linker executable
468 + use x86 && local -x LDFLAGS="${LDFLAGS} -Wl,--no-keep-memory"
469 +
470 + # LLVM_ENABLE_ASSERTIONS=NO does not guarantee this for us, #614844
471 + use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG"
472 + cmake_src_configure
473 +
474 + grep -q -E "^CMAKE_PROJECT_VERSION_MAJOR(:.*)?=$(ver_cut 1)$" \
475 + CMakeCache.txt ||
476 + die "Incorrect version, did you update _LLVM_MASTER_MAJOR?"
477 + multilib_is_native_abi && check_distribution_components
478 +}
479 +
480 +multilib_src_compile() {
481 + cmake_build distribution
482 +
483 + pax-mark m "${BUILD_DIR}"/bin/llvm-rtdyld
484 + pax-mark m "${BUILD_DIR}"/bin/lli
485 + pax-mark m "${BUILD_DIR}"/bin/lli-child-target
486 +
487 + if use test; then
488 + pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/Orc/OrcJITTests
489 + pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/MCJIT/MCJITTests
490 + pax-mark m "${BUILD_DIR}"/unittests/Support/SupportTests
491 + fi
492 +}
493 +
494 +multilib_src_test() {
495 + # respect TMPDIR!
496 + local -x LIT_PRESERVES_TMP=1
497 + cmake_build check
498 +}
499 +
500 +src_install() {
501 + local MULTILIB_CHOST_TOOLS=(
502 + /usr/lib/llvm/${SLOT}/bin/llvm-config
503 + )
504 +
505 + local MULTILIB_WRAPPED_HEADERS=(
506 + /usr/include/llvm/Config/llvm-config.h
507 + )
508 +
509 + local LLVM_LDPATHS=()
510 + multilib-minimal_src_install
511 +
512 + # move wrapped headers back
513 + mv "${ED}"/usr/include "${ED}"/usr/lib/llvm/${SLOT}/include || die
514 +}
515 +
516 +multilib_src_install() {
517 + DESTDIR=${D} cmake_build install-distribution
518 +
519 + # move headers to /usr/include for wrapping
520 + rm -rf "${ED}"/usr/include || die
521 + mv "${ED}"/usr/lib/llvm/${SLOT}/include "${ED}"/usr/include || die
522 +
523 + LLVM_LDPATHS+=( "${EPREFIX}/usr/lib/llvm/${SLOT}/$(get_libdir)" )
524 +}
525 +
526 +multilib_src_install_all() {
527 + local revord=$(( 9999 - ${SLOT} ))
528 + newenvd - "60llvm-${revord}" <<-_EOF_
529 + PATH="${EPREFIX}/usr/lib/llvm/${SLOT}/bin"
530 + # we need to duplicate it in ROOTPATH for Portage to respect...
531 + ROOTPATH="${EPREFIX}/usr/lib/llvm/${SLOT}/bin"
532 + MANPATH="${EPREFIX}/usr/lib/llvm/${SLOT}/share/man"
533 + LDPATH="$( IFS=:; echo "${LLVM_LDPATHS[*]}" )"
534 + _EOF_
535 +
536 + docompress "/usr/lib/llvm/${SLOT}/share/man"
537 + llvm_install_manpages
538 +}
539 +
540 +pkg_postinst() {
541 + elog "You can find additional opt-viewer utility scripts in:"
542 + elog " ${EROOT}/usr/lib/llvm/${SLOT}/share/opt-viewer"
543 + elog "To use these scripts, you will need Python along with the following"
544 + elog "packages:"
545 + elog " dev-python/pygments (for opt-viewer)"
546 + elog " dev-python/pyyaml (for all of them)"
547 +}