|
1 # Copyright 1999-2024 Gentoo Authors |
|
2 # Distributed under the terms of the GNU General Public License v2 |
|
3 |
|
4 EAPI=8 |
|
5 |
|
6 PYTHON_COMPAT=( python3_{10..13} ) |
|
7 inherit cmake llvm llvm.org multilib multilib-minimal \ |
|
8 prefix python-single-r1 toolchain-funcs |
|
9 |
|
10 DESCRIPTION="C language family frontend for LLVM" |
|
11 HOMEPAGE="https://llvm.org/" |
|
12 |
|
13 # MSVCSetupApi.h: MIT |
|
14 # sorttable.js: MIT |
|
15 |
|
16 LICENSE="Apache-2.0-with-LLVM-exceptions UoI-NCSA MIT" |
|
17 SLOT="${LLVM_MAJOR}/${LLVM_SOABI}g1" |
|
18 KEYWORDS="amd64 arm arm64 ppc ppc64 ~riscv sparc x86 ~amd64-linux ~x64-macos" |
|
19 IUSE="debug doc +extra ieee-long-double +pie +static-analyzer test xml" |
|
20 REQUIRED_USE="${PYTHON_REQUIRED_USE}" |
|
21 RESTRICT="!test? ( test )" |
|
22 |
|
23 DEPEND=" |
|
24 ~llvm-core/llvm-${PV}:${LLVM_MAJOR}=[debug=,${MULTILIB_USEDEP}] |
|
25 static-analyzer? ( dev-lang/perl:* ) |
|
26 xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] ) |
|
27 " |
|
28 |
|
29 RDEPEND=" |
|
30 ${PYTHON_DEPS} |
|
31 ${DEPEND} |
|
32 >=llvm-core/clang-common-${PV} |
|
33 " |
|
34 BDEPEND=" |
|
35 ${PYTHON_DEPS} |
|
36 doc? ( $(python_gen_cond_dep ' |
|
37 dev-python/recommonmark[${PYTHON_USEDEP}] |
|
38 dev-python/sphinx[${PYTHON_USEDEP}] |
|
39 ') ) |
|
40 xml? ( virtual/pkgconfig ) |
|
41 " |
|
42 PDEPEND=" |
|
43 llvm-core/clang-toolchain-symlinks:${LLVM_MAJOR} |
|
44 ~llvm-core/clang-runtime-${PV} |
|
45 " |
|
46 |
|
47 LLVM_COMPONENTS=( |
|
48 clang clang-tools-extra cmake |
|
49 llvm/lib/Transforms/Hello |
|
50 ) |
|
51 LLVM_MANPAGES=1 |
|
52 LLVM_TEST_COMPONENTS=( |
|
53 llvm/lib/Testing/Support |
|
54 llvm/utils/{lit,llvm-lit,unittest} |
|
55 llvm/utils/{UpdateTestChecks,update_cc_test_checks.py} |
|
56 ) |
|
57 LLVM_PATCHSET=${PV/_/-}-r3 |
|
58 LLVM_USE_TARGETS=llvm |
|
59 llvm.org_set_globals |
|
60 |
|
61 # Multilib notes: |
|
62 # 1. ABI_* flags control ABIs libclang* is built for only. |
|
63 # 2. clang is always capable of compiling code for all ABIs for enabled |
|
64 # target. However, you will need appropriate crt* files (installed |
|
65 # e.g. by sys-devel/gcc and sys-libs/glibc). |
|
66 # 3. ${CHOST}-clang wrappers are always installed for all ABIs included |
|
67 # in the current profile (i.e. alike supported by sys-devel/gcc). |
|
68 # |
|
69 # Therefore: use llvm-core/clang[${MULTILIB_USEDEP}] only if you need |
|
70 # multilib clang* libraries (not runtime, not wrappers). |
|
71 |
|
72 pkg_setup() { |
|
73 LLVM_MAX_SLOT=${LLVM_MAJOR} llvm_pkg_setup |
|
74 python-single-r1_pkg_setup |
|
75 } |
|
76 |
|
77 src_prepare() { |
|
78 # create extra parent dir for relative CLANG_RESOURCE_DIR access |
|
79 mkdir -p x/y || die |
|
80 BUILD_DIR=${WORKDIR}/x/y/clang |
|
81 |
|
82 llvm.org_src_prepare |
|
83 |
|
84 # add Gentoo Portage Prefix for Darwin (see prefix-dirs.patch) |
|
85 eprefixify \ |
|
86 lib/Lex/InitHeaderSearch.cpp \ |
|
87 lib/Driver/ToolChains/Darwin.cpp || die |
|
88 |
|
89 if ! use prefix-guest && [[ -n ${EPREFIX} ]]; then |
|
90 sed -i "/LibDir.*Loader/s@return \"\/\"@return \"${EPREFIX}/\"@" lib/Driver/ToolChains/Linux.cpp || die |
|
91 fi |
|
92 } |
|
93 |
|
94 check_distribution_components() { |
|
95 if [[ ${CMAKE_MAKEFILE_GENERATOR} == ninja ]]; then |
|
96 local all_targets=() my_targets=() l |
|
97 cd "${BUILD_DIR}" || die |
|
98 |
|
99 while read -r l; do |
|
100 if [[ ${l} == install-*-stripped:* ]]; then |
|
101 l=${l#install-} |
|
102 l=${l%%-stripped*} |
|
103 |
|
104 case ${l} in |
|
105 # meta-targets |
|
106 clang-libraries|distribution) |
|
107 continue |
|
108 ;; |
|
109 # tools |
|
110 clang|clangd|clang-*) |
|
111 ;; |
|
112 # static libraries |
|
113 clang*|findAllSymbols) |
|
114 continue |
|
115 ;; |
|
116 # conditional to USE=doc |
|
117 docs-clang-html|docs-clang-tools-html) |
|
118 use doc || continue |
|
119 ;; |
|
120 esac |
|
121 |
|
122 all_targets+=( "${l}" ) |
|
123 fi |
|
124 done < <(${NINJA} -t targets all) |
|
125 |
|
126 while read -r l; do |
|
127 my_targets+=( "${l}" ) |
|
128 done < <(get_distribution_components $"\n") |
|
129 |
|
130 local add=() remove=() |
|
131 for l in "${all_targets[@]}"; do |
|
132 if ! has "${l}" "${my_targets[@]}"; then |
|
133 add+=( "${l}" ) |
|
134 fi |
|
135 done |
|
136 for l in "${my_targets[@]}"; do |
|
137 if ! has "${l}" "${all_targets[@]}"; then |
|
138 remove+=( "${l}" ) |
|
139 fi |
|
140 done |
|
141 |
|
142 if [[ ${#add[@]} -gt 0 || ${#remove[@]} -gt 0 ]]; then |
|
143 eqawarn "get_distribution_components() is outdated!" |
|
144 eqawarn " Add: ${add[*]}" |
|
145 eqawarn "Remove: ${remove[*]}" |
|
146 fi |
|
147 cd - >/dev/null || die |
|
148 fi |
|
149 } |
|
150 |
|
151 get_distribution_components() { |
|
152 local sep=${1-;} |
|
153 |
|
154 local out=( |
|
155 # common stuff |
|
156 clang-cmake-exports |
|
157 clang-headers |
|
158 clang-resource-headers |
|
159 libclang-headers |
|
160 |
|
161 aarch64-resource-headers |
|
162 arm-common-resource-headers |
|
163 arm-resource-headers |
|
164 core-resource-headers |
|
165 cuda-resource-headers |
|
166 hexagon-resource-headers |
|
167 hip-resource-headers |
|
168 hlsl-resource-headers |
|
169 mips-resource-headers |
|
170 opencl-resource-headers |
|
171 openmp-resource-headers |
|
172 ppc-htm-resource-headers |
|
173 ppc-resource-headers |
|
174 riscv-resource-headers |
|
175 systemz-resource-headers |
|
176 utility-resource-headers |
|
177 ve-resource-headers |
|
178 webassembly-resource-headers |
|
179 windows-resource-headers |
|
180 x86-resource-headers |
|
181 |
|
182 # libs |
|
183 clang-cpp |
|
184 libclang |
|
185 ) |
|
186 |
|
187 if multilib_is_native_abi; then |
|
188 out+=( |
|
189 # common stuff |
|
190 bash-autocomplete |
|
191 libclang-python-bindings |
|
192 |
|
193 # tools |
|
194 c-index-test |
|
195 clang |
|
196 clang-format |
|
197 clang-offload-bundler |
|
198 clang-offload-packager |
|
199 clang-offload-wrapper |
|
200 clang-refactor |
|
201 clang-repl |
|
202 clang-rename |
|
203 clang-scan-deps |
|
204 diagtool |
|
205 hmaptool |
|
206 |
|
207 # needed for cross-compiling Clang |
|
208 clang-tblgen |
|
209 ) |
|
210 |
|
211 if use extra; then |
|
212 out+=( |
|
213 # extra tools |
|
214 clang-apply-replacements |
|
215 clang-change-namespace |
|
216 clang-doc |
|
217 clang-include-fixer |
|
218 clang-move |
|
219 clang-pseudo |
|
220 clang-query |
|
221 clang-reorder-fields |
|
222 clang-tidy |
|
223 clang-tidy-headers |
|
224 clangd |
|
225 find-all-symbols |
|
226 modularize |
|
227 pp-trace |
|
228 ) |
|
229 fi |
|
230 |
|
231 if llvm_are_manpages_built; then |
|
232 out+=( docs-clang-man ) |
|
233 use extra && out+=( docs-clang-tools-man ) |
|
234 fi |
|
235 |
|
236 if use doc; then |
|
237 out+=( docs-clang-html ) |
|
238 use extra && out+=( docs-clang-tools-html ) |
|
239 fi |
|
240 |
|
241 use static-analyzer && out+=( |
|
242 clang-check |
|
243 clang-extdef-mapping |
|
244 scan-build |
|
245 scan-build-py |
|
246 scan-view |
|
247 ) |
|
248 fi |
|
249 |
|
250 printf "%s${sep}" "${out[@]}" |
|
251 } |
|
252 |
|
253 multilib_src_configure() { |
|
254 local mycmakeargs=( |
|
255 -DDEFAULT_SYSROOT=$(usex prefix-guest "" "${EPREFIX}") |
|
256 -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}" |
|
257 -DCMAKE_INSTALL_MANDIR="${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}/share/man" |
|
258 -DCLANG_CONFIG_FILE_SYSTEM_DIR="${EPREFIX}/etc/clang" |
|
259 # relative to bindir |
|
260 -DCLANG_RESOURCE_DIR="../../../../lib/clang/${LLVM_VERSION}" |
|
261 |
|
262 -DBUILD_SHARED_LIBS=OFF |
|
263 -DCLANG_LINK_CLANG_DYLIB=ON |
|
264 -DLLVM_DISTRIBUTION_COMPONENTS=$(get_distribution_components) |
|
265 |
|
266 -DLLVM_TARGETS_TO_BUILD="${LLVM_TARGETS// /;}" |
|
267 -DLLVM_BUILD_TESTS=$(usex test) |
|
268 |
|
269 # these are not propagated reliably, so redefine them |
|
270 -DLLVM_ENABLE_EH=ON |
|
271 -DLLVM_ENABLE_RTTI=ON |
|
272 |
|
273 -DCMAKE_DISABLE_FIND_PACKAGE_LibXml2=$(usex !xml) |
|
274 # libgomp support fails to find headers without explicit -I |
|
275 # furthermore, it provides only syntax checking |
|
276 -DCLANG_DEFAULT_OPENMP_RUNTIME=libomp |
|
277 |
|
278 # disable using CUDA to autodetect GPU, just build for all |
|
279 -DCMAKE_DISABLE_FIND_PACKAGE_CUDA=ON |
|
280 |
|
281 -DCLANG_DEFAULT_PIE_ON_LINUX=$(usex pie) |
|
282 |
|
283 -DCLANG_ENABLE_ARCMT=$(usex static-analyzer) |
|
284 -DCLANG_ENABLE_STATIC_ANALYZER=$(usex static-analyzer) |
|
285 |
|
286 -DPython3_EXECUTABLE="${PYTHON}" |
|
287 ) |
|
288 |
|
289 if ! use elibc_musl; then |
|
290 mycmakeargs+=( |
|
291 -DPPC_LINUX_DEFAULT_IEEELONGDOUBLE=$(usex ieee-long-double) |
|
292 ) |
|
293 fi |
|
294 |
|
295 use test && mycmakeargs+=( |
|
296 -DLLVM_MAIN_SRC_DIR="${WORKDIR}/llvm" |
|
297 -DLLVM_EXTERNAL_LIT="${BUILD_DIR}/bin/llvm-lit" |
|
298 -DLLVM_LIT_ARGS="$(get_lit_flags)" |
|
299 ) |
|
300 |
|
301 if multilib_is_native_abi; then |
|
302 local build_docs=OFF |
|
303 if llvm_are_manpages_built; then |
|
304 build_docs=ON |
|
305 mycmakeargs+=( |
|
306 -DLLVM_BUILD_DOCS=ON |
|
307 -DLLVM_ENABLE_SPHINX=ON |
|
308 -DCLANG_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/html" |
|
309 -DSPHINX_WARNINGS_AS_ERRORS=OFF |
|
310 ) |
|
311 if use extra; then |
|
312 mycmakeargs+=( |
|
313 -DCLANG-TOOLS_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/tools-extra" |
|
314 ) |
|
315 fi |
|
316 fi |
|
317 mycmakeargs+=( |
|
318 -DCLANG_INCLUDE_DOCS=${build_docs} |
|
319 ) |
|
320 fi |
|
321 if multilib_native_use extra; then |
|
322 mycmakeargs+=( |
|
323 -DLLVM_EXTERNAL_CLANG_TOOLS_EXTRA_SOURCE_DIR="${WORKDIR}"/clang-tools-extra |
|
324 -DCLANG_TOOLS_EXTRA_INCLUDE_DOCS=${build_docs} |
|
325 ) |
|
326 else |
|
327 mycmakeargs+=( |
|
328 -DLLVM_TOOL_CLANG_TOOLS_EXTRA_BUILD=OFF |
|
329 ) |
|
330 fi |
|
331 |
|
332 if [[ -n ${EPREFIX} ]]; then |
|
333 mycmakeargs+=( |
|
334 -DGCC_INSTALL_PREFIX="${EPREFIX}/usr" |
|
335 ) |
|
336 fi |
|
337 |
|
338 if tc-is-cross-compiler; then |
|
339 has_version -b llvm-core/clang:${LLVM_MAJOR} || |
|
340 die "llvm-core/clang:${LLVM_MAJOR} is required on the build host." |
|
341 local tools_bin=${BROOT}/usr/lib/llvm/${LLVM_MAJOR}/bin |
|
342 mycmakeargs+=( |
|
343 -DLLVM_TOOLS_BINARY_DIR="${tools_bin}" |
|
344 -DCLANG_TABLEGEN="${tools_bin}"/clang-tblgen |
|
345 ) |
|
346 fi |
|
347 |
|
348 # LLVM can have very high memory consumption while linking, |
|
349 # exhausting the limit on 32-bit linker executable |
|
350 use x86 && local -x LDFLAGS="${LDFLAGS} -Wl,--no-keep-memory" |
|
351 |
|
352 # LLVM_ENABLE_ASSERTIONS=NO does not guarantee this for us, #614844 |
|
353 use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG" |
|
354 cmake_src_configure |
|
355 |
|
356 multilib_is_native_abi && check_distribution_components |
|
357 } |
|
358 |
|
359 multilib_src_compile() { |
|
360 cmake_build distribution |
|
361 |
|
362 # provide a symlink for tests |
|
363 if [[ ! -L ${WORKDIR}/lib/clang ]]; then |
|
364 mkdir -p "${WORKDIR}"/lib || die |
|
365 ln -s "${BUILD_DIR}/$(get_libdir)/clang" "${WORKDIR}"/lib/clang || die |
|
366 fi |
|
367 } |
|
368 |
|
369 multilib_src_test() { |
|
370 # respect TMPDIR! |
|
371 local -x LIT_PRESERVES_TMP=1 |
|
372 local test_targets=( check-clang ) |
|
373 if multilib_native_use extra; then |
|
374 test_targets+=( |
|
375 check-clang-tools |
|
376 check-clangd |
|
377 ) |
|
378 fi |
|
379 cmake_build "${test_targets[@]}" |
|
380 } |
|
381 |
|
382 src_install() { |
|
383 MULTILIB_WRAPPED_HEADERS=( |
|
384 /usr/include/clang/Config/config.h |
|
385 ) |
|
386 |
|
387 multilib-minimal_src_install |
|
388 |
|
389 # Move runtime headers to /usr/lib/clang, where they belong |
|
390 mv "${ED}"/usr/include/clangrt "${ED}"/usr/lib/clang || die |
|
391 # move (remaining) wrapped headers back |
|
392 if use extra; then |
|
393 mv "${T}"/clang-tidy "${ED}"/usr/include/ || die |
|
394 fi |
|
395 mv "${ED}"/usr/include "${ED}"/usr/lib/llvm/${LLVM_MAJOR}/include || die |
|
396 |
|
397 # Apply CHOST and version suffix to clang tools |
|
398 local clang_tools=( clang clang++ clang-cl clang-cpp ) |
|
399 local abi i |
|
400 |
|
401 # cmake gives us: |
|
402 # - clang-X |
|
403 # - clang -> clang-X |
|
404 # - clang++, clang-cl, clang-cpp -> clang |
|
405 # we want to have: |
|
406 # - clang-X |
|
407 # - clang++-X, clang-cl-X, clang-cpp-X -> clang-X |
|
408 # - clang, clang++, clang-cl, clang-cpp -> clang*-X |
|
409 # also in CHOST variant |
|
410 for i in "${clang_tools[@]:1}"; do |
|
411 rm "${ED}/usr/lib/llvm/${LLVM_MAJOR}/bin/${i}" || die |
|
412 dosym "clang-${LLVM_MAJOR}" "/usr/lib/llvm/${LLVM_MAJOR}/bin/${i}-${LLVM_MAJOR}" |
|
413 dosym "${i}-${LLVM_MAJOR}" "/usr/lib/llvm/${LLVM_MAJOR}/bin/${i}" |
|
414 done |
|
415 |
|
416 # now create target symlinks for all supported ABIs |
|
417 for abi in $(get_all_abis); do |
|
418 local abi_chost=$(get_abi_CHOST "${abi}") |
|
419 for i in "${clang_tools[@]}"; do |
|
420 dosym "${i}-${LLVM_MAJOR}" \ |
|
421 "/usr/lib/llvm/${LLVM_MAJOR}/bin/${abi_chost}-${i}-${LLVM_MAJOR}" |
|
422 dosym "${abi_chost}-${i}-${LLVM_MAJOR}" \ |
|
423 "/usr/lib/llvm/${LLVM_MAJOR}/bin/${abi_chost}-${i}" |
|
424 done |
|
425 done |
|
426 } |
|
427 |
|
428 multilib_src_install() { |
|
429 DESTDIR=${D} cmake_build install-distribution |
|
430 |
|
431 if multilib_is_native_abi; then |
|
432 # install clang-*-wrapper tools |
|
433 # https://bugs.gentoo.org/904143 |
|
434 exeinto "/usr/lib/llvm/${LLVM_MAJOR}/bin" |
|
435 doexe "${BUILD_DIR}"/bin/clang-{linker,nvlink}-wrapper |
|
436 fi |
|
437 |
|
438 # move headers to /usr/include for wrapping & ABI mismatch checks |
|
439 # (also drop the version suffix from runtime headers) |
|
440 rm -rf "${ED}"/usr/include || die |
|
441 mv "${ED}"/usr/lib/llvm/${LLVM_MAJOR}/include "${ED}"/usr/include || die |
|
442 mv "${ED}"/usr/lib/llvm/${LLVM_MAJOR}/$(get_libdir)/clang "${ED}"/usr/include/clangrt || die |
|
443 if multilib_native_use extra; then |
|
444 # don't wrap clang-tidy headers, the list is too long |
|
445 # (they're fine for non-native ABI but enabling the targets is problematic) |
|
446 mv "${ED}"/usr/include/clang-tidy "${T}/" || die |
|
447 fi |
|
448 } |
|
449 |
|
450 multilib_src_install_all() { |
|
451 python_fix_shebang "${ED}" |
|
452 if use static-analyzer; then |
|
453 python_optimize "${ED}"/usr/lib/llvm/${LLVM_MAJOR}/share/scan-view |
|
454 fi |
|
455 |
|
456 docompress "/usr/lib/llvm/${LLVM_MAJOR}/share/man" |
|
457 llvm_install_manpages |
|
458 # match 'html' non-compression |
|
459 use doc && docompress -x "/usr/share/doc/${PF}/tools-extra" |
|
460 # +x for some reason; TODO: investigate |
|
461 use static-analyzer && fperms a-x "/usr/lib/llvm/${LLVM_MAJOR}/share/man/man1/scan-build.1" |
|
462 } |
|
463 |
|
464 pkg_postinst() { |
|
465 if [[ -z ${ROOT} && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]] ; then |
|
466 eselect compiler-shadow update all |
|
467 fi |
|
468 |
|
469 elog "You can find additional utility scripts in:" |
|
470 elog " ${EROOT}/usr/lib/llvm/${LLVM_MAJOR}/share/clang" |
|
471 if use extra; then |
|
472 elog "Some of them are vim integration scripts (with instructions inside)." |
|
473 elog "The run-clang-tidy.py script requires the following additional package:" |
|
474 elog " dev-python/pyyaml" |
|
475 fi |
|
476 } |
|
477 |
|
478 pkg_postrm() { |
|
479 if [[ -z ${ROOT} && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]] ; then |
|
480 eselect compiler-shadow clean all |
|
481 fi |
|
482 } |