clang_git.bb 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. # Copyright (C) 2014 Khem Raj <raj.khem@gmail.com>
  2. # Released under the MIT license (see COPYING.MIT for the terms)
  3. SUMMARY = "LLVM based C/C++ compiler"
  4. DESCRIPTION = "Clang is an LLVM based C/C++/Objective-C compiler, \
  5. which aims to deliver amazingly fast compiles, \
  6. extremely useful error and warning messages and \
  7. to provide a platform for building great source \
  8. level tools. The Clang Static Analyzer and \
  9. clang-tidy are tools that automatically find bugs \
  10. in your code, and are great examples of the sort \
  11. of tools that can be built using the Clang frontend \
  12. as a library to parse C/C++ code"
  13. HOMEPAGE = "http://clang.llvm.org/"
  14. SECTION = "devel"
  15. require common-clang.inc
  16. require common-source.inc
  17. BPN = "clang"
  18. CVE_PRODUCT = "llvm:clang"
  19. LDFLAGS:append:class-target:riscv32 = " -Wl,--no-as-needed -latomic -Wl,--as-needed"
  20. LDFLAGS:append:class-target:mips = " -Wl,--no-as-needed -latomic -Wl,--as-needed"
  21. inherit cmake pkgconfig multilib_header python3-dir
  22. PACKAGECONFIG ??= "build-id clangd libclang-python \
  23. ${@bb.utils.filter('DISTRO_FEATURES', 'lto thin-lto', d)} \
  24. ${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', 'lld', '', d)} \
  25. ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', 'compiler-rt libcplusplus libomp unwindlib', '', d)} \
  26. "
  27. PACKAGECONFIG:remove:class-native = "lto thin-lto"
  28. PACKAGECONFIG[build-id] = "-DENABLE_LINKER_BUILD_ID=ON,-DENABLE_LINKER_BUILD_ID=OFF,,"
  29. PACKAGECONFIG[clangd] = "-DCLANG_ENABLE_CLANGD=ON,-DCLANG_ENABLE_CLANGD=OFF,,"
  30. # Activate to build the dexp tool in clangd
  31. # Disabled by default for -native since it is known to trigger compiler failure on Debian 11
  32. # See: https://bugzilla.yoctoproject.org/show_bug.cgi?id=15803
  33. PACKAGECONFIG[clangd-dexp] = "-DCLANGD_BUILD_DEXP=ON,-DCLANGD_BUILD_DEXP=OFF,,"
  34. PACKAGECONFIG[compiler-rt] = "-DCLANG_DEFAULT_RTLIB=compiler-rt,,"
  35. PACKAGECONFIG[libcplusplus] = "-DCLANG_DEFAULT_CXX_STDLIB=libc++,,"
  36. PACKAGECONFIG[libomp] = "-DCLANG_DEFAULT_OPENMP_RUNTIME=libomp,,"
  37. PACKAGECONFIG[lld] = "-DCLANG_DEFAULT_LINKER=lld,,,"
  38. PACKAGECONFIG[lto] = "-DLLVM_ENABLE_LTO=Full -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR},,binutils,"
  39. PACKAGECONFIG[thin-lto] = "-DLLVM_ENABLE_LTO=Thin -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR},,binutils,"
  40. PACKAGECONFIG[unwindlib] = "-DCLANG_DEFAULT_UNWINDLIB=libunwind,-DCLANG_DEFAULT_UNWINDLIB=libgcc,,"
  41. PACKAGECONFIG[libclang-python] = "-DCLANG_PYTHON_BINDINGS_VERSIONS=${PYTHON_BASEVERSION},,"
  42. OECMAKE_SOURCEPATH = "${S}/clang"
  43. # linux hosts (.so) on Windows .pyd
  44. SOLIBSDEV:mingw32 = ".pyd"
  45. #CMAKE_VERBOSE = "VERBOSE=1"
  46. EXTRA_OECMAKE += "-DLLVM_ENABLE_ASSERTIONS=OFF \
  47. -DLLVM_APPEND_VC_REV=OFF \
  48. -DLLVM_ENABLE_PIC=ON \
  49. -DCLANG_DEFAULT_PIE_ON_LINUX=ON \
  50. -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \
  51. -DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON \
  52. -DCMAKE_SYSTEM_NAME=Linux \
  53. -DCMAKE_BUILD_TYPE=MinSizeRel \
  54. -DLLVM_VERSION_SUFFIX='${VER_SUFFIX}' \
  55. -DLLVM_CMAKE_DIR=${STAGING_LIBDIR}/cmake/llvm \
  56. -DLLVM_NATIVE_TOOL_DIR=${STAGING_BINDIR_NATIVE} \
  57. -DLLVM_TABLEGEN_EXE=${STAGING_BINDIR_NATIVE}/llvm-tblgen \
  58. -DCLANG_TABLEGEN_EXE=${STAGING_BINDIR_NATIVE}/clang-tblgen \
  59. -DLLVM_INCLUDE_TESTS=OFF \
  60. -DCROSS_TOOLCHAIN_FLAGS_NATIVE='-DCMAKE_TOOLCHAIN_FILE=${WORKDIR}/toolchain-native.cmake' \
  61. -DLLVM_LIBDIR_SUFFIX=${LLVM_LIBDIR_SUFFIX} \
  62. -DCMAKE_AR=${STAGING_BINDIR_NATIVE}/llvm-ar \
  63. -DCMAKE_NM=${STAGING_BINDIR_NATIVE}/llvm-nm \
  64. -DCMAKE_RANLIB=${STAGING_BINDIR_NATIVE}/llvm-ranlib \
  65. -DCMAKE_STRIP=${STAGING_BINDIR_NATIVE}/llvm-strip \
  66. "
  67. DEPENDS = "llvm-tblgen-native llvm-native llvm binutils zlib zstd libffi libxml2 libxml2-native"
  68. DEPENDS:append:class-target = " ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', 'compiler-rt libcxx', '', d)}"
  69. RDEPENDS:${PN}:append:class-target = "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', ' lld', '', d)}"
  70. RRECOMMENDS:${PN}:append:class-target = "binutils ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', ' libcxx-dev', '', d)}"
  71. do_configure:prepend() {
  72. # Link clang-tools-extra into the clang tree as clang will look for it here
  73. # if it's doing a standalone build.
  74. ln -srf ${S}/clang-tools-extra ${S}/clang/tools/extra
  75. }
  76. do_install:append() {
  77. oe_multilib_header clang/Config/config.h
  78. }
  79. do_install:append:class-target () {
  80. if [ -n "${LLVM_LIBDIR_SUFFIX}" ]; then
  81. mkdir -p ${D}${nonarch_libdir}
  82. mv ${D}${libdir}/clang ${D}${nonarch_libdir}/clang
  83. ln -rs ${D}${nonarch_libdir}/clang ${D}${libdir}/clang
  84. rmdir --ignore-fail-on-non-empty ${D}${libdir}
  85. fi
  86. for t in clang clang++ llvm-nm llvm-ar llvm-as llvm-ranlib llvm-strip llvm-objcopy llvm-objdump llvm-readelf \
  87. llvm-addr2line llvm-dwp llvm-size llvm-strings llvm-cov; do
  88. ln -sf $t ${D}${bindir}/${TARGET_PREFIX}$t
  89. done
  90. }
  91. do_install:append:class-nativesdk () {
  92. #reproducibility
  93. if [ -e ${D}${libdir}/cmake/llvm/LLVMConfig.cmake ] ; then
  94. sed -i -e 's,${B},,g' ${D}${libdir}/cmake/llvm/LLVMConfig.cmake
  95. fi
  96. }
  97. PACKAGES =+ "${PN}-libclang-python ${PN}-libclang-cpp ${PN}-tidy ${PN}-format ${PN}-tools libclang"
  98. BBCLASSEXTEND = "native nativesdk"
  99. RDEPENDS:${PN}-tools += "\
  100. perl-module-digest-md5 \
  101. perl-module-file-basename \
  102. perl-module-file-copy \
  103. perl-module-file-find \
  104. perl-module-file-path \
  105. perl-module-findbin \
  106. perl-module-hash-util \
  107. perl-module-sys-hostname \
  108. perl-module-term-ansicolor \
  109. "
  110. RRECOMMENDS:${PN}-tidy += "${PN}-tools"
  111. FILES:${PN}-libclang-cpp = "${libdir}/libclang-cpp.so.*"
  112. FILES:${PN}-libclang-python = "${PYTHON_SITEPACKAGES_DIR}/clang/*"
  113. FILES:${PN}-tidy = "${bindir}/*clang-tidy*"
  114. FILES:${PN}-format = "${bindir}/*clang-format*"
  115. FILES:${PN}-tools = "${bindir}/analyze-build \
  116. ${bindir}/c-index-test \
  117. ${bindir}/clang-apply-replacements \
  118. ${bindir}/clang-change-namespace \
  119. ${bindir}/clang-check \
  120. ${bindir}/clang-doc \
  121. ${bindir}/clang-extdef-mapping \
  122. ${bindir}/clang-include-fixer \
  123. ${bindir}/clang-linker-wrapper \
  124. ${bindir}/clang-move \
  125. ${bindir}/clang-nvlink-wrapper \
  126. ${bindir}/clang-offload-bundler \
  127. ${bindir}/clang-offload-packager \
  128. ${bindir}/clang-pseudo* \
  129. ${bindir}/clang-query \
  130. ${bindir}/clang-refactor \
  131. ${bindir}/clang-rename* \
  132. ${bindir}/clang-reorder-fields \
  133. ${bindir}/clang-repl \
  134. ${bindir}/clang-scan-deps \
  135. ${bindir}/diagtool \
  136. ${bindir}/find-all-symbols \
  137. ${bindir}/hmaptool \
  138. ${bindir}/hwasan_symbolize \
  139. ${bindir}/intercept-build \
  140. ${bindir}/modularize \
  141. ${bindir}/pp-trace \
  142. ${bindir}/sancov \
  143. ${bindir}/scan-build \
  144. ${bindir}/scan-build-py \
  145. ${bindir}/scan-view \
  146. ${bindir}/split-file \
  147. ${libdir}/libscanbuild/* \
  148. ${libdir}/libear/* \
  149. ${libexecdir}/analyze-c++ \
  150. ${libexecdir}/analyze-cc \
  151. ${libexecdir}/c++-analyzer \
  152. ${libexecdir}/ccc-analyzer \
  153. ${libexecdir}/intercept-c++ \
  154. ${libexecdir}/intercept-cc \
  155. ${datadir}/scan-build/* \
  156. ${datadir}/scan-view/* \
  157. ${datadir}/opt-viewer/* \
  158. ${datadir}/clang/* \
  159. "
  160. FILES:${PN} += "\
  161. ${bindir}/clang-cl \
  162. ${libdir}/BugpointPasses.so \
  163. ${libdir}/LLVMHello.so \
  164. ${libdir}/*Plugin.so \
  165. ${libdir}/${BPN} \
  166. ${nonarch_libdir}/${BPN}/*/include/ \
  167. "
  168. FILES:libclang = "\
  169. ${libdir}/libclang.so.* \
  170. "
  171. FILES:${PN}-dev += "\
  172. ${datadir}/llvm/cmake \
  173. ${libdir}/cmake \
  174. ${nonarch_libdir}/libear \
  175. ${nonarch_libdir}/${BPN}/*.la \
  176. "
  177. FILES:${PN}-doc += "${datadir}/clang-doc"
  178. FILES:${PN}-staticdev += "${nonarch_libdir}/${BPN}/*.a"
  179. FILES:${PN}-staticdev:remove = "${libdir}/${BPN}/*.a"
  180. FILES:${PN}-dev:remove = "${libdir}/${BPN}/*.la"
  181. FILES:${PN}:remove = "${libdir}/${BPN}/*"
  182. INSANE_SKIP:${PN} += "already-stripped"
  183. #INSANE_SKIP:${PN}-dev += "dev-elf"
  184. #Avoid SSTATE_SCAN_COMMAND running sed over llvm-config.
  185. SSTATE_SCAN_FILES:remove = "*-config"
  186. COMPILER_RT:class-nativesdk:toolchain-clang = "-rtlib=libgcc --unwindlib=libgcc"
  187. LIBCPLUSPLUS:class-nativesdk:toolchain-clang = "-stdlib=libstdc++"
  188. SYSROOT_DIRS:append:class-target = " ${nonarch_libdir}"
  189. SYSROOT_PREPROCESS_FUNCS:append:class-target = " clang_sysroot_preprocess"
  190. SYSROOT_PREPROCESS_FUNCS:append:class-nativesdk = " clang_sysroot_preprocess"
  191. clang_sysroot_preprocess() {
  192. install -d ${SYSROOT_DESTDIR}${bindir}/
  193. # clang and clang-tools
  194. binaries="diagtool clang-${MAJOR_VER} clang-format clang-offload-packager
  195. clang-offload-bundler clang-scan-deps clang-repl
  196. clang-refactor clang-check clang-extdef-mapping"
  197. # clang-extra-tools
  198. binaries="${binaries} clang-apply-replacements clang-reorder-fields
  199. clang-tidy clang-change-namespace clang-doc clang-include-fixer
  200. find-all-symbols clang-move clang-query pp-trace modularize"
  201. if ${@bb.utils.contains('PACKAGECONFIG', 'clangd', 'true', 'false', d)}; then
  202. binaries="${binaries} clangd"
  203. fi
  204. for f in ${binaries}
  205. do
  206. install -m 755 ${D}${bindir}/$f ${SYSROOT_DESTDIR}${bindir}/
  207. done
  208. }