1# Copyright (C) 2017 Khem Raj <raj.khem@gmail.com> 2# Released under the MIT license (see COPYING.MIT for the terms) 3 4DESCRIPTION = "The LLVM Compiler Infrastructure" 5HOMEPAGE = "http://llvm.org" 6LICENSE = "Apache-2.0-with-LLVM-exception" 7SECTION = "devel" 8 9LIC_FILES_CHKSUM = "file://LICENSE.TXT;md5=8a15a0759ef07f2682d2ba4b893c9afe" 10 11DEPENDS = "libffi libxml2 zlib libedit ninja-native llvm-native" 12 13COMPATIBLE_HOST:riscv64 = "null" 14COMPATIBLE_HOST:riscv32 = "null" 15 16RDEPENDS:${PN}:append:class-target = " ncurses-terminfo" 17 18inherit cmake pkgconfig 19 20PROVIDES += "llvm${PV}" 21 22PV = "13.0.1" 23 24MAJOR_VERSION = "${@oe.utils.trim_version("${PV}", 1)}" 25 26LLVM_RELEASE = "${PV}" 27LLVM_DIR = "llvm${LLVM_RELEASE}" 28 29BRANCH = "release/${MAJOR_VERSION}.x" 30SRCREV = "75e33f71c2dae584b13a7d1186ae0a038ba98838" 31SRC_URI = "git://github.com/llvm/llvm-project.git;branch=${BRANCH};protocol=https \ 32 file://0006-llvm-TargetLibraryInfo-Undefine-libc-functions-if-th.patch;striplevel=2 \ 33 file://0007-llvm-allow-env-override-of-exe-path.patch;striplevel=2 \ 34 file://0001-AsmMatcherEmitter-sort-ClassInfo-lists-by-name-as-we.patch;striplevel=2 \ 35 " 36 37UPSTREAM_CHECK_GITTAGREGEX = "llvmorg-(?P<pver>\d+(\.\d+)+)" 38 39S = "${WORKDIR}/git/llvm" 40 41LLVM_INSTALL_DIR = "${WORKDIR}/llvm-install" 42 43def get_llvm_arch(bb, d, arch_var): 44 import re 45 a = d.getVar(arch_var) 46 if re.match(r'(i.86|athlon|x86.64)$', a): return 'X86' 47 elif re.match(r'arm$', a): return 'ARM' 48 elif re.match(r'armeb$', a): return 'ARM' 49 elif re.match(r'aarch64$', a): return 'AArch64' 50 elif re.match(r'aarch64_be$', a): return 'AArch64' 51 elif re.match(r'mips(isa|)(32|64|)(r6|)(el|)$', a): return 'Mips' 52 elif re.match(r'riscv(32|64)(eb|)$', a): return 'RISCV' 53 elif re.match(r'p(pc|owerpc)(|64)', a): return 'PowerPC' 54 else: 55 raise bb.parse.SkipRecipe("Cannot map '%s' to a supported LLVM architecture" % a) 56 57def get_llvm_host_arch(bb, d): 58 return get_llvm_arch(bb, d, 'HOST_ARCH') 59 60# 61# Default to build all OE-Core supported target arches (user overridable). 62# 63LLVM_TARGETS ?= "AMDGPU;${@get_llvm_host_arch(bb, d)}" 64 65ARM_INSTRUCTION_SET:armv5 = "arm" 66ARM_INSTRUCTION_SET:armv4t = "arm" 67 68EXTRA_OECMAKE += "-DLLVM_ENABLE_ASSERTIONS=OFF \ 69 -DLLVM_ENABLE_EXPENSIVE_CHECKS=OFF \ 70 -DLLVM_ENABLE_PIC=ON \ 71 -DLLVM_BINDINGS_LIST='' \ 72 -DLLVM_LINK_LLVM_DYLIB=ON \ 73 -DLLVM_ENABLE_FFI=ON \ 74 -DLLVM_ENABLE_RTTI=ON \ 75 -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \ 76 -DLLVM_OPTIMIZED_TABLEGEN=ON \ 77 -DLLVM_TARGETS_TO_BUILD='${LLVM_TARGETS}' \ 78 -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON \ 79 -DPYTHON_EXECUTABLE=${HOSTTOOLS_DIR}/python3 \ 80 -G Ninja" 81 82EXTRA_OECMAKE:append:class-target = "\ 83 -DCMAKE_CROSSCOMPILING:BOOL=ON \ 84 -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen${PV} \ 85 -DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config${PV} \ 86 " 87 88EXTRA_OECMAKE:append:class-nativesdk = "\ 89 -DCMAKE_CROSSCOMPILING:BOOL=ON \ 90 -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen${PV} \ 91 -DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config${PV} \ 92 " 93 94do_configure:prepend() { 95# Fix paths in llvm-config 96 sed -i "s|sys::path::parent_path(CurrentPath))\.str()|sys::path::parent_path(sys::path::parent_path(CurrentPath))).str()|g" ${S}/tools/llvm-config/llvm-config.cpp 97 sed -ri "s#/(bin|include|lib)(/?\")#/\1/${LLVM_DIR}\2#g" ${S}/tools/llvm-config/llvm-config.cpp 98 sed -ri "s#lib/${LLVM_DIR}#${baselib}/${LLVM_DIR}#g" ${S}/tools/llvm-config/llvm-config.cpp 99} 100 101# patch out build host paths for reproducibility 102do_compile:prepend:class-target() { 103 sed -i -e "s,${WORKDIR},,g" ${B}/tools/llvm-config/BuildVariables.inc 104} 105 106do_compile() { 107 ninja -v ${PARALLEL_MAKE} 108} 109 110do_compile:class-native() { 111 ninja -v ${PARALLEL_MAKE} llvm-config llvm-tblgen 112} 113 114do_install() { 115 DESTDIR=${LLVM_INSTALL_DIR} ninja -v install 116 install -D -m 0755 ${B}/bin/llvm-config ${D}${libdir}/${LLVM_DIR}/llvm-config 117 118 install -d ${D}${bindir}/${LLVM_DIR} 119 cp -r ${LLVM_INSTALL_DIR}${bindir}/* ${D}${bindir}/${LLVM_DIR}/ 120 121 install -d ${D}${includedir}/${LLVM_DIR} 122 cp -r ${LLVM_INSTALL_DIR}${includedir}/* ${D}${includedir}/${LLVM_DIR}/ 123 124 install -d ${D}${libdir}/${LLVM_DIR} 125 126 # The LLVM sources have "/lib" embedded and so we cannot completely rely on the ${libdir} variable 127 if [ -d ${LLVM_INSTALL_DIR}${libdir}/ ]; then 128 cp -r ${LLVM_INSTALL_DIR}${libdir}/* ${D}${libdir}/${LLVM_DIR}/ 129 elif [ -d ${LLVM_INSTALL_DIR}${prefix}/lib ]; then 130 cp -r ${LLVM_INSTALL_DIR}${prefix}/lib/* ${D}${libdir}/${LLVM_DIR}/ 131 elif [ -d ${LLVM_INSTALL_DIR}${prefix}/lib64 ]; then 132 cp -r ${LLVM_INSTALL_DIR}${prefix}/lib64/* ${D}${libdir}/${LLVM_DIR}/ 133 fi 134 135 # Remove unnecessary cmake files 136 rm -rf ${D}${libdir}/${LLVM_DIR}/cmake 137 138 ln -s ${LLVM_DIR}/libLLVM-${MAJOR_VERSION}${SOLIBSDEV} ${D}${libdir}/libLLVM-${MAJOR_VERSION}${SOLIBSDEV} 139 140 # We'll have to delete the libLLVM.so due to multiple reasons... 141 rm -rf ${D}${libdir}/${LLVM_DIR}/libLLVM.so 142 rm -rf ${D}${libdir}/${LLVM_DIR}/libLTO.so 143} 144 145do_install:class-native() { 146 install -D -m 0755 ${B}/bin/llvm-tblgen ${D}${bindir}/llvm-tblgen${PV} 147 install -D -m 0755 ${B}/bin/llvm-config ${D}${bindir}/llvm-config${PV} 148 install -D -m 0755 ${B}/lib/libLLVM-${MAJOR_VERSION}.so ${D}${libdir}/libLLVM-${MAJOR_VERSION}.so 149} 150 151PACKAGES =+ "${PN}-bugpointpasses ${PN}-llvmhello ${PN}-libllvm ${PN}-liboptremarks ${PN}-liblto" 152 153RRECOMMENDS:${PN}-dev += "${PN}-bugpointpasses ${PN}-llvmhello ${PN}-liboptremarks" 154 155FILES:${PN}-bugpointpasses = "\ 156 ${libdir}/${LLVM_DIR}/BugpointPasses.so \ 157" 158 159FILES:${PN}-libllvm = "\ 160 ${libdir}/${LLVM_DIR}/libLLVM-${MAJOR_VERSION}.so \ 161 ${libdir}/libLLVM-${MAJOR_VERSION}.so \ 162" 163 164FILES:${PN}-liblto += "\ 165 ${libdir}/${LLVM_DIR}/libLTO.so.* \ 166" 167 168FILES:${PN}-liboptremarks += "\ 169 ${libdir}/${LLVM_DIR}/libRemarks.so.* \ 170" 171 172FILES:${PN}-llvmhello = "\ 173 ${libdir}/${LLVM_DIR}/LLVMHello.so \ 174" 175 176FILES:${PN}-dev += " \ 177 ${libdir}/${LLVM_DIR}/llvm-config \ 178 ${libdir}/${LLVM_DIR}/libRemarks.so \ 179 ${libdir}/${LLVM_DIR}/libLLVM-${PV}.so \ 180" 181 182FILES:${PN}-staticdev += "\ 183 ${libdir}/${LLVM_DIR}/*.a \ 184" 185 186INSANE_SKIP:${PN}-libllvm += "dev-so" 187 188BBCLASSEXTEND = "native nativesdk" 189