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
22MAJOR_VERSION = "9"
23MINOR_VERSION = "0"
24PATCH_VERSION = "1"
25
26PV = "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}"
27
28LLVM_RELEASE = "${PV}"
29LLVM_DIR = "llvm${LLVM_RELEASE}"
30
31BRANCH = "release/${MAJOR_VERSION}.x"
32SRCREV = "c1a0a213378a458fbea1a5c77b315c7dce08fd05"
33SRC_URI = "git://github.com/llvm/llvm-project.git;branch=${BRANCH} \
34           file://0006-llvm-TargetLibraryInfo-Undefine-libc-functions-if-th.patch;striplevel=2 \
35           file://0007-llvm-allow-env-override-of-exe-path.patch;striplevel=2 \
36          "
37
38UPSTREAM_CHECK_GITTAGREGEX = "llvmorg-(?P<pver>\d+(\.\d+)+)"
39
40S = "${WORKDIR}/git/llvm"
41
42LLVM_INSTALL_DIR = "${WORKDIR}/llvm-install"
43
44def get_llvm_arch(bb, d, arch_var):
45    import re
46    a = d.getVar(arch_var)
47    if   re.match(r'(i.86|athlon|x86.64)$', a):         return 'X86'
48    elif re.match(r'arm$', a):                          return 'ARM'
49    elif re.match(r'armeb$', a):                        return 'ARM'
50    elif re.match(r'aarch64$', a):                      return 'AArch64'
51    elif re.match(r'aarch64_be$', a):                   return 'AArch64'
52    elif re.match(r'mips(isa|)(32|64|)(r6|)(el|)$', a): return 'Mips'
53    elif re.match(r'riscv(32|64)(eb|)$', a):            return 'RISCV'
54    elif re.match(r'p(pc|owerpc)(|64)', a):             return 'PowerPC'
55    else:
56        raise bb.parse.SkipRecipe("Cannot map '%s' to a supported LLVM architecture" % a)
57
58def get_llvm_host_arch(bb, d):
59    return get_llvm_arch(bb, d, 'HOST_ARCH')
60
61#
62# Default to build all OE-Core supported target arches (user overridable).
63#
64LLVM_TARGETS ?= "AMDGPU;${@get_llvm_host_arch(bb, d)}"
65
66ARM_INSTRUCTION_SET_armv5 = "arm"
67ARM_INSTRUCTION_SET_armv4t = "arm"
68
69EXTRA_OECMAKE += "-DLLVM_ENABLE_ASSERTIONS=OFF \
70                  -DLLVM_ENABLE_EXPENSIVE_CHECKS=OFF \
71                  -DLLVM_ENABLE_PIC=ON \
72                  -DLLVM_BINDINGS_LIST='' \
73                  -DLLVM_LINK_LLVM_DYLIB=ON \
74                  -DLLVM_ENABLE_FFI=ON \
75                  -DLLVM_ENABLE_RTTI=ON \
76                  -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \
77                  -DLLVM_OPTIMIZED_TABLEGEN=ON \
78                  -DLLVM_TARGETS_TO_BUILD='${LLVM_TARGETS}' \
79                  -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON \
80                  -DPYTHON_EXECUTABLE=${HOSTTOOLS_DIR}/python3 \
81                  -G Ninja"
82
83EXTRA_OECMAKE_append_class-target = "\
84                  -DCMAKE_CROSSCOMPILING:BOOL=ON \
85                  -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen${PV} \
86                  -DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config${PV} \
87                 "
88
89EXTRA_OECMAKE_append_class-nativesdk = "\
90                  -DCMAKE_CROSSCOMPILING:BOOL=ON \
91                  -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen${PV} \
92                  -DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config${PV} \
93                 "
94
95do_configure_prepend() {
96# Fix paths in llvm-config
97	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
98	sed -ri "s#/(bin|include|lib)(/?\")#/\1/${LLVM_DIR}\2#g" ${S}/tools/llvm-config/llvm-config.cpp
99	sed -ri "s#lib/${LLVM_DIR}#${baselib}/${LLVM_DIR}#g" ${S}/tools/llvm-config/llvm-config.cpp
100}
101
102do_compile() {
103	ninja -v ${PARALLEL_MAKE}
104}
105
106do_compile_class-native() {
107	ninja -v ${PARALLEL_MAKE} llvm-config llvm-tblgen
108}
109
110do_install() {
111	DESTDIR=${LLVM_INSTALL_DIR} ninja -v install
112	install -D -m 0755 ${B}/bin/llvm-config ${D}${libdir}/${LLVM_DIR}/llvm-config
113
114	install -d ${D}${bindir}/${LLVM_DIR}
115	cp -r ${LLVM_INSTALL_DIR}${bindir}/* ${D}${bindir}/${LLVM_DIR}/
116
117	install -d ${D}${includedir}/${LLVM_DIR}
118	cp -r ${LLVM_INSTALL_DIR}${includedir}/* ${D}${includedir}/${LLVM_DIR}/
119
120	install -d ${D}${libdir}/${LLVM_DIR}
121
122	# The LLVM sources have "/lib" embedded and so we cannot completely rely on the ${libdir} variable
123	if [ -d ${LLVM_INSTALL_DIR}${libdir}/ ]; then
124		cp -r ${LLVM_INSTALL_DIR}${libdir}/* ${D}${libdir}/${LLVM_DIR}/
125	elif [ -d ${LLVM_INSTALL_DIR}${prefix}/lib ]; then
126		cp -r ${LLVM_INSTALL_DIR}${prefix}/lib/* ${D}${libdir}/${LLVM_DIR}/
127	elif [ -d ${LLVM_INSTALL_DIR}${prefix}/lib64 ]; then
128		cp -r ${LLVM_INSTALL_DIR}${prefix}/lib64/* ${D}${libdir}/${LLVM_DIR}/
129	fi
130
131	# Remove unnecessary cmake files
132	rm -rf ${D}${libdir}/${LLVM_DIR}/cmake
133
134	ln -s ${LLVM_DIR}/libLLVM-${MAJOR_VERSION}${SOLIBSDEV} ${D}${libdir}/libLLVM-${MAJOR_VERSION}${SOLIBSDEV}
135
136	# We'll have to delete the libLLVM.so due to multiple reasons...
137	rm -rf ${D}${libdir}/${LLVM_DIR}/libLLVM.so
138	rm -rf ${D}${libdir}/${LLVM_DIR}/libLTO.so
139}
140
141do_install_class-native() {
142	install -D -m 0755 ${B}/bin/llvm-tblgen ${D}${bindir}/llvm-tblgen${PV}
143	install -D -m 0755 ${B}/bin/llvm-config ${D}${bindir}/llvm-config${PV}
144	install -D -m 0755 ${B}/lib/libLLVM-${MAJOR_VERSION}.so ${D}${libdir}/libLLVM-${MAJOR_VERSION}.so
145}
146
147PACKAGES =+ "${PN}-bugpointpasses ${PN}-llvmhello ${PN}-libllvm ${PN}-liboptremarks ${PN}-liblto"
148
149RRECOMMENDS_${PN}-dev += "${PN}-bugpointpasses ${PN}-llvmhello ${PN}-liboptremarks"
150
151FILES_${PN}-bugpointpasses = "\
152    ${libdir}/${LLVM_DIR}/BugpointPasses.so \
153"
154
155FILES_${PN}-libllvm = "\
156    ${libdir}/${LLVM_DIR}/libLLVM-${MAJOR_VERSION}.so \
157    ${libdir}/libLLVM-${MAJOR_VERSION}.so \
158"
159
160FILES_${PN}-liblto += "\
161    ${libdir}/${LLVM_DIR}/libLTO.so.* \
162"
163
164FILES_${PN}-liboptremarks += "\
165    ${libdir}/${LLVM_DIR}/libRemarks.so.* \
166"
167
168FILES_${PN}-llvmhello = "\
169    ${libdir}/${LLVM_DIR}/LLVMHello.so \
170"
171
172FILES_${PN}-dev += " \
173    ${libdir}/${LLVM_DIR}/llvm-config \
174    ${libdir}/${LLVM_DIR}/libRemarks.so \
175    ${libdir}/${LLVM_DIR}/libLLVM-${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}.so \
176"
177
178FILES_${PN}-staticdev += "\
179    ${libdir}/${LLVM_DIR}/*.a \
180"
181
182INSANE_SKIP_${PN}-libllvm += "dev-so"
183
184BBCLASSEXTEND = "native nativesdk"
185