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