llvm-core/clang/clang-15.0.7-r4.ebuild
changeset 52 a005dcda4775
equal deleted inserted replaced
51:fd2f8bf4c8c6 52:a005dcda4775
       
     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 }