*/*: Clean PYTHON_COMPAT of obsolete impls
[gentoo.git] / sys-devel / clang / clang-10.0.0.9999.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=( python{2_7,3_{6,7}} )
7 inherit cmake-utils llvm llvm.org multilib-minimal multiprocessing \
8         pax-utils python-single-r1 toolchain-funcs
9
10 DESCRIPTION="C language family frontend for LLVM"
11 HOMEPAGE="https://llvm.org/"
12 LLVM_COMPONENTS=( clang clang-tools-extra )
13 LLVM_TEST_COMPONENTS=(
14         llvm/lib/Testing/Support
15         llvm/utils/{lit,llvm-lit,unittest}
16 )
17 llvm.org_set_globals
18 # We need extra level of indirection for CLANG_RESOURCE_DIR
19 S=${WORKDIR}/x/y/clang
20
21 # Keep in sync with sys-devel/llvm
22 ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC AVR )
23 ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM BPF Hexagon Lanai Mips MSP430
24         NVPTX PowerPC RISCV Sparc SystemZ WebAssembly X86 XCore
25         "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}" )
26 ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" )
27 LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/?}
28
29 # MSVCSetupApi.h: MIT
30 # sorttable.js: MIT
31
32 LICENSE="Apache-2.0-with-LLVM-exceptions UoI-NCSA MIT"
33 SLOT="$(ver_cut 1)"
34 KEYWORDS=""
35 IUSE="debug default-compiler-rt default-libcxx doc +static-analyzer
36         test xml kernel_FreeBSD ${ALL_LLVM_TARGETS[*]}"
37 REQUIRED_USE="${PYTHON_REQUIRED_USE}
38         || ( ${ALL_LLVM_TARGETS[*]} )"
39 RESTRICT="!test? ( test )"
40
41 RDEPEND="
42         ~sys-devel/llvm-${PV}:${SLOT}=[debug=,${LLVM_TARGET_USEDEPS// /,},${MULTILIB_USEDEP}]
43         static-analyzer? ( dev-lang/perl:* )
44         xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] )
45         ${PYTHON_DEPS}"
46 DEPEND="${RDEPEND}"
47 BDEPEND="
48         doc? ( dev-python/sphinx )
49         xml? ( virtual/pkgconfig )
50         ${PYTHON_DEPS}"
51 RDEPEND="${RDEPEND}
52         !<sys-devel/llvm-4.0.0_rc:0
53         !sys-devel/clang:0"
54 PDEPEND="
55         sys-devel/clang-common
56         ~sys-devel/clang-runtime-${PV}
57         default-compiler-rt? ( =sys-libs/compiler-rt-${PV%_*}* )
58         default-libcxx? ( >=sys-libs/libcxx-${PV} )"
59
60 # least intrusive of all
61 CMAKE_BUILD_TYPE=RelWithDebInfo
62
63 # Multilib notes:
64 # 1. ABI_* flags control ABIs libclang* is built for only.
65 # 2. clang is always capable of compiling code for all ABIs for enabled
66 #    target. However, you will need appropriate crt* files (installed
67 #    e.g. by sys-devel/gcc and sys-libs/glibc).
68 # 3. ${CHOST}-clang wrappers are always installed for all ABIs included
69 #    in the current profile (i.e. alike supported by sys-devel/gcc).
70 #
71 # Therefore: use sys-devel/clang[${MULTILIB_USEDEP}] only if you need
72 # multilib clang* libraries (not runtime, not wrappers).
73
74 pkg_setup() {
75         LLVM_MAX_SLOT=${SLOT} llvm_pkg_setup
76         python-single-r1_pkg_setup
77 }
78
79 src_unpack() {
80         # create extra parent dir for CLANG_RESOURCE_DIR
81         mkdir -p x/y || die
82         cd x/y || die
83         llvm.org_src_unpack
84         mv clang-tools-extra clang/tools/extra || die
85 }
86
87 check_distribution_components() {
88         if [[ ${CMAKE_MAKEFILE_GENERATOR} == ninja ]]; then
89                 local all_targets=() my_targets=() l
90                 cd "${BUILD_DIR}" || die
91
92                 while read -r l; do
93                         if [[ ${l} == install-*-stripped:* ]]; then
94                                 l=${l#install-}
95                                 l=${l%%-stripped*}
96
97                                 case ${l} in
98                                         # meta-targets
99                                         clang-libraries|distribution)
100                                                 continue
101                                                 ;;
102                                         # tools
103                                         clang|clangd|clang-*)
104                                                 ;;
105                                         # static libraries
106                                         clang*|findAllSymbols)
107                                                 continue
108                                                 ;;
109                                 esac
110
111                                 all_targets+=( "${l}" )
112                         fi
113                 done < <(ninja -t targets all)
114
115                 while read -r l; do
116                         my_targets+=( "${l}" )
117                 done < <(get_distribution_components $"\n")
118
119                 local add=() remove=()
120                 for l in "${all_targets[@]}"; do
121                         if ! has "${l}" "${my_targets[@]}"; then
122                                 add+=( "${l}" )
123                         fi
124                 done
125                 for l in "${my_targets[@]}"; do
126                         if ! has "${l}" "${all_targets[@]}"; then
127                                 remove+=( "${l}" )
128                         fi
129                 done
130
131                 if [[ ${#add[@]} -gt 0 || ${#remove[@]} -gt 0 ]]; then
132                         eqawarn "get_distribution_components() is outdated!"
133                         eqawarn "   Add: ${add[*]}"
134                         eqawarn "Remove: ${remove[*]}"
135                 fi
136                 cd - >/dev/null || die
137         fi
138 }
139
140 get_distribution_components() {
141         local sep=${1-;}
142
143         local out=(
144                 # common stuff
145                 clang-cmake-exports
146                 clang-headers
147                 clang-resource-headers
148                 libclang-headers
149
150                 # libs
151                 clang-cpp
152                 libclang
153         )
154
155         if multilib_is_native_abi; then
156                 out+=(
157                         # common stuff
158                         bash-autocomplete
159                         libclang-python-bindings
160
161                         # tools
162                         c-index-test
163                         clang
164                         clang-format
165                         clang-import-test
166                         clang-offload-bundler
167                         clang-offload-wrapper
168                         clang-refactor
169                         clang-rename
170                         clang-scan-deps
171                         diagtool
172                         hmaptool
173
174                         # extra tools
175                         clang-apply-replacements
176                         clang-change-namespace
177                         clang-doc
178                         clang-include-fixer
179                         clang-move
180                         clang-query
181                         clang-reorder-fields
182                         clang-tidy
183                         clangd
184                         find-all-symbols
185                         modularize
186                         pp-trace
187                 )
188
189                 use doc && out+=(
190                         docs-clang-html
191                         docs-clang-man
192                         docs-clang-tools-html
193                         docs-clang-tools-man
194                 )
195
196                 use static-analyzer && out+=(
197                         clang-check
198                         clang-extdef-mapping
199                         scan-build
200                         scan-view
201                 )
202         fi
203
204         printf "%s${sep}" "${out[@]}"
205 }
206
207 multilib_src_configure() {
208         local llvm_version=$(llvm-config --version) || die
209         local clang_version=$(ver_cut 1-3 "${llvm_version}")
210
211         local mycmakeargs=(
212                 -DLLVM_CMAKE_PATH="${EPREFIX}/usr/lib/llvm/${SLOT}/$(get_libdir)/cmake/llvm"
213                 -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm/${SLOT}"
214                 -DCMAKE_INSTALL_MANDIR="${EPREFIX}/usr/lib/llvm/${SLOT}/share/man"
215                 # relative to bindir
216                 -DCLANG_RESOURCE_DIR="../../../../lib/clang/${clang_version}"
217
218                 -DBUILD_SHARED_LIBS=OFF
219                 -DCLANG_LINK_CLANG_DYLIB=ON
220                 -DLLVM_DISTRIBUTION_COMPONENTS=$(get_distribution_components)
221
222                 -DLLVM_TARGETS_TO_BUILD="${LLVM_TARGETS// /;}"
223                 -DLLVM_BUILD_TESTS=$(usex test)
224
225                 # these are not propagated reliably, so redefine them
226                 -DLLVM_ENABLE_EH=ON
227                 -DLLVM_ENABLE_RTTI=ON
228
229                 -DCMAKE_DISABLE_FIND_PACKAGE_LibXml2=$(usex !xml)
230                 # libgomp support fails to find headers without explicit -I
231                 # furthermore, it provides only syntax checking
232                 -DCLANG_DEFAULT_OPENMP_RUNTIME=libomp
233
234                 # override default stdlib and rtlib
235                 -DCLANG_DEFAULT_CXX_STDLIB=$(usex default-libcxx libc++ "")
236                 -DCLANG_DEFAULT_RTLIB=$(usex default-compiler-rt compiler-rt "")
237
238                 -DCLANG_ENABLE_ARCMT=$(usex static-analyzer)
239                 -DCLANG_ENABLE_STATIC_ANALYZER=$(usex static-analyzer)
240         )
241         use test && mycmakeargs+=(
242                 -DLLVM_MAIN_SRC_DIR="${WORKDIR}/x/y/llvm"
243                 -DLLVM_LIT_ARGS="-vv;-j;${LIT_JOBS:-$(makeopts_jobs "${MAKEOPTS}" "$(get_nproc)")}"
244         )
245
246         if multilib_is_native_abi; then
247                 mycmakeargs+=(
248                         # normally copied from LLVM_INCLUDE_DOCS but the latter
249                         # is lacking value in stand-alone builds
250                         -DCLANG_INCLUDE_DOCS=$(usex doc)
251                         -DCLANG_TOOLS_EXTRA_INCLUDE_DOCS=$(usex doc)
252                 )
253                 use doc && mycmakeargs+=(
254                         -DLLVM_BUILD_DOCS=ON
255                         -DLLVM_ENABLE_SPHINX=ON
256                         -DCLANG_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/html"
257                         -DCLANG-TOOLS_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/tools-extra"
258                         -DSPHINX_WARNINGS_AS_ERRORS=OFF
259                 )
260         else
261                 mycmakeargs+=(
262                         -DLLVM_TOOL_CLANG_TOOLS_EXTRA_BUILD=OFF
263                 )
264         fi
265
266         if [[ -n ${EPREFIX} ]]; then
267                 mycmakeargs+=(
268                         -DGCC_INSTALL_PREFIX="${EPREFIX}/usr"
269                 )
270         fi
271
272         if tc-is-cross-compiler; then
273                 [[ -x "/usr/bin/clang-tblgen" ]] \
274                         || die "/usr/bin/clang-tblgen not found or usable"
275                 mycmakeargs+=(
276                         -DCMAKE_CROSSCOMPILING=ON
277                         -DCLANG_TABLEGEN=/usr/bin/clang-tblgen
278                 )
279         fi
280
281         # LLVM_ENABLE_ASSERTIONS=NO does not guarantee this for us, #614844
282         use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG"
283         cmake-utils_src_configure
284
285         multilib_is_native_abi && check_distribution_components
286 }
287
288 multilib_src_compile() {
289         cmake-utils_src_compile
290
291         # provide a symlink for tests
292         if [[ ! -L ${WORKDIR}/lib/clang ]]; then
293                 mkdir -p "${WORKDIR}"/lib || die
294                 ln -s "${BUILD_DIR}/$(get_libdir)/clang" "${WORKDIR}"/lib/clang || die
295         fi
296 }
297
298 multilib_src_test() {
299         # respect TMPDIR!
300         local -x LIT_PRESERVES_TMP=1
301         cmake-utils_src_make check-clang
302         multilib_is_native_abi &&
303                 cmake-utils_src_make check-clang-tools check-clangd
304 }
305
306 src_install() {
307         MULTILIB_WRAPPED_HEADERS=(
308                 /usr/include/clang/Config/config.h
309         )
310
311         multilib-minimal_src_install
312
313         # Move runtime headers to /usr/lib/clang, where they belong
314         mv "${ED}"/usr/include/clangrt "${ED}"/usr/lib/clang || die
315         # move (remaining) wrapped headers back
316         mv "${ED}"/usr/include "${ED}"/usr/lib/llvm/${SLOT}/include || die
317
318         # Apply CHOST and version suffix to clang tools
319         # note: we use two version components here (vs 3 in runtime path)
320         local llvm_version=$(llvm-config --version) || die
321         local clang_version=$(ver_cut 1 "${llvm_version}")
322         local clang_full_version=$(ver_cut 1-3 "${llvm_version}")
323         local clang_tools=( clang clang++ clang-cl clang-cpp )
324         local abi i
325
326         # cmake gives us:
327         # - clang-X
328         # - clang -> clang-X
329         # - clang++, clang-cl, clang-cpp -> clang
330         # we want to have:
331         # - clang-X
332         # - clang++-X, clang-cl-X, clang-cpp-X -> clang-X
333         # - clang, clang++, clang-cl, clang-cpp -> clang*-X
334         # also in CHOST variant
335         for i in "${clang_tools[@]:1}"; do
336                 rm "${ED}/usr/lib/llvm/${SLOT}/bin/${i}" || die
337                 dosym "clang-${clang_version}" "/usr/lib/llvm/${SLOT}/bin/${i}-${clang_version}"
338                 dosym "${i}-${clang_version}" "/usr/lib/llvm/${SLOT}/bin/${i}"
339         done
340
341         # now create target symlinks for all supported ABIs
342         for abi in $(get_all_abis); do
343                 local abi_chost=$(get_abi_CHOST "${abi}")
344                 for i in "${clang_tools[@]}"; do
345                         dosym "${i}-${clang_version}" \
346                                 "/usr/lib/llvm/${SLOT}/bin/${abi_chost}-${i}-${clang_version}"
347                         dosym "${abi_chost}-${i}-${clang_version}" \
348                                 "/usr/lib/llvm/${SLOT}/bin/${abi_chost}-${i}"
349                 done
350         done
351
352         # Remove unnecessary headers on FreeBSD, bug #417171
353         if use kernel_FreeBSD; then
354                 rm "${ED}"/usr/lib/clang/${clang_full_version}/include/{std,float,iso,limits,tgmath,varargs}*.h || die
355         fi
356 }
357
358 multilib_src_install() {
359         DESTDIR=${D} cmake-utils_src_make install-distribution
360
361         # move headers to /usr/include for wrapping & ABI mismatch checks
362         # (also drop the version suffix from runtime headers)
363         rm -rf "${ED}"/usr/include || die
364         mv "${ED}"/usr/lib/llvm/${SLOT}/include "${ED}"/usr/include || die
365         mv "${ED}"/usr/lib/llvm/${SLOT}/$(get_libdir)/clang "${ED}"/usr/include/clangrt || die
366 }
367
368 multilib_src_install_all() {
369         python_fix_shebang "${ED}"
370         if use static-analyzer; then
371                 python_optimize "${ED}"/usr/lib/llvm/${SLOT}/share/scan-view
372         fi
373
374         docompress "/usr/lib/llvm/${SLOT}/share/man"
375         # match 'html' non-compression
376         use doc && docompress -x "/usr/share/doc/${PF}/tools-extra"
377         # +x for some reason; TODO: investigate
378         use static-analyzer && fperms a-x "/usr/lib/llvm/${SLOT}/share/man/man1/scan-build.1"
379 }
380
381 pkg_postinst() {
382         if [[ -z ${ROOT} && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]] ; then
383                 eselect compiler-shadow update all
384         fi
385
386         elog "You can find additional utility scripts in:"
387         elog "  ${EROOT}/usr/lib/llvm/${SLOT}/share/clang"
388         elog "Some of them are vim integration scripts (with instructions inside)."
389         elog "The run-clang-tidy.py script requires the following additional package:"
390         elog "  dev-python/pyyaml"
391 }
392
393 pkg_postrm() {
394         if [[ -z ${ROOT} && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]] ; then
395                 eselect compiler-shadow clean all
396         fi
397 }