1# Copyright (C) 2014 Khem Raj <raj.khem@gmail.com> 2# Released under the MIT license (see COPYING.MIT for the terms) 3 4DESCRIPTION = "LLVM based C/C++ compiler" 5HOMEPAGE = "http://clang.llvm.org/" 6SECTION = "devel" 7 8require clang.inc 9require common-source.inc 10 11INHIBIT_DEFAULT_DEPS = "1" 12 13BUILD_CC:class-nativesdk = "clang" 14BUILD_CXX:class-nativesdk = "clang++" 15BUILD_AR:class-nativesdk = "llvm-ar" 16BUILD_RANLIB:class-nativesdk = "llvm-ranlib" 17BUILD_NM:class-nativesdk = "llvm-nm" 18LDFLAGS:remove:class-nativesdk = "-fuse-ld=lld" 19 20inherit cmake cmake-native pkgconfig python3native 21 22OECMAKE_FIND_ROOT_PATH_MODE_PROGRAM = "BOTH" 23 24def get_clang_experimental_arch(bb, d, arch_var): 25 import re 26 a = d.getVar(arch_var, True) 27 return "" 28 29def get_clang_arch(bb, d, arch_var): 30 import re 31 a = d.getVar(arch_var, True) 32 if re.match('(i.86|athlon|x86.64)$', a): return 'X86' 33 elif re.match('arm$', a): return 'ARM' 34 elif re.match('armeb$', a): return 'ARM' 35 elif re.match('aarch64$', a): return 'AArch64' 36 elif re.match('aarch64_be$', a): return 'AArch64' 37 elif re.match('mips(isa|)(32|64|)(r6|)(el|)$', a): return 'Mips' 38 elif re.match('riscv32$', a): return 'riscv32' 39 elif re.match('riscv64$', a): return 'riscv64' 40 elif re.match('p(pc|owerpc)(|64)', a): return 'PowerPC' 41 else: 42 bb.note("'%s' is not a primary llvm architecture" % a) 43 return "" 44 45def get_clang_host_arch(bb, d): 46 return get_clang_arch(bb, d, 'HOST_ARCH') 47 48def get_clang_target_arch(bb, d): 49 return get_clang_arch(bb, d, 'TARGET_ARCH') 50 51def get_clang_experimental_target_arch(bb, d): 52 return get_clang_experimental_arch(bb, d, 'TARGET_ARCH') 53 54PACKAGECONFIG ??= "compiler-rt libcplusplus shared-libs lldb-wchar \ 55 ${@bb.utils.filter('DISTRO_FEATURES', 'thin-lto lto', d)} \ 56 ${@bb.utils.contains('RUNTIME', 'llvm', 'compiler-rt libcplusplus unwindlib libomp', '', d)} \ 57 rtti eh libedit terminfo \ 58 " 59PACKAGECONFIG:class-native = "rtti eh libedit shared-libs ${@bb.utils.contains('RUNTIME', 'llvm', 'compiler-rt libcplusplus unwindlib libomp', '', d)}" 60PACKAGECONFIG:class-nativesdk = "rtti eh libedit shared-libs ${@bb.utils.filter('DISTRO_FEATURES', 'thin-lto lto', d)} ${@bb.utils.contains('RUNTIME', 'llvm', 'compiler-rt libcplusplus unwindlib libomp', '', d)}" 61 62PACKAGECONFIG[compiler-rt] = "-DCLANG_DEFAULT_RTLIB=compiler-rt,," 63PACKAGECONFIG[libcplusplus] = "-DCLANG_DEFAULT_CXX_STDLIB=libc++,," 64PACKAGECONFIG[unwindlib] = "-DCLANG_DEFAULT_UNWINDLIB=libunwind,-DCLANG_DEFAULT_UNWINDLIB=libgcc,," 65PACKAGECONFIG[libomp] = "-DCLANG_DEFAULT_OPENMP_RUNTIME=libomp,," 66PACKAGECONFIG[thin-lto] = "-DLLVM_ENABLE_LTO=Thin -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR},,binutils," 67PACKAGECONFIG[lto] = "-DLLVM_ENABLE_LTO=Full -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR},,binutils," 68PACKAGECONFIG[shared-libs] = "-DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON,,," 69PACKAGECONFIG[terminfo] = "-DLLVM_ENABLE_TERMINFO=ON -DCOMPILER_RT_TERMINFO_LIB=ON,-DLLVM_ENABLE_TERMINFO=OFF -DCOMPILER_RT_TERMINFO_LIB=OFF,ncurses," 70PACKAGECONFIG[pfm] = "-DLLVM_ENABLE_LIBPFM=ON,-DLLVM_ENABLE_LIBPFM=OFF,libpfm," 71PACKAGECONFIG[lldb-wchar] = "-DLLDB_EDITLINE_USE_WCHAR=1,-DLLDB_EDITLINE_USE_WCHAR=0," 72PACKAGECONFIG[lldb-lua] = "-DLLDB_ENABLE_LUA=ON,-DLLDB_ENABLE_LUA=OFF,lua" 73PACKAGECONFIG[bootstrap] = "-DCLANG_ENABLE_BOOTSTRAP=On -DCLANG_BOOTSTRAP_PASSTHROUGH='${PASSTHROUGH}' -DBOOTSTRAP_LLVM_ENABLE_LTO=Thin -DBOOTSTRAP_LLVM_ENABLE_LLD=ON,,," 74PACKAGECONFIG[eh] = "-DLLVM_ENABLE_EH=ON,-DLLVM_ENABLE_EH=OFF,," 75PACKAGECONFIG[rtti] = "-DLLVM_ENABLE_RTTI=ON,-DLLVM_ENABLE_RTTI=OFF,," 76PACKAGECONFIG[split-dwarf] = "-DLLVM_USE_SPLIT_DWARF=ON,-DLLVM_USE_SPLIT_DWARF=OFF,," 77PACKAGECONFIG[libedit] = "-DLLVM_ENABLE_LIBEDIT=ON -DLLDB_ENABLE_LIBEDIT=ON,-DLLVM_ENABLE_LIBEDIT=OFF -DLLDB_ENABLE_LIBEDIT=OFF,libedit libedit-native" 78 79OECMAKE_SOURCEPATH = "${S}/llvm" 80 81OECMAKE_TARGET_COMPILE = "${@bb.utils.contains('PACKAGECONFIG', 'bootstrap', 'stage2', 'all', d)}" 82OECMAKE_TARGET_INSTALL = "${@bb.utils.contains('PACKAGECONFIG', 'bootstrap', 'stage2-install', 'install', d)}" 83BINPATHPREFIX = "${@bb.utils.contains('PACKAGECONFIG', 'bootstrap', '/tools/clang/stage2-bins/NATIVE', '', d)}" 84 85PASSTHROUGH = "\ 86CLANG_DEFAULT_RTLIB;CLANG_DEFAULT_CXX_STDLIB;LLVM_BUILD_LLVM_DYLIB;LLVM_LINK_LLVM_DYLIB;\ 87LLVM_ENABLE_ASSERTIONS;LLVM_ENABLE_EXPENSIVE_CHECKS;LLVM_ENABLE_PIC;\ 88LLVM_BINDINGS_LIST;LLVM_ENABLE_FFI;FFI_INCLUDE_DIR;LLVM_OPTIMIZED_TABLEGEN;\ 89LLVM_ENABLE_RTTI;LLVM_ENABLE_EH;LLVM_BUILD_EXTERNAL_COMPILER_RT;CMAKE_SYSTEM_NAME;\ 90CMAKE_BUILD_TYPE;BUILD_SHARED_LIBS;LLVM_ENABLE_PROJECTS;LLVM_BINUTILS_INCDIR;\ 91LLVM_TARGETS_TO_BUILD;LLVM_EXPERIMENTAL_TARGETS_TO_BUILD;PYTHON_EXECUTABLE;\ 92PYTHON_LIBRARY;PYTHON_INCLUDE_DIR;LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN;LLDB_EDITLINE_USE_WCHAR;\ 93LLVM_ENABLE_LIBEDIT;LLDB_ENABLE_LIBEDIT;LLDB_PYTHON_RELATIVE_PATH;LLDB_PYTHON_EXE_RELATIVE_PATH;\ 94LLDB_PYTHON_EXT_SUFFIX;CMAKE_C_FLAGS_RELEASE;CMAKE_CXX_FLAGS_RELEASE;CMAKE_ASM_FLAGS_RELEASE;\ 95CLANG_DEFAULT_CXX_STDLIB;CLANG_DEFAULT_RTLIB;CLANG_DEFAULT_UNWINDLIB;\ 96CLANG_DEFAULT_OPENMP_RUNTIME;\ 97" 98# 99# Default to build all OE-Core supported target arches (user overridable). 100# Gennerally setting LLVM_TARGETS_TO_BUILD = "" in local.conf is ok in most simple situations 101# where only one target architecture is needed along with just one build arch (usually X86) 102# 103LLVM_TARGETS_TO_BUILD ?= "AMDGPU;AArch64;ARM;BPF;Mips;PowerPC;RISCV;X86" 104 105LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ?= "" 106LLVM_EXPERIMENTAL_TARGETS_TO_BUILD:append = ";${@get_clang_experimental_target_arch(bb, d)}" 107 108HF = "" 109HF:class-target = "${@ bb.utils.contains('TUNE_CCARGS_MFLOAT', 'hard', 'hf', '', d)}" 110HF[vardepvalue] = "${HF}" 111 112LLVM_PROJECTS ?= "clang;clang-tools-extra;lld${LLDB}" 113LLDB ?= ";lldb" 114# LLDB support for RISCV/Mips32 does not work yet 115LLDB:riscv32 = "" 116LLDB:riscv64 = "" 117LLDB:mips = "" 118LLDB:mipsel = "" 119LLDB:powerpc = "" 120 121# linux hosts (.so) on Windows .pyd 122SOLIBSDEV:mingw32 = ".pyd" 123 124#CMAKE_VERBOSE = "VERBOSE=1" 125 126EXTRA_OECMAKE += "-DLLVM_ENABLE_ASSERTIONS=OFF \ 127 -DLLVM_ENABLE_EXPENSIVE_CHECKS=OFF \ 128 -DLLVM_ENABLE_PIC=ON \ 129 -DCLANG_DEFAULT_PIE_ON_LINUX=ON \ 130 -DLLVM_BINDINGS_LIST='' \ 131 -DLLVM_ENABLE_FFI=ON \ 132 -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \ 133 -DLLVM_OPTIMIZED_TABLEGEN=ON \ 134 -DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON \ 135 -DCMAKE_SYSTEM_NAME=Linux \ 136 -DCMAKE_BUILD_TYPE=Release \ 137 -DCMAKE_CXX_FLAGS_RELEASE='${CXXFLAGS} -DNDEBUG -g0' \ 138 -DCMAKE_C_FLAGS_RELEASE='${CFLAGS} -DNDEBUG -g0' \ 139 -DBUILD_SHARED_LIBS=OFF \ 140 -DLLVM_ENABLE_PROJECTS='${LLVM_PROJECTS}' \ 141 -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR} \ 142 -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON \ 143 -DLLVM_TARGETS_TO_BUILD='${LLVM_TARGETS_TO_BUILD}' \ 144 -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD='${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD}' \ 145" 146 147EXTRA_OECMAKE:append:class-native = "\ 148 -DPYTHON_EXECUTABLE='${PYTHON}' \ 149" 150EXTRA_OECMAKE:append:class-nativesdk = "\ 151 -DCMAKE_CROSSCOMPILING:BOOL=ON \ 152 -DCROSS_TOOLCHAIN_FLAGS_NATIVE='-DLLDB_PYTHON_RELATIVE_PATH=${PYTHON_SITEPACKAGES_DIR} \ 153 -DLLDB_PYTHON_EXE_RELATIVE_PATH=${PYTHON} \ 154 -DLLDB_PYTHON_EXT_SUFFIX=${SOLIBSDEV} \ 155 -DCMAKE_TOOLCHAIN_FILE=${WORKDIR}/toolchain-native.cmake' \ 156 -DCMAKE_RANLIB=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ranlib \ 157 -DCMAKE_AR=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ar \ 158 -DCMAKE_NM=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-nm \ 159 -DCMAKE_STRIP=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-strip \ 160 -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \ 161 -DCLANG_TABLEGEN=${STAGING_BINDIR_NATIVE}/clang-tblgen \ 162 -DLLDB_TABLEGEN=${STAGING_BINDIR_NATIVE}/lldb-tblgen \ 163 -DPYTHON_LIBRARY=${STAGING_LIBDIR}/lib${PYTHON_DIR}${PYTHON_ABI}.so \ 164 -DLLDB_PYTHON_RELATIVE_PATH=${PYTHON_SITEPACKAGES_DIR} \ 165 -DLLDB_PYTHON_EXE_RELATIVE_PATH=${PYTHON} \ 166 -DLLDB_PYTHON_EXT_SUFFIX=${SOLIBSDEV} \ 167 -DPYTHON_INCLUDE_DIR=${STAGING_INCDIR}/${PYTHON_DIR}${PYTHON_ABI} \ 168 -DPYTHON_EXECUTABLE='${PYTHON}' \ 169" 170EXTRA_OECMAKE:append:class-target = "\ 171 -DCMAKE_CROSSCOMPILING:BOOL=ON \ 172 -DCROSS_TOOLCHAIN_FLAGS_NATIVE='-DLLDB_PYTHON_RELATIVE_PATH=${PYTHON_SITEPACKAGES_DIR} \ 173 -DLLDB_PYTHON_EXT_SUFFIX=${SOLIBSDEV} \ 174 -DLLDB_PYTHON_EXE_RELATIVE_PATH=${PYTHON}' \ 175 -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \ 176 -DCLANG_TABLEGEN=${STAGING_BINDIR_NATIVE}/clang-tblgen \ 177 -DLLDB_TABLEGEN=${STAGING_BINDIR_NATIVE}/lldb-tblgen \ 178 -DCMAKE_RANLIB=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ranlib \ 179 -DCMAKE_AR=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ar \ 180 -DCMAKE_NM=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-nm \ 181 -DCMAKE_STRIP=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-strip \ 182 -DLLVM_TARGET_ARCH=${@get_clang_target_arch(bb, d)} \ 183 -DLLVM_DEFAULT_TARGET_TRIPLE=${TARGET_SYS}${HF} \ 184 -DLLVM_HOST_TRIPLE=${TARGET_SYS}${HF} \ 185 -DLLDB_PYTHON_RELATIVE_PATH=${PYTHON_SITEPACKAGES_DIR} \ 186 -DLLDB_PYTHON_EXE_RELATIVE_PATH=${PYTHON} \ 187 -DLLDB_PYTHON_EXT_SUFFIX=${SOLIBSDEV} \ 188 -DPYTHON_LIBRARY=${STAGING_LIBDIR}/lib${PYTHON_DIR}${PYTHON_ABI}.so \ 189 -DPYTHON_INCLUDE_DIR=${STAGING_INCDIR}/${PYTHON_DIR}${PYTHON_ABI} \ 190 -DLLVM_LIBDIR_SUFFIX=${@d.getVar('baselib').replace('lib', '')} \ 191 -DPYTHON_EXECUTABLE='${PYTHON}' \ 192" 193 194DEPENDS = "binutils zlib libffi libxml2 libxml2-native ninja-native swig-native" 195DEPENDS:append:class-nativesdk = " clang-crosssdk-${SDK_ARCH} virtual/${TARGET_PREFIX}binutils-crosssdk nativesdk-python3" 196DEPENDS:append:class-target = " clang-cross-${TARGET_ARCH} python3 compiler-rt libcxx" 197 198RRECOMMENDS:${PN} = "binutils" 199RRECOMMENDS:${PN}:append:class-target = " libcxx-dev" 200 201do_install:append() { 202 rm -rf ${D}${libdir}/python*/site-packages/six.py 203} 204 205do_install:append:class-target () { 206 # Allow bin path to change based on YOCTO_ALTERNATE_EXE_PATH 207 sed -i 's;${_IMPORT_PREFIX}/bin;${_IMPORT_PREFIX_BIN};g' ${D}${libdir}/cmake/llvm/LLVMExports-release.cmake 208 209 # Insert function to populate Import Variables 210 sed -i "4i\ 211if(DEFINED ENV{YOCTO_ALTERNATE_EXE_PATH})\n\ 212 execute_process(COMMAND \"llvm-config\" \"--bindir\" OUTPUT_VARIABLE _IMPORT_PREFIX_BIN OUTPUT_STRIP_TRAILING_WHITESPACE)\n\ 213else()\n\ 214 set(_IMPORT_PREFIX_BIN \"\${_IMPORT_PREFIX}/bin\")\n\ 215endif()\n" ${D}${libdir}/cmake/llvm/LLVMExports-release.cmake 216 217 if [ -n "${LLVM_LIBDIR_SUFFIX}" ]; then 218 mkdir -p ${D}${nonarch_libdir} 219 mv ${D}${libdir}/clang ${D}${nonarch_libdir}/clang 220 ln -rs ${D}${nonarch_libdir}/clang ${D}${libdir}/clang 221 rmdir --ignore-fail-on-non-empty ${D}${libdir} 222 fi 223 for t in clang clang++ llvm-nm llvm-ar llvm-as llvm-ranlib llvm-strip llvm-objcopy llvm-objdump llvm-readelf \ 224 llvm-addr2line llvm-dwp llvm-size llvm-strings llvm-cov; do 225 ln -sf $t ${D}${bindir}/${TARGET_PREFIX}$t 226 done 227} 228 229do_install:append:class-native () { 230 install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clang-tblgen ${D}${bindir}/clang-tblgen 231 install -Dm 0755 ${B}${BINPATHPREFIX}/bin/lldb-tblgen ${D}${bindir}/lldb-tblgen 232 for f in `find ${D}${bindir} -executable -type f -not -type l`; do 233 test -n "`file -b $f|grep -i ELF`" && ${STRIP} $f 234 echo "stripped $f" 235 done 236 ln -sf clang-tblgen ${D}${bindir}/clang-tblgen${PV} 237 ln -sf llvm-tblgen ${D}${bindir}/llvm-tblgen${PV} 238 ln -sf llvm-config ${D}${bindir}/llvm-config${PV} 239} 240 241do_install:append:class-nativesdk () { 242 install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clang-tblgen ${D}${bindir}/clang-tblgen 243 install -Dm 0755 ${B}${BINPATHPREFIX}/bin/lldb-tblgen ${D}${bindir}/lldb-tblgen 244 for f in `find ${D}${bindir} -executable -type f -not -type l`; do 245 test -n "`file -b $f|grep -i ELF`" && ${STRIP} $f 246 done 247 ln -sf clang-tblgen ${D}${bindir}/clang-tblgen${PV} 248 ln -sf llvm-tblgen ${D}${bindir}/llvm-tblgen${PV} 249 ln -sf llvm-config ${D}${bindir}/llvm-config${PV} 250 rm -rf ${D}${datadir}/llvm/cmake 251 rm -rf ${D}${datadir}/llvm 252} 253 254PACKAGES =+ "${PN}-libllvm ${PN}-lldb-python libclang lldb lldb-server liblldb" 255 256PROVIDES += "llvm llvm${PV}" 257PROVIDES:append:class-native = " llvm-native" 258 259BBCLASSEXTEND = "native nativesdk" 260 261RDEPENDS:lldb += "${PN}-lldb-python" 262 263FILES:${PN}-lldb-python = "${libdir}/python*/site-packages/lldb/*" 264 265FILES:${PN} += "\ 266 ${libdir}/BugpointPasses.so \ 267 ${libdir}/LLVMHello.so \ 268 ${libdir}/LLVMgold.so \ 269 ${libdir}/*Plugin.so \ 270 ${libdir}/${BPN} \ 271 ${nonarch_libdir}/${BPN}/*/include/ \ 272 ${datadir}/scan-* \ 273 ${nonarch_libdir}/libscanbuild \ 274 ${datadir}/opt-viewer/ \ 275" 276 277FILES:lldb = "\ 278 ${bindir}/lldb \ 279" 280 281FILES:lldb-server = "\ 282 ${bindir}/lldb-server \ 283" 284 285FILES:liblldb = "\ 286 ${libdir}/liblldbIntelFeatures.so* \ 287 ${libdir}/liblldb.so* \ 288" 289 290FILES:${PN}-libllvm =+ "\ 291 ${libdir}/libLLVM-${MAJOR_VER}.${MINOR_VER}.so \ 292 ${libdir}/libLLVM-${MAJOR_VER}.so \ 293 ${libdir}/libLLVM-${MAJOR_VER}git.so \ 294 ${libdir}/libLLVM-${MAJOR_VER}.${MINOR_VER}git.so \ 295" 296 297FILES:libclang = "\ 298 ${libdir}/libclang.so.${MAJOR_VER} \ 299" 300 301FILES:${PN}-dev += "\ 302 ${datadir}/llvm/cmake \ 303 ${libdir}/cmake \ 304 ${nonarch_libdir}/libear \ 305 ${nonarch_libdir}/${BPN}/*.la \ 306" 307 308FILES:${PN}-staticdev += "${nonarch_libdir}/${BPN}/*.a" 309 310FILES:${PN}-staticdev:remove = "${libdir}/${BPN}/*.a" 311FILES:${PN}-dev:remove = "${libdir}/${BPN}/*.la" 312FILES:${PN}:remove = "${libdir}/${BPN}/*" 313 314 315INSANE_SKIP:${PN} += "already-stripped" 316#INSANE_SKIP:${PN}-dev += "dev-elf" 317INSANE_SKIP:${PN}-lldb-python += "dev-so dev-deps" 318INSANE_SKIP:liblldb = "dev-so" 319 320#Avoid SSTATE_SCAN_COMMAND running sed over llvm-config. 321SSTATE_SCAN_FILES:remove = "*-config" 322 323TOOLCHAIN = "clang" 324TOOLCHAIN:class-native = "gcc" 325TOOLCHAIN:class-nativesdk = "clang" 326COMPILER_RT:class-nativesdk:toolchain-clang:runtime-llvm = "-rtlib=libgcc --unwindlib=libgcc" 327LIBCPLUSPLUS:class-nativesdk:toolchain-clang:runtime-llvm = "-stdlib=libstdc++" 328 329SYSROOT_DIRS:append:class-target = " ${nonarch_libdir}" 330 331SYSROOT_PREPROCESS_FUNCS:append:class-target = " clang_sysroot_preprocess" 332 333clang_sysroot_preprocess() { 334 install -d ${SYSROOT_DESTDIR}${bindir_crossscripts}/ 335 install -m 0755 ${S}/../llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/ 336 ln -sf llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/llvm-config${PV} 337 # LLDTargets.cmake references the lld executable(!) that some modules/plugins link to 338 install -d ${SYSROOT_DESTDIR}${bindir} 339 install -m 755 ${D}${bindir}/lld ${SYSROOT_DESTDIR}${bindir}/ 340} 341