sys-devel/llvm: Bump to 10.0.0rc2
[gentoo.git] / sys-devel / llvm / llvm-10.0.0_rc1.ebuild
1 # Copyright 1999-2020 Gentoo Authors
2 # Distributed under the terms of the GNU General Public License v2
3
4 EAPI=7
5
6 PYTHON_COMPAT=( python3_{6,7} )
7 inherit cmake-utils llvm.org multilib-minimal multiprocessing \
8         pax-utils python-any-r1 toolchain-funcs
9
10 DESCRIPTION="Low Level Virtual Machine"
11 HOMEPAGE="https://llvm.org/"
12 LLVM_COMPONENTS=( llvm )
13 llvm.org_set_globals
14
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_}" )
22
23 # Additional licenses:
24 # 1. OpenBSD regex: Henry Spencer's license ('rc' in Gentoo) + BSD.
25 # 2. xxhash: BSD.
26 # 3. MD5 code: public-domain.
27 # 4. ConvertUTF.h: TODO.
28
29 LICENSE="Apache-2.0-with-LLVM-exceptions UoI-NCSA BSD public-domain rc"
30 SLOT="$(ver_cut 1)"
31 KEYWORDS=""
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 )"
36
37 RDEPEND="
38         sys-libs/zlib:0=[${MULTILIB_USEDEP}]
39         exegesis? ( dev-libs/libpfm:= )
40         gold? (
41                 || (
42                         >=sys-devel/binutils-2.31.1-r4:*[plugins]
43                         <sys-devel/binutils-2.31.1-r4:*[cxx]
44                 )
45         )
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}] )
49         xar? ( app-arch/xar )
50         xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] )
51         z3? ( >=sci-mathematics/z3-4.7.1:0=[${MULTILIB_USEDEP}] )"
52 DEPEND="${RDEPEND}
53         gold? ( sys-libs/binutils-libs )"
54 BDEPEND="
55         dev-lang/perl
56         sys-devel/gnuconfig
57         || ( >=sys-devel/gcc-3.0 >=sys-devel/llvm-3.5
58                 ( >=sys-freebsd/freebsd-lib-9.1-r10 sys-libs/libcxx )
59         )
60         kernel_Darwin? (
61                 <sys-libs/libcxx-$(ver_cut 1-3).9999
62                 >=sys-devel/binutils-apple-5.1
63         )
64         doc? ( $(python_gen_any_dep '
65                 dev-python/recommonmark[${PYTHON_USEDEP}]
66                 dev-python/sphinx[${PYTHON_USEDEP}]
67         ') )
68         libffi? ( virtual/pkgconfig )
69         ${PYTHON_DEPS}"
70 # There are no file collisions between these versions but having :0
71 # installed means llvm-config there will take precedence.
72 RDEPEND="${RDEPEND}
73         !sys-devel/llvm:0"
74 PDEPEND="sys-devel/llvm-common
75         gold? ( >=sys-devel/llvmgold-${SLOT} )"
76
77 # least intrusive of all
78 CMAKE_BUILD_TYPE=RelWithDebInfo
79
80 python_check_deps() {
81         use doc || return 0
82
83         has_version -b "dev-python/recommonmark[${PYTHON_USEDEP}]" &&
84         has_version -b "dev-python/sphinx[${PYTHON_USEDEP}]"
85 }
86
87 check_live_ebuild() {
88         local prod_targets=(
89                 $(sed -n -e '/set(LLVM_ALL_TARGETS/,/)/p' CMakeLists.txt \
90                         | tail -n +2 | head -n -1)
91         )
92         local all_targets=(
93                 lib/Target/*/
94         )
95         all_targets=( "${all_targets[@]#lib/Target/}" )
96         all_targets=( "${all_targets[@]%/}" )
97
98         local exp_targets=() i
99         for i in "${all_targets[@]}"; do
100                 has "${i}" "${prod_targets[@]}" || exp_targets+=( "${i}" )
101         done
102         # reorder
103         all_targets=( "${prod_targets[@]}" "${exp_targets[@]}" )
104
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[*]}"
109                 eqawarn
110         fi
111
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[*]}"
116         fi
117 }
118
119 check_distribution_components() {
120         if [[ ${CMAKE_MAKEFILE_GENERATOR} == ninja ]]; then
121                 local all_targets=() my_targets=() l
122                 cd "${BUILD_DIR}" || die
123
124                 while read -r l; do
125                         if [[ ${l} == install-*-stripped:* ]]; then
126                                 l=${l#install-}
127                                 l=${l%%-stripped*}
128
129                                 case ${l} in
130                                         # shared libs
131                                         LLVM|LLVMgold)
132                                                 ;;
133                                         # TableGen lib + deps
134                                         LLVMDemangle|LLVMSupport|LLVMTableGen)
135                                                 ;;
136                                         # static libs
137                                         LLVM*)
138                                                 continue
139                                                 ;;
140                                         # meta-targets
141                                         distribution|llvm-libraries)
142                                                 continue
143                                                 ;;
144                                 esac
145
146                                 all_targets+=( "${l}" )
147                         fi
148                 done < <(ninja -t targets all)
149
150                 while read -r l; do
151                         my_targets+=( "${l}" )
152                 done < <(get_distribution_components $"\n")
153
154                 local add=() remove=()
155                 for l in "${all_targets[@]}"; do
156                         if ! has "${l}" "${my_targets[@]}"; then
157                                 add+=( "${l}" )
158                         fi
159                 done
160                 for l in "${my_targets[@]}"; do
161                         if ! has "${l}" "${all_targets[@]}"; then
162                                 remove+=( "${l}" )
163                         fi
164                 done
165
166                 if [[ ${#add[@]} -gt 0 || ${#remove[@]} -gt 0 ]]; then
167                         eqawarn "get_distribution_components() is outdated!"
168                         eqawarn "   Add: ${add[*]}"
169                         eqawarn "Remove: ${remove[*]}"
170                 fi
171                 cd - >/dev/null || die
172         fi
173 }
174
175 src_prepare() {
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
179
180         # disable use of SDK on OSX, bug #568758
181         sed -i -e 's/xcrun/false/' utils/lit/lit/util.py || die
182
183         # Update config.guess to support more systems
184         cp "${BROOT}/usr/share/gnuconfig/config.guess" cmake/ || die
185
186         # User patches + QA
187         cmake-utils_src_prepare
188
189         # Verify that the live ebuild is up-to-date
190         check_live_ebuild
191 }
192
193 # Is LLVM being linked against libc++?
194 is_libcxx_linked() {
195         local code='#include <ciso646>
196 #if defined(_LIBCPP_VERSION)
197         HAVE_LIBCXX
198 #endif
199 '
200         local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1
201
202         [[ ${out} == *HAVE_LIBCXX* ]]
203 }
204
205 get_distribution_components() {
206         local sep=${1-;}
207
208         local out=(
209                 # shared libs
210                 LLVM
211                 LTO
212                 Remarks
213
214                 # tools
215                 llvm-config
216
217                 # common stuff
218                 cmake-exports
219                 llvm-headers
220
221                 # libraries needed for clang-tblgen
222                 LLVMDemangle
223                 LLVMSupport
224                 LLVMTableGen
225         )
226
227         if multilib_is_native_abi; then
228                 out+=(
229                         # utilities
230                         llvm-tblgen
231                         FileCheck
232                         llvm-PerfectShuffle
233                         count
234                         not
235                         yaml-bench
236
237                         # tools
238                         bugpoint
239                         dsymutil
240                         llc
241                         lli
242                         lli-child-target
243                         llvm-addr2line
244                         llvm-ar
245                         llvm-as
246                         llvm-bcanalyzer
247                         llvm-c-test
248                         llvm-cat
249                         llvm-cfi-verify
250                         llvm-config
251                         llvm-cov
252                         llvm-cvtres
253                         llvm-cxxdump
254                         llvm-cxxfilt
255                         llvm-cxxmap
256                         llvm-diff
257                         llvm-dis
258                         llvm-dlltool
259                         llvm-dwarfdump
260                         llvm-dwp
261                         llvm-elfabi
262                         llvm-exegesis
263                         llvm-extract
264                         llvm-ifs
265                         llvm-install-name-tool
266                         llvm-jitlink
267                         llvm-lib
268                         llvm-link
269                         llvm-lipo
270                         llvm-lto
271                         llvm-lto2
272                         llvm-mc
273                         llvm-mca
274                         llvm-modextract
275                         llvm-mt
276                         llvm-nm
277                         llvm-objcopy
278                         llvm-objdump
279                         llvm-opt-report
280                         llvm-pdbutil
281                         llvm-profdata
282                         llvm-ranlib
283                         llvm-rc
284                         llvm-readelf
285                         llvm-readobj
286                         llvm-reduce
287                         llvm-rtdyld
288                         llvm-size
289                         llvm-split
290                         llvm-stress
291                         llvm-strings
292                         llvm-strip
293                         llvm-symbolizer
294                         llvm-undname
295                         llvm-xray
296                         obj2yaml
297                         opt
298                         sancov
299                         sanstats
300                         verify-uselistorder
301                         yaml2obj
302
303                         # python modules
304                         opt-viewer
305                 )
306
307                 use doc && out+=(
308                         docs-dsymutil-man
309                         docs-llvm-dwarfdump-man
310                         docs-llvm-man
311                         docs-llvm-html
312                 )
313
314                 use gold && out+=(
315                         LLVMgold
316                 )
317         fi
318
319         printf "%s${sep}" "${out[@]}"
320 }
321
322 multilib_src_configure() {
323         local ffi_cflags ffi_ldflags
324         if use libffi; then
325                 ffi_cflags=$($(tc-getPKG_CONFIG) --cflags-only-I libffi)
326                 ffi_ldflags=$($(tc-getPKG_CONFIG) --libs-only-L libffi)
327         fi
328
329         local libdir=$(get_libdir)
330         local mycmakeargs=(
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}
336
337                 -DBUILD_SHARED_LIBS=OFF
338                 -DLLVM_BUILD_LLVM_DYLIB=ON
339                 -DLLVM_LINK_LLVM_DYLIB=ON
340                 -DLLVM_DISTRIBUTION_COMPONENTS=$(get_distribution_components)
341
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)
347
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)
354                 -DLLVM_ENABLE_EH=ON
355                 -DLLVM_ENABLE_RTTI=ON
356                 -DLLVM_ENABLE_Z3_SOLVER=$(usex z3)
357
358                 -DWITH_POLLY=OFF # TODO
359
360                 -DLLVM_HOST_TRIPLE="${CHOST}"
361
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)
366
367                 # disable OCaml bindings (now in dev-ml/llvm-ocaml)
368                 -DOCAMLFIND=NO
369         )
370
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.
375                 mycmakeargs+=(
376                         -DLLVM_VERSION_SUFFIX="libcxx"
377                 )
378         fi
379
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
383                 mycmakeargs+=(
384                         -DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND
385                 )
386 #       fi
387
388         use test && mycmakeargs+=(
389                 -DLLVM_LIT_ARGS="-vv;-j;${LIT_JOBS:-$(makeopts_jobs "${MAKEOPTS}" "$(get_nproc)")}"
390         )
391
392         if multilib_is_native_abi; then
393                 mycmakeargs+=(
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
399                 )
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
404                 )
405                 use gold && mycmakeargs+=(
406                         -DLLVM_BINUTILS_INCDIR="${EPREFIX}"/usr/include
407                 )
408         fi
409
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"
414                 mycmakeargs+=(
415                         -DCMAKE_CROSSCOMPILING=ON
416                         -DLLVM_TABLEGEN="${tblgen}"
417                 )
418         fi
419
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 ]]
425         then
426                 local CFLAGS="${CFLAGS} -mno-bmi"
427                 local CXXFLAGS="${CXXFLAGS} -mno-bmi"
428         fi
429
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
433
434         multilib_is_native_abi && check_distribution_components
435 }
436
437 multilib_src_compile() {
438         cmake-utils_src_compile
439
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
443
444         if use test; then
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
448         fi
449 }
450
451 multilib_src_test() {
452         # respect TMPDIR!
453         local -x LIT_PRESERVES_TMP=1
454         cmake-utils_src_make check
455 }
456
457 src_install() {
458         local MULTILIB_CHOST_TOOLS=(
459                 /usr/lib/llvm/${SLOT}/bin/llvm-config
460         )
461
462         local MULTILIB_WRAPPED_HEADERS=(
463                 /usr/include/llvm/Config/llvm-config.h
464         )
465
466         local LLVM_LDPATHS=()
467         multilib-minimal_src_install
468
469         # move wrapped headers back
470         mv "${ED}"/usr/include "${ED}"/usr/lib/llvm/${SLOT}/include || die
471 }
472
473 multilib_src_install() {
474         DESTDIR=${D} cmake-utils_src_make install-distribution
475
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
479
480         LLVM_LDPATHS+=( "${EPREFIX}/usr/lib/llvm/${SLOT}/$(get_libdir)" )
481 }
482
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[*]}" )"
491         _EOF_
492
493         docompress "/usr/lib/llvm/${SLOT}/share/man"
494 }
495
496 pkg_postinst() {
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"
500         elog "packages:"
501         elog "  dev-python/pygments (for opt-viewer)"
502         elog "  dev-python/pyyaml (for all of them)"
503 }