xref: /OK3568_Linux_fs/yocto/poky/meta/recipes-devtools/llvm/llvm_git.bb (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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