llvm-8.0.1.ebuild (8464B)
1 # Copyright 1999-2020 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_COMPAT=( python2_7 ) 10 11 inherit cmake-utils eapi7-ver flag-o-matic multilib-minimal \ 12 multiprocessing pax-utils python-any-r1 toolchain-funcs 13 14 MY_P=${P}.src 15 DESCRIPTION="Low Level Virtual Machine" 16 HOMEPAGE="https://llvm.org/" 17 SRC_URI="https://github.com/llvm/llvm-project/releases/download/llvmorg-${PV}/${MY_P}.tar.xz 18 !doc? ( https://dev.gentoo.org/~mgorny/dist/llvm/${P}-manpages.tar.bz2 )" 19 20 # Keep in sync with CMakeLists.txt 21 ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM BPF Hexagon Lanai Mips MSP430 22 NVPTX PowerPC Sparc SystemZ WebAssembly X86 XCore ) 23 ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) 24 25 # Additional licenses: 26 # 1. OpenBSD regex: Henry Spencer's license ('rc' in Gentoo) + BSD. 27 # 2. ARM backend: LLVM Software Grant by ARM. 28 # 3. MD5 code: public-domain. 29 # 4. Tests (not installed): 30 # a. gtest: BSD. 31 # b. YAML tests: MIT. 32 33 LICENSE="UoI-NCSA rc BSD public-domain 34 llvm_targets_ARM? ( LLVM-Grant )" 35 SLOT="$(ver_cut 1)" 36 KEYWORDS="amd64 arm arm64 ppc64 x86 ~amd64-linux ~ppc-macos ~x64-macos ~x86-macos" 37 IUSE="debug doc exegesis gold libedit +libffi ncurses test xar xml 38 kernel_Darwin ${ALL_LLVM_TARGETS[*]}" 39 RESTRICT="!test? ( test )" 40 41 RDEPEND=" 42 sys-libs/zlib:0=[${MULTILIB_USEDEP}] 43 exegesis? ( dev-libs/libpfm:= ) 44 gold? ( 45 || ( 46 >=sys-devel/binutils-2.31.1-r4:*[plugins] 47 <sys-devel/binutils-2.31.1-r4:*[cxx] 48 ) 49 ) 50 libedit? ( dev-libs/libedit:0=[${MULTILIB_USEDEP}] ) 51 libffi? ( >=dev-libs/libffi-3.0.13-r1:0=[${MULTILIB_USEDEP}] ) 52 ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[${MULTILIB_USEDEP}] ) 53 xar? ( app-arch/xar ) 54 xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] )" 55 DEPEND="${RDEPEND} 56 dev-lang/perl 57 kernel_Darwin? ( 58 <sys-libs/libcxx-$(ver_cut 1-3).9999 59 >=sys-devel/binutils-apple-5.1 60 ) 61 doc? ( $(python_gen_any_dep ' 62 dev-python/recommonmark[${PYTHON_USEDEP}] 63 dev-python/sphinx[${PYTHON_USEDEP}] 64 ') ) 65 !doc? ( ${PYTHON_DEPS} ) 66 gold? ( sys-libs/binutils-libs ) 67 libffi? ( virtual/pkgconfig ) 68 ${PYTHON_DEPS}" 69 # There are no file collisions between these versions but having :0 70 # installed means llvm-config there will take precedence. 71 RDEPEND="${RDEPEND} 72 !sys-devel/llvm:0" 73 PDEPEND="sys-devel/llvm-common 74 gold? ( >=sys-devel/llvmgold-${SLOT} )" 75 76 REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} )" 77 78 S=${WORKDIR}/${MY_P} 79 80 # least intrusive of all 81 CMAKE_BUILD_TYPE=RelWithDebInfo 82 83 python_check_deps() { 84 use doc || return 0 85 86 has_version "dev-python/recommonmark[${PYTHON_USEDEP}]" && 87 has_version "dev-python/sphinx[${PYTHON_USEDEP}]" 88 } 89 90 src_prepare() { 91 # Fix llvm-config for shared linking and sane flags 92 # https://bugs.gentoo.org/show_bug.cgi?id=565358 93 eapply "${FILESDIR}"/9999/0007-llvm-config-Clean-up-exported-values-update-for-shar.patch 94 95 eapply "${FILESDIR}/llvm-8.0-u3.patch" 96 97 # disable use of SDK on OSX, bug #568758 98 sed -i -e 's/xcrun/false/' utils/lit/lit/util.py || die 99 100 # User patches + QA 101 cmake-utils_src_prepare 102 } 103 104 # Is LLVM being linked against libc++? 105 is_libcxx_linked() { 106 local code='#include <ciso646> 107 #if defined(_LIBCPP_VERSION) 108 HAVE_LIBCXX 109 #endif 110 ' 111 local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 112 113 [[ ${out} == *HAVE_LIBCXX* ]] 114 } 115 116 multilib_src_configure() { 117 local ffi_cflags ffi_ldflags 118 if use libffi; then 119 ffi_cflags=$($(tc-getPKG_CONFIG) --cflags-only-I libffi) 120 ffi_ldflags=$($(tc-getPKG_CONFIG) --libs-only-L libffi) 121 fi 122 123 local libdir=$(get_libdir) 124 local mycmakeargs=( 125 # disable appending VCS revision to the version to improve 126 # direct cache hit ratio 127 -DLLVM_APPEND_VC_REV=OFF 128 -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm/${SLOT}" 129 -DLLVM_LIBDIR_SUFFIX=${libdir#lib} 130 131 -DBUILD_SHARED_LIBS=ON 132 -DLLVM_TARGETS_TO_BUILD="${LLVM_TARGETS// /;}" 133 -DLLVM_BUILD_TESTS=$(usex test) 134 135 -DLLVM_ENABLE_FFI=$(usex libffi) 136 -DLLVM_ENABLE_LIBEDIT=$(usex libedit) 137 -DLLVM_ENABLE_TERMINFO=$(usex ncurses) 138 -DLLVM_ENABLE_LIBXML2=$(usex xml) 139 -DLLVM_ENABLE_ASSERTIONS=$(usex debug) 140 -DLLVM_ENABLE_LIBPFM=$(usex exegesis) 141 -DLLVM_ENABLE_EH=ON 142 -DLLVM_ENABLE_RTTI=ON 143 144 -DWITH_POLLY=OFF # TODO 145 146 -DLLVM_HOST_TRIPLE="${CHOST}" 147 148 -DFFI_INCLUDE_DIR="${ffi_cflags#-I}" 149 -DFFI_LIBRARY_DIR="${ffi_ldflags#-L}" 150 # used only for llvm-objdump tool 151 -DHAVE_LIBXAR=$(multilib_native_usex xar 1 0) 152 153 # disable OCaml bindings (now in dev-ml/llvm-ocaml) 154 -DOCAMLFIND=NO 155 ) 156 157 if is_libcxx_linked; then 158 # Smart hack: alter version suffix -> SOVERSION when linking 159 # against libc++. This way we won't end up mixing LLVM libc++ 160 # libraries with libstdc++ clang, and the other way around. 161 mycmakeargs+=( 162 -DLLVM_VERSION_SUFFIX="libcxx" 163 ) 164 fi 165 166 # Note: go bindings have no CMake rules at the moment 167 # but let's kill the check in case they are introduced 168 # if ! multilib_is_native_abi || ! use go; then 169 mycmakeargs+=( 170 -DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND 171 ) 172 # fi 173 174 use test && mycmakeargs+=( 175 -DLLVM_LIT_ARGS="-vv;-j;${LIT_JOBS:-$(makeopts_jobs "${MAKEOPTS}" "$(get_nproc)")}" 176 ) 177 178 if multilib_is_native_abi; then 179 mycmakeargs+=( 180 -DLLVM_BUILD_DOCS=$(usex doc) 181 -DLLVM_ENABLE_OCAMLDOC=OFF 182 -DLLVM_ENABLE_SPHINX=$(usex doc) 183 -DLLVM_ENABLE_DOXYGEN=OFF 184 -DLLVM_INSTALL_UTILS=ON 185 ) 186 use doc && mycmakeargs+=( 187 -DCMAKE_INSTALL_MANDIR="${EPREFIX}/usr/lib/llvm/${SLOT}/share/man" 188 -DLLVM_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/html" 189 -DSPHINX_WARNINGS_AS_ERRORS=OFF 190 ) 191 use gold && mycmakeargs+=( 192 -DLLVM_BINUTILS_INCDIR="${EPREFIX}"/usr/include 193 ) 194 fi 195 196 if tc-is-cross-compiler; then 197 local tblgen="${EPREFIX}/usr/lib/llvm/${SLOT}/bin/llvm-tblgen" 198 [[ -x "${tblgen}" ]] \ 199 || die "${tblgen} not found or usable" 200 mycmakeargs+=( 201 -DCMAKE_CROSSCOMPILING=ON 202 -DLLVM_TABLEGEN="${tblgen}" 203 ) 204 fi 205 206 # workaround BMI bug in gcc-7 (fixed in 7.4) 207 # https://bugs.gentoo.org/649880 208 # apply only to x86, https://bugs.gentoo.org/650506 209 if tc-is-gcc && [[ ${MULTILIB_ABI_FLAG} == abi_x86* ]] && 210 [[ $(gcc-major-version) -eq 7 && $(gcc-minor-version) -lt 4 ]] 211 then 212 local CFLAGS="${CFLAGS} -mno-bmi" 213 local CXXFLAGS="${CXXFLAGS} -mno-bmi" 214 fi 215 216 # LLVM_ENABLE_ASSERTIONS=NO does not guarantee this for us, #614844 217 use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG" 218 cmake-utils_src_configure 219 } 220 221 multilib_src_compile() { 222 cmake-utils_src_compile 223 224 pax-mark m "${BUILD_DIR}"/bin/llvm-rtdyld 225 pax-mark m "${BUILD_DIR}"/bin/lli 226 pax-mark m "${BUILD_DIR}"/bin/lli-child-target 227 228 if use test; then 229 pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/Orc/OrcJITTests 230 pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/MCJIT/MCJITTests 231 pax-mark m "${BUILD_DIR}"/unittests/Support/SupportTests 232 fi 233 } 234 235 multilib_src_test() { 236 # respect TMPDIR! 237 local -x LIT_PRESERVES_TMP=1 238 cmake-utils_src_make check 239 } 240 241 src_install() { 242 local MULTILIB_CHOST_TOOLS=( 243 /usr/lib/llvm/${SLOT}/bin/llvm-config 244 ) 245 246 local MULTILIB_WRAPPED_HEADERS=( 247 /usr/include/llvm/Config/llvm-config.h 248 ) 249 250 local LLVM_LDPATHS=() 251 multilib-minimal_src_install 252 253 # move wrapped headers back 254 mv "${ED%/}"/usr/include "${ED%/}"/usr/lib/llvm/${SLOT}/include || die 255 } 256 257 multilib_src_install() { 258 cmake-utils_src_install 259 260 # move headers to /usr/include for wrapping 261 rm -rf "${ED%/}"/usr/include || die 262 mv "${ED%/}"/usr/lib/llvm/${SLOT}/include "${ED%/}"/usr/include || die 263 264 LLVM_LDPATHS+=( "${EPREFIX}/usr/lib/llvm/${SLOT}/$(get_libdir)" ) 265 } 266 267 multilib_src_install_all() { 268 local revord=$(( 9999 - ${SLOT} )) 269 newenvd - "60llvm-${revord}" <<-_EOF_ 270 PATH="${EPREFIX}/usr/lib/llvm/${SLOT}/bin" 271 # we need to duplicate it in ROOTPATH for Portage to respect... 272 ROOTPATH="${EPREFIX}/usr/lib/llvm/${SLOT}/bin" 273 MANPATH="${EPREFIX}/usr/lib/llvm/${SLOT}/share/man" 274 LDPATH="$( IFS=:; echo "${LLVM_LDPATHS[*]}" )" 275 _EOF_ 276 277 # install pre-generated manpages 278 if ! use doc; then 279 # (doman does not support custom paths) 280 insinto "/usr/lib/llvm/${SLOT}/share/man/man1" 281 doins "${WORKDIR}/${P}-manpages/llvm"/*.1 282 fi 283 284 docompress "/usr/lib/llvm/${SLOT}/share/man" 285 } 286 287 pkg_postinst() { 288 elog "You can find additional opt-viewer utility scripts in:" 289 elog " ${EROOT%/}/usr/lib/llvm/${SLOT}/share/opt-viewer" 290 elog "To use these scripts, you will need Python 2.7 along with the following" 291 elog "packages:" 292 elog " dev-python/pygments (for opt-viewer)" 293 elog " dev-python/pyyaml (for all of them)" 294 }