clang-8.0.1.ebuild (10205B)
1 # Copyright 1999-2019 Gentoo Authors 2 # Distributed under the terms of the GNU General Public License v2 3 4 EAPI=6 5 6 : ${CMAKE_MAKEFILE_GENERATOR:=ninja} 7 # (needed due to CMAKE_BUILD_TYPE != Gentoo) 8 CMAKE_MIN_VERSION=3.7.0-r1 9 _PYTHON_ALLOW_PY27=1 10 PYTHON_COMPAT=( python2_7 ) 11 12 inherit cmake-utils eapi7-ver flag-o-matic llvm \ 13 multilib-minimal multiprocessing pax-utils prefix python-single-r1 \ 14 toolchain-funcs 15 16 MY_P=cfe-${PV/_/}.src 17 EXTRA_P=clang-tools-extra-${PV/_/}.src 18 LLVM_P=llvm-${PV/_/}.src 19 20 DESCRIPTION="C language family frontend for LLVM" 21 HOMEPAGE="https://llvm.org/" 22 SRC_URI="https://github.com/llvm/llvm-project/releases/download/llvmorg-${PV}/${MY_P}.tar.xz 23 https://github.com/llvm/llvm-project/releases/download/llvmorg-${PV}/${EXTRA_P}.tar.xz 24 test? ( https://github.com/llvm/llvm-project/releases/download/llvmorg-${PV}/${LLVM_P}.tar.xz ) 25 !doc? ( https://dev.gentoo.org/~mgorny/dist/llvm/llvm-${PV}-manpages.tar.bz2 )" 26 27 # Keep in sync with sys-devel/llvm 28 ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM BPF Hexagon Lanai Mips MSP430 29 NVPTX PowerPC Sparc SystemZ WebAssembly X86 XCore ) 30 ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) 31 LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/?} 32 33 LICENSE="UoI-NCSA" 34 SLOT="$(ver_cut 1)" 35 KEYWORDS="amd64 arm arm64 ppc64 x86 ~amd64-linux ~ppc-macos ~x64-macos ~x86-macos" 36 IUSE="debug default-compiler-rt default-libcxx doc +static-analyzer 37 test xml z3 kernel_FreeBSD ${ALL_LLVM_TARGETS[*]}" 38 RESTRICT="!test? ( test )" 39 40 RDEPEND=" 41 ~sys-devel/llvm-${PV}:${SLOT}=[debug=,${LLVM_TARGET_USEDEPS// /,},${MULTILIB_USEDEP}] 42 static-analyzer? ( 43 dev-lang/perl:* 44 z3? ( >=sci-mathematics/z3-4.7.1:0=[${MULTILIB_USEDEP}] ) 45 ) 46 xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] ) 47 dev-lang/python:2.7 48 " 49 DEPEND="${RDEPEND} 50 doc? ( dev-python/sphinx ) 51 xml? ( virtual/pkgconfig ) 52 dev-lang/python:2.7 53 " 54 RDEPEND="${RDEPEND} 55 !<sys-devel/llvm-4.0.0_rc:0 56 !sys-devel/clang:0" 57 PDEPEND=" 58 sys-devel/clang-common 59 ~sys-devel/clang-runtime-${PV} 60 default-compiler-rt? ( =sys-libs/compiler-rt-${PV%_*}* ) 61 default-libcxx? ( >=sys-libs/libcxx-${PV} )" 62 63 REQUIRED_USE="${PYTHON_REQUIRED_USE} 64 || ( ${ALL_LLVM_TARGETS[*]} )" 65 66 # We need extra level of indirection for CLANG_RESOURCE_DIR 67 S=${WORKDIR}/x/y/${MY_P} 68 69 # least intrusive of all 70 CMAKE_BUILD_TYPE=RelWithDebInfo 71 72 PATCHES=( 73 # add Prefix include paths for Darwin 74 "${FILESDIR}"/8.0.1/darwin_prefix-include-paths.patch 75 "${FILESDIR}/clang-8.0-u3.patch" 76 ) 77 78 # Multilib notes: 79 # 1. ABI_* flags control ABIs libclang* is built for only. 80 # 2. clang is always capable of compiling code for all ABIs for enabled 81 # target. However, you will need appropriate crt* files (installed 82 # e.g. by sys-devel/gcc and sys-libs/glibc). 83 # 3. ${CHOST}-clang wrappers are always installed for all ABIs included 84 # in the current profile (i.e. alike supported by sys-devel/gcc). 85 # 86 # Therefore: use sys-devel/clang[${MULTILIB_USEDEP}] only if you need 87 # multilib clang* libraries (not runtime, not wrappers). 88 89 pkg_setup() { 90 LLVM_MAX_SLOT=${SLOT} llvm_pkg_setup 91 python-single-r1_pkg_setup 92 } 93 94 src_unpack() { 95 # create extra parent dir for CLANG_RESOURCE_DIR 96 mkdir -p x/y || die 97 cd x/y || die 98 99 einfo "Unpacking ${MY_P}.tar.xz ..." 100 tar -xf "${DISTDIR}/${MY_P}.tar.xz" || die 101 einfo "Unpacking ${EXTRA_P}.tar.xz ..." 102 tar -xf "${DISTDIR}/${EXTRA_P}.tar.xz" || die 103 104 mv "${EXTRA_P}" "${S}"/tools/extra || die 105 if use test; then 106 einfo "Unpacking parts of ${LLVM_P}.tar.xz ..." 107 tar -xf "${DISTDIR}/${LLVM_P}.tar.xz" \ 108 "${LLVM_P}"/lib/Testing/Support \ 109 "${LLVM_P}"/utils/{lit,llvm-lit,unittest} || die 110 mv "${LLVM_P}" "${WORKDIR}"/llvm || die 111 fi 112 113 if ! use doc; then 114 einfo "Unpacking llvm-${PV}-manpages.tar.bz2 ..." 115 tar -xf "${DISTDIR}/llvm-${PV}-manpages.tar.bz2" || die 116 fi 117 } 118 119 src_prepare() { 120 cmake-utils_src_prepare 121 eprefixify lib/Frontend/InitHeaderSearch.cpp 122 } 123 124 multilib_src_configure() { 125 local llvm_version=$(llvm-config --version) || die 126 local clang_version=$(ver_cut 1-3 "${llvm_version}") 127 128 local mycmakeargs=( 129 # ensure that the correct llvm-config is used 130 -DLLVM_CONFIG="$(type -P "${CHOST}-llvm-config")" 131 -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm/${SLOT}" 132 -DCMAKE_INSTALL_MANDIR="${EPREFIX}/usr/lib/llvm/${SLOT}/share/man" 133 # relative to bindir 134 -DCLANG_RESOURCE_DIR="../../../../lib/clang/${clang_version}" 135 136 -DBUILD_SHARED_LIBS=ON 137 -DLLVM_TARGETS_TO_BUILD="${LLVM_TARGETS// /;}" 138 -DLLVM_BUILD_TESTS=$(usex test) 139 140 # these are not propagated reliably, so redefine them 141 -DLLVM_ENABLE_EH=ON 142 -DLLVM_ENABLE_RTTI=ON 143 144 -DCMAKE_DISABLE_FIND_PACKAGE_LibXml2=$(usex !xml) 145 # libgomp support fails to find headers without explicit -I 146 # furthermore, it provides only syntax checking 147 -DCLANG_DEFAULT_OPENMP_RUNTIME=libomp 148 149 # override default stdlib and rtlib 150 -DCLANG_DEFAULT_CXX_STDLIB=$(usex default-libcxx libc++ "") 151 -DCLANG_DEFAULT_RTLIB=$(usex default-compiler-rt compiler-rt "") 152 153 -DCLANG_ENABLE_ARCMT=$(usex static-analyzer) 154 -DCLANG_ENABLE_STATIC_ANALYZER=$(usex static-analyzer) 155 # z3 is not multilib-friendly 156 -DCLANG_ANALYZER_ENABLE_Z3_SOLVER=$(usex z3) 157 ) 158 use test && mycmakeargs+=( 159 -DLLVM_MAIN_SRC_DIR="${WORKDIR}/llvm" 160 -DLLVM_LIT_ARGS="-vv;-j;${LIT_JOBS:-$(makeopts_jobs "${MAKEOPTS}" "$(get_nproc)")}" 161 ) 162 163 if multilib_is_native_abi; then 164 mycmakeargs+=( 165 # normally copied from LLVM_INCLUDE_DOCS but the latter 166 # is lacking value in stand-alone builds 167 -DCLANG_INCLUDE_DOCS=$(usex doc) 168 -DCLANG_TOOLS_EXTRA_INCLUDE_DOCS=$(usex doc) 169 ) 170 use doc && mycmakeargs+=( 171 -DLLVM_BUILD_DOCS=ON 172 -DLLVM_ENABLE_SPHINX=ON 173 -DCLANG_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/html" 174 -DCLANG-TOOLS_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/tools-extra" 175 -DSPHINX_WARNINGS_AS_ERRORS=OFF 176 ) 177 use z3 && mycmakeargs+=( 178 -DZ3_INCLUDE_DIR="${EPREFIX}/usr/include/z3" 179 ) 180 else 181 mycmakeargs+=( 182 -DLLVM_TOOL_CLANG_TOOLS_EXTRA_BUILD=OFF 183 ) 184 fi 185 186 if [[ -n ${EPREFIX} ]]; then 187 mycmakeargs+=( 188 -DGCC_INSTALL_PREFIX="${EPREFIX}/usr" 189 ) 190 fi 191 192 if tc-is-cross-compiler; then 193 [[ -x "/usr/bin/clang-tblgen" ]] \ 194 || die "/usr/bin/clang-tblgen not found or usable" 195 mycmakeargs+=( 196 -DCMAKE_CROSSCOMPILING=ON 197 -DCLANG_TABLEGEN=/usr/bin/clang-tblgen 198 ) 199 fi 200 201 # LLVM_ENABLE_ASSERTIONS=NO does not guarantee this for us, #614844 202 use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG" 203 cmake-utils_src_configure 204 } 205 206 multilib_src_compile() { 207 cmake-utils_src_compile 208 209 # provide a symlink for tests 210 if [[ ! -L ${WORKDIR}/lib/clang ]]; then 211 mkdir -p "${WORKDIR}"/lib || die 212 ln -s "${BUILD_DIR}/$(get_libdir)/clang" "${WORKDIR}"/lib/clang || die 213 fi 214 } 215 216 multilib_src_test() { 217 # respect TMPDIR! 218 local -x LIT_PRESERVES_TMP=1 219 cmake-utils_src_make check-clang 220 multilib_is_native_abi && cmake-utils_src_make check-clang-tools 221 } 222 223 src_install() { 224 MULTILIB_WRAPPED_HEADERS=( 225 /usr/include/clang/Config/config.h 226 ) 227 228 multilib-minimal_src_install 229 230 # Move runtime headers to /usr/lib/clang, where they belong 231 mv "${ED%/}"/usr/include/clangrt "${ED%/}"/usr/lib/clang || die 232 # move (remaining) wrapped headers back 233 mv "${ED%/}"/usr/include "${ED%/}"/usr/lib/llvm/${SLOT}/include || die 234 235 # Apply CHOST and version suffix to clang tools 236 # note: we use two version components here (vs 3 in runtime path) 237 local llvm_version=$(llvm-config --version) || die 238 local clang_version=$(ver_cut 1 "${llvm_version}") 239 local clang_full_version=$(ver_cut 1-3 "${llvm_version}") 240 local clang_tools=( clang clang++ clang-cl clang-cpp ) 241 local abi i 242 243 # cmake gives us: 244 # - clang-X 245 # - clang -> clang-X 246 # - clang++, clang-cl, clang-cpp -> clang 247 # we want to have: 248 # - clang-X 249 # - clang++-X, clang-cl-X, clang-cpp-X -> clang-X 250 # - clang, clang++, clang-cl, clang-cpp -> clang*-X 251 # also in CHOST variant 252 for i in "${clang_tools[@]:1}"; do 253 rm "${ED%/}/usr/lib/llvm/${SLOT}/bin/${i}" || die 254 dosym "clang-${clang_version}" "/usr/lib/llvm/${SLOT}/bin/${i}-${clang_version}" 255 dosym "${i}-${clang_version}" "/usr/lib/llvm/${SLOT}/bin/${i}" 256 done 257 258 # now create target symlinks for all supported ABIs 259 for abi in $(get_all_abis); do 260 local abi_chost=$(get_abi_CHOST "${abi}") 261 for i in "${clang_tools[@]}"; do 262 dosym "${i}-${clang_version}" \ 263 "/usr/lib/llvm/${SLOT}/bin/${abi_chost}-${i}-${clang_version}" 264 dosym "${abi_chost}-${i}-${clang_version}" \ 265 "/usr/lib/llvm/${SLOT}/bin/${abi_chost}-${i}" 266 done 267 done 268 269 # Remove unnecessary headers on FreeBSD, bug #417171 270 if use kernel_FreeBSD; then 271 rm "${ED}"usr/lib/clang/${clang_full_version}/include/{std,float,iso,limits,tgmath,varargs}*.h || die 272 fi 273 } 274 275 multilib_src_install() { 276 cmake-utils_src_install 277 278 # move headers to /usr/include for wrapping & ABI mismatch checks 279 # (also drop the version suffix from runtime headers) 280 rm -rf "${ED%/}"/usr/include || die 281 mv "${ED%/}"/usr/lib/llvm/${SLOT}/include "${ED%/}"/usr/include || die 282 mv "${ED%/}"/usr/lib/llvm/${SLOT}/$(get_libdir)/clang "${ED%/}"/usr/include/clangrt || die 283 } 284 285 multilib_src_install_all() { 286 python_fix_shebang "${ED}" 287 if use static-analyzer; then 288 python_optimize "${ED}"usr/lib/llvm/${SLOT}/share/scan-view 289 fi 290 291 # install pre-generated manpages 292 if ! use doc; then 293 insinto "/usr/lib/llvm/${SLOT}/share/man/man1" 294 doins "${WORKDIR}/x/y/llvm-${PV}-manpages/clang"/*.1 295 fi 296 297 docompress "/usr/lib/llvm/${SLOT}/share/man" 298 # match 'html' non-compression 299 use doc && docompress -x "/usr/share/doc/${PF}/tools-extra" 300 # +x for some reason; TODO: investigate 301 use static-analyzer && fperms a-x "/usr/lib/llvm/${SLOT}/share/man/man1/scan-build.1" 302 } 303 304 pkg_postinst() { 305 if [[ ${ROOT} == / && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]] ; then 306 eselect compiler-shadow update all 307 fi 308 309 elog "You can find additional utility scripts in:" 310 elog " ${EROOT}/usr/lib/llvm/${SLOT}/share/clang" 311 elog "To use these scripts, you will need Python 2.7. Some of them are vim" 312 elog "integration scripts (with instructions inside). The run-clang-tidy.py" 313 elog "scripts requires the following additional package:" 314 elog " dev-python/pyyaml" 315 } 316 317 pkg_postrm() { 318 if [[ ${ROOT} == / && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]] ; then 319 eselect compiler-shadow clean all 320 fi 321 }