| # Copyright 1999-2019 Gentoo Authors |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| EAPI=6 |
| |
| : ${CMAKE_MAKEFILE_GENERATOR:=ninja} |
| # (needed due to CMAKE_BUILD_TYPE != Gentoo) |
| CMAKE_MIN_VERSION=3.7.0-r1 |
| PYTHON_COMPAT=( python2_7 ) |
| |
| inherit cmake-utils flag-o-matic multilib-minimal \ |
| multiprocessing pax-utils python-any-r1 toolchain-funcs eapi7-ver |
| |
| MY_P=${P}.src |
| DESCRIPTION="Low Level Virtual Machine" |
| HOMEPAGE="https://llvm.org/" |
| SRC_URI="https://github.com/llvm/llvm-project/releases/download/llvmorg-${PV}/${MY_P}.tar.xz |
| !doc? ( https://dev.gentoo.org/~mgorny/dist/llvm/${P}-manpages.tar.bz2 )" |
| |
| # Keep in sync with CMakeLists.txt |
| ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM BPF Hexagon Lanai Mips MSP430 |
| NVPTX PowerPC Sparc SystemZ WebAssembly X86 XCore ) |
| ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) |
| |
| # Additional licenses: |
| # 1. OpenBSD regex: Henry Spencer's license ('rc' in Gentoo) + BSD. |
| # 2. ARM backend: LLVM Software Grant by ARM. |
| # 3. MD5 code: public-domain. |
| # 4. Tests (not installed): |
| # a. gtest: BSD. |
| # b. YAML tests: MIT. |
| |
| LICENSE="UoI-NCSA rc BSD public-domain |
| llvm_targets_ARM? ( LLVM-Grant )" |
| SLOT="$(ver_cut 1)" |
| KEYWORDS="*" |
| IUSE="debug doc exegesis gold libedit +libffi ncurses test tools xar xml |
| kernel_Darwin ${ALL_LLVM_TARGETS[*]}" |
| RESTRICT="!test? ( test )" |
| |
| RDEPEND=" |
| sys-libs/zlib:0= |
| exegesis? ( dev-libs/libpfm:= ) |
| gold? ( |
| || ( |
| >=sys-devel/binutils-2.31.1-r4:*[plugins] |
| <sys-devel/binutils-2.31.1-r4:*[cxx] |
| ) |
| ) |
| libedit? ( dev-libs/libedit:0=[${MULTILIB_USEDEP}] ) |
| libffi? ( >=virtual/libffi-3.0.13-r1:0=[${MULTILIB_USEDEP}] ) |
| ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[${MULTILIB_USEDEP}] ) |
| xar? ( app-arch/xar ) |
| xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] )" |
| # configparser-3.2 breaks the build (3.3 or none at all are fine) |
| DEPEND="${RDEPEND} |
| dev-lang/perl |
| || ( >=sys-devel/gcc-3.0 >=sys-devel/llvm-3.5 |
| ( >=sys-freebsd/freebsd-lib-9.1-r10 sys-libs/libcxx ) |
| ) |
| kernel_Darwin? ( |
| <sys-libs/libcxx-$(ver_cut 1-3).9999 |
| >=sys-devel/binutils-apple-5.1 |
| ) |
| doc? ( $(python_gen_any_dep ' |
| dev-python/recommonmark[${PYTHON_USEDEP}] |
| dev-python/sphinx[${PYTHON_USEDEP}] |
| ') ) |
| !doc? ( ${PYTHON_DEPS} ) |
| gold? ( sys-libs/binutils-libs ) |
| libffi? ( virtual/pkgconfig ) |
| !!<dev-python/configparser-3.3.0.2 |
| ${PYTHON_DEPS}" |
| # Note: Gentoo supports multiple SLOTs of llvm, but we don't currently for the board. |
| # Force older versions to be removed first. |
| RDEPEND="${RDEPEND} |
| !<sys-devel/llvm-${SLOT}" |
| PDEPEND="sys-devel/llvm-common |
| gold? ( sys-devel/llvmgold )" |
| |
| REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} )" |
| |
| S=${WORKDIR}/${MY_P} |
| |
| HOST_DIR="${WORKDIR}/${PF}-${CBUILD}" |
| |
| # least intrusive of all |
| CMAKE_BUILD_TYPE=RelWithDebInfo |
| |
| python_check_deps() { |
| use doc || return 0 |
| |
| has_version "dev-python/recommonmark[${PYTHON_USEDEP}]" && |
| has_version "dev-python/sphinx[${PYTHON_USEDEP}]" |
| } |
| |
| src_prepare() { |
| # Fix llvm-config for shared linking and sane flags |
| # https://bugs.gentoo.org/show_bug.cgi?id=565358 |
| eapply "${FILESDIR}"/9999/0007-llvm-config-Clean-up-exported-values-update-for-shar.patch |
| |
| # Vulkan hang fix with AMDGPU, can be removed when upreving to >= 10.0 |
| eapply "${FILESDIR}"/cherry/5f6fec2404c5135247ae9e4e515e8d9d3242f790.patch |
| |
| # disable use of SDK on OSX, bug #568758 |
| sed -i -e 's/xcrun/false/' utils/lit/lit/util.py || die |
| |
| # User patches + QA |
| eapply_user |
| } |
| |
| # Is LLVM being linked against libc++? |
| is_libcxx_linked() { |
| local code='#include <ciso646> |
| #if defined(_LIBCPP_VERSION) |
| HAVE_LIBCXX |
| #endif |
| ' |
| local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 |
| |
| [[ ${out} == *HAVE_LIBCXX* ]] |
| } |
| |
| build_host_tools() { |
| # Use host toolchain when building for the host. |
| local CC=clang |
| local CXX=clang++ |
| local CFLAGS='' |
| local CXXFLAGS='' |
| local LDFLAGS='' |
| mkdir -p "${HOST_DIR}" || die |
| cd "${HOST_DIR}" || die |
| cmake "${@}" -G "Unix Makefiles" "${S}" || die |
| cd "${HOST_DIR}/utils/TableGen" || die |
| emake |
| cd "${HOST_DIR}/tools/llvm-config" || die |
| emake |
| } |
| |
| multilib_src_configure() { |
| local ffi_cflags ffi_ldflags |
| if use libffi; then |
| ffi_cflags=$($(tc-getPKG_CONFIG) --cflags-only-I libffi) |
| ffi_ldflags=$($(tc-getPKG_CONFIG) --libs-only-L libffi) |
| fi |
| |
| local libdir=$(get_libdir) |
| local mycmakeargs=( |
| # disable appending VCS revision to the version to improve |
| # direct cache hit ratio |
| -DLLVM_APPEND_VC_REV=OFF |
| -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm" |
| -DLLVM_LIBDIR_SUFFIX=${libdir#lib} |
| |
| -DLLVM_TARGETS_TO_BUILD="${LLVM_TARGETS// /;}" |
| -DLLVM_BUILD_TESTS=$(usex test) |
| -DLLVM_BUILD_TOOLS=$(usex tools) |
| |
| -DLLVM_ENABLE_FFI=$(usex libffi) |
| -DLLVM_ENABLE_LIBEDIT=$(usex libedit) |
| -DLLVM_ENABLE_TERMINFO=$(usex ncurses) |
| -DLLVM_ENABLE_LIBXML2=$(usex xml) |
| -DLLVM_ENABLE_ASSERTIONS=$(usex debug) |
| -DLLVM_ENABLE_LIBPFM=$(usex exegesis) |
| -DLLVM_ENABLE_EH=ON |
| -DLLVM_ENABLE_RTTI=ON |
| |
| -DWITH_POLLY=OFF # TODO |
| |
| -DLLVM_HOST_TRIPLE="${CHOST}" |
| |
| -DFFI_INCLUDE_DIR="${ffi_cflags#-I}" |
| -DFFI_LIBRARY_DIR="${ffi_ldflags#-L}" |
| # used only for llvm-objdump tool |
| -DHAVE_LIBXAR=$(multilib_native_usex xar 1 0) |
| |
| # disable OCaml bindings (now in dev-ml/llvm-ocaml) |
| -DOCAMLFIND=NO |
| ) |
| |
| if is_libcxx_linked; then |
| # Smart hack: alter version suffix -> SOVERSION when linking |
| # against libc++. This way we won't end up mixing LLVM libc++ |
| # libraries with libstdc++ clang, and the other way around. |
| mycmakeargs+=( |
| -DLLVM_VERSION_SUFFIX="libcxx" |
| ) |
| fi |
| |
| # Note: go bindings have no CMake rules at the moment |
| # but let's kill the check in case they are introduced |
| # if ! multilib_is_native_abi || ! use go; then |
| mycmakeargs+=( |
| -DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND |
| ) |
| # fi |
| |
| use test && mycmakeargs+=( |
| -DLLVM_LIT_ARGS="-vv;-j;${LIT_JOBS:-$(makeopts_jobs "${MAKEOPTS}" "$(get_nproc)")}" |
| ) |
| |
| if multilib_is_native_abi; then |
| mycmakeargs+=( |
| -DLLVM_BUILD_DOCS=$(usex doc) |
| -DLLVM_ENABLE_OCAMLDOC=OFF |
| -DLLVM_ENABLE_SPHINX=$(usex doc) |
| -DLLVM_ENABLE_DOXYGEN=OFF |
| -DLLVM_INSTALL_UTILS=ON |
| ) |
| use doc && mycmakeargs+=( |
| -DCMAKE_INSTALL_MANDIR="${EPREFIX}/usr/lib/llvm/share/man" |
| -DLLVM_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/html" |
| -DSPHINX_WARNINGS_AS_ERRORS=OFF |
| ) |
| use gold && mycmakeargs+=( |
| -DLLVM_BINUTILS_INCDIR="${EPREFIX}"/usr/include |
| ) |
| fi |
| |
| if tc-is-cross-compiler; then |
| # Force LLVM_BUILD_TOOLS=ON to ensure build_host_tools builds |
| # llvm-config |
| build_host_tools "${mycmakeargs[@]}" -DLLVM_BUILD_TOOLS=ON |
| # die early if the build tools are not installed |
| [[ -x "${HOST_DIR}/bin/llvm-tblgen" ]] \ |
| || die "${HOST_DIR}/bin/llvm-tblgen not found or usable" |
| mycmakeargs+=( |
| -DCMAKE_CROSSCOMPILING=ON |
| -DLLVM_TABLEGEN="${HOST_DIR}/bin/llvm-tblgen" |
| ) |
| fi |
| |
| # workaround BMI bug in gcc-7 (fixed in 7.4) |
| # https://bugs.gentoo.org/649880 |
| # apply only to x86, https://bugs.gentoo.org/650506 |
| if tc-is-gcc && [[ ${MULTILIB_ABI_FLAG} == abi_x86* ]] && |
| [[ $(gcc-major-version) -eq 7 && $(gcc-minor-version) -lt 4 ]] |
| then |
| local CFLAGS="${CFLAGS} -mno-bmi" |
| local CXXFLAGS="${CXXFLAGS} -mno-bmi" |
| fi |
| |
| # LLVM_ENABLE_ASSERTIONS=NO does not guarantee this for us, #614844 |
| use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG" |
| cmake-utils_src_configure |
| } |
| |
| multilib_src_compile() { |
| cmake-utils_src_compile |
| |
| pax-mark m "${BUILD_DIR}"/bin/llvm-rtdyld |
| pax-mark m "${BUILD_DIR}"/bin/lli |
| pax-mark m "${BUILD_DIR}"/bin/lli-child-target |
| |
| if use test; then |
| pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/Orc/OrcJITTests |
| pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/MCJIT/MCJITTests |
| pax-mark m "${BUILD_DIR}"/unittests/Support/SupportTests |
| fi |
| } |
| |
| multilib_src_test() { |
| # respect TMPDIR! |
| local -x LIT_PRESERVES_TMP=1 |
| cmake-utils_src_make check |
| } |
| |
| src_install() { |
| local MULTILIB_CHOST_TOOLS=() |
| |
| if use tools; then |
| MULTILIB_CHOST_TOOLS+=( |
| /usr/lib/llvm/bin/llvm-config |
| ) |
| fi |
| |
| local MULTILIB_WRAPPED_HEADERS=( |
| /usr/include/llvm/Config/llvm-config.h |
| ) |
| |
| local LLVM_LDPATHS=() |
| multilib-minimal_src_install |
| |
| # move wrapped headers back |
| mv "${ED%/}"/usr/include "${ED%/}"/usr/lib/llvm/include || die |
| # llvm-config --includedir and --libdir print output based on where |
| # llvm-config itself is located. So to get an includedir of |
| # .../usr/lib/llvm/include, llvm-config needs to be in |
| # .../usr/lib/llvm/bin. |
| mv "${HOST_DIR}"/bin/llvm-config "${ED%/}"/usr/lib/llvm/bin/llvm-config-host || die |
| } |
| |
| multilib_src_install() { |
| cmake-utils_src_install |
| |
| # move headers to /usr/include for wrapping |
| rm -rf "${ED%/}"/usr/include || die |
| mv "${ED%/}"/usr/lib/llvm/include "${ED%/}"/usr/include || die |
| |
| LLVM_LDPATHS+=( "${EPREFIX}/usr/lib/llvm/$(get_libdir)" ) |
| } |
| |
| multilib_src_install_all() { |
| local revord=$(( 9999 - ${SLOT} )) |
| newenvd - "10llvm-${revord}" <<-_EOF_ |
| PATH="${EPREFIX}/usr/lib/llvm/bin" |
| # we need to duplicate it in ROOTPATH for Portage to respect... |
| ROOTPATH="${EPREFIX}/usr/lib/llvm/bin" |
| MANPATH="${EPREFIX}/usr/lib/llvm/share/man" |
| LDPATH="$( IFS=:; echo "${LLVM_LDPATHS[*]}" )" |
| _EOF_ |
| |
| # install pre-generated manpages |
| if ! use doc; then |
| # (doman does not support custom paths) |
| insinto "/usr/lib/llvm/share/man/man1" |
| doins "${WORKDIR}/${P}-manpages/llvm"/*.1 |
| fi |
| |
| docompress "/usr/lib/llvm/share/man" |
| } |
| |
| pkg_postinst() { |
| elog "You can find additional opt-viewer utility scripts in:" |
| elog " ${EROOT}/usr/lib/llvm/share/opt-viewer" |
| elog "To use these scripts, you will need Python 2.7 along with the following" |
| elog "packages:" |
| elog " dev-python/pygments (for opt-viewer)" |
| elog " dev-python/pyyaml (for all of them)" |
| } |