llvm.mk 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. ################################################################################
  2. #
  3. # llvm
  4. #
  5. ################################################################################
  6. LLVM_VERSION = $(LLVM_PROJECT_VERSION)
  7. LLVM_SITE = $(LLVM_PROJECT_SITE)
  8. LLVM_SOURCE = llvm-$(LLVM_VERSION).src.tar.xz
  9. LLVM_LICENSE = Apache-2.0 with exceptions
  10. LLVM_LICENSE_FILES = LICENSE.TXT
  11. LLVM_CPE_ID_VENDOR = llvm
  12. LLVM_SUPPORTS_IN_SOURCE_BUILD = NO
  13. LLVM_INSTALL_STAGING = YES
  14. HOST_LLVM_DEPENDENCIES = host-python3 host-llvm-cmake
  15. LLVM_DEPENDENCIES = host-llvm
  16. # Path to cmake modules from host-llvm-cmake
  17. HOST_LLVM_CONF_OPTS += -DCMAKE_MODULE_PATH=$(HOST_DIR)/lib/cmake/llvm
  18. LLVM_CONF_OPTS += -DCMAKE_MODULE_PATH=$(HOST_DIR)/lib/cmake/llvm
  19. # Don't build clang libcxx libcxxabi lldb compiler-rt lld polly as llvm subprojects
  20. # This flag assumes that projects are checked out side-by-side and not nested
  21. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_PROJECTS=""
  22. LLVM_CONF_OPTS += -DLLVM_ENABLE_PROJECTS=""
  23. HOST_LLVM_CONF_OPTS += -DLLVM_CCACHE_BUILD=$(if $(BR2_CCACHE),ON,OFF)
  24. LLVM_CONF_OPTS += -DLLVM_CCACHE_BUILD=$(if $(BR2_CCACHE),ON,OFF)
  25. # This option prevents AddLLVM.cmake from adding $ORIGIN/../lib to
  26. # binaries. Otherwise, llvm-config (host variant installed in STAGING)
  27. # will try to use target's libc.
  28. HOST_LLVM_CONF_OPTS += -DCMAKE_INSTALL_RPATH="$(HOST_DIR)/lib"
  29. # Get target architecture
  30. LLVM_TARGET_ARCH = $(call qstrip,$(BR2_PACKAGE_LLVM_TARGET_ARCH))
  31. # Build backend for target architecture. This include backends like
  32. # AMDGPU. We need to special case RISCV.
  33. ifneq ($(filter riscv%,$(LLVM_TARGET_ARCH)),)
  34. LLVM_TARGETS_TO_BUILD = RISCV
  35. else
  36. LLVM_TARGETS_TO_BUILD = $(LLVM_TARGET_ARCH)
  37. endif
  38. HOST_LLVM_CONF_OPTS += -DLLVM_TARGETS_TO_BUILD="$(subst $(space),;,$(LLVM_TARGETS_TO_BUILD))"
  39. LLVM_CONF_OPTS += -DLLVM_TARGETS_TO_BUILD="$(subst $(space),;,$(LLVM_TARGETS_TO_BUILD))"
  40. # LLVM target to use for native code generation. This is required for JIT generation.
  41. # It must be set to LLVM_TARGET_ARCH for host and target, otherwise we get
  42. # "No available targets are compatible for this triple" with llvmpipe when host
  43. # and target architectures are different.
  44. HOST_LLVM_CONF_OPTS += -DLLVM_TARGET_ARCH=$(LLVM_TARGET_ARCH)
  45. LLVM_CONF_OPTS += -DLLVM_TARGET_ARCH=$(LLVM_TARGET_ARCH)
  46. # Build AMDGPU backend
  47. # We need to build AMDGPU backend for both host and target because
  48. # llvm-config --targets built (host variant installed in STAGING) will
  49. # output only $(LLVM_TARGET_ARCH) if not, and mesa3d won't build as
  50. # it thinks AMDGPU backend is not installed on the target.
  51. ifeq ($(BR2_PACKAGE_LLVM_AMDGPU),y)
  52. LLVM_TARGETS_TO_BUILD += AMDGPU
  53. endif
  54. # Build BPF backend
  55. ifeq ($(BR2_PACKAGE_LLVM_BPF),y)
  56. LLVM_TARGETS_TO_BUILD += BPF
  57. endif
  58. # Use native llvm-tblgen from host-llvm (needed for cross-compilation)
  59. LLVM_CONF_OPTS += -DLLVM_TABLEGEN=$(HOST_DIR)/bin/llvm-tblgen
  60. # Use native llvm-config from host-llvm (needed for cross-compilation)
  61. LLVM_CONF_OPTS += -DLLVM_CONFIG_PATH=$(HOST_DIR)/bin/llvm-config
  62. # BUILD_SHARED_LIBS has a misleading name. It is in fact an option for
  63. # LLVM developers to build all LLVM libraries as separate shared libraries.
  64. # For normal use of LLVM, it is recommended to build a single
  65. # shared library, which is achieved by BUILD_SHARED_LIBS=OFF and
  66. # LLVM_BUILD_LLVM_DYLIB=ON.
  67. HOST_LLVM_CONF_OPTS += -DBUILD_SHARED_LIBS=OFF
  68. LLVM_CONF_OPTS += -DBUILD_SHARED_LIBS=OFF
  69. # Generate libLLVM.so. This library contains a default set of LLVM components
  70. # that can be overwritten with "LLVM_DYLIB_COMPONENTS". The default contains
  71. # most of LLVM and is defined in "tools/llvm-shlib/CMakelists.txt".
  72. HOST_LLVM_CONF_OPTS += -DLLVM_BUILD_LLVM_DYLIB=ON
  73. LLVM_CONF_OPTS += -DLLVM_BUILD_LLVM_DYLIB=ON
  74. # LLVM_BUILD_LLVM_DYLIB to ON. We need to enable this option for the
  75. # host as llvm-config for the host will be used in STAGING_DIR by packages
  76. # linking against libLLVM and if this option is not selected, then llvm-config
  77. # does not work properly. For example, it assumes that LLVM is built statically
  78. # and cannot find libLLVM.so.
  79. HOST_LLVM_CONF_OPTS += -DLLVM_LINK_LLVM_DYLIB=ON
  80. LLVM_CONF_OPTS += -DLLVM_LINK_LLVM_DYLIB=ON
  81. LLVM_CONF_OPTS += -DCMAKE_CROSSCOMPILING=1
  82. # Disabled for the host since no host-libedit.
  83. # Fall back to "Simple fgets-based implementation" of llvm line editor.
  84. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_LIBEDIT=OFF
  85. LLVM_CONF_OPTS += -DLLVM_ENABLE_LIBEDIT=OFF
  86. # We want to install llvm libraries and modules.
  87. HOST_LLVM_CONF_OPTS += -DLLVM_INSTALL_TOOLCHAIN_ONLY=OFF
  88. LLVM_CONF_OPTS += -DLLVM_INSTALL_TOOLCHAIN_ONLY=OFF
  89. # We build from a release archive without vcs files.
  90. HOST_LLVM_CONF_OPTS += -DLLVM_APPEND_VC_REV=OFF
  91. LLVM_CONF_OPTS += -DLLVM_APPEND_VC_REV=OFF
  92. # No backtrace package in Buildroot.
  93. # https://documentation.backtrace.io
  94. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_BACKTRACES=OFF
  95. LLVM_CONF_OPTS += -DLLVM_ENABLE_BACKTRACES=OFF
  96. # Enable signal handlers overrides support.
  97. HOST_LLVM_CONF_OPTS += -DENABLE_CRASH_OVERRIDES=ON
  98. LLVM_CONF_OPTS += -DENABLE_CRASH_OVERRIDES=ON
  99. # Disable ffi for now.
  100. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_FFI=OFF
  101. LLVM_CONF_OPTS += -DLLVM_ENABLE_FFI=OFF
  102. # Disable terminfo database (needs ncurses libtinfo.so)
  103. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_TERMINFO=OFF
  104. LLVM_CONF_OPTS += -DLLVM_ENABLE_TERMINFO=OFF
  105. # Enable thread support
  106. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_THREADS=ON
  107. LLVM_CONF_OPTS += -DLLVM_ENABLE_THREADS=ON
  108. # Enable optional host-zlib support for LLVM Machine Code (llvm-mc) to add
  109. # compression/uncompression capabilities.
  110. # Not needed on the target.
  111. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_ZLIB=ON
  112. HOST_LLVM_DEPENDENCIES += host-zlib
  113. LLVM_CONF_OPTS += -DLLVM_ENABLE_ZLIB=OFF
  114. # libxml2 can be disabled as it is used for LLVM Windows builds where COFF
  115. # files include manifest info
  116. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_LIBXML2=OFF
  117. LLVM_CONF_OPTS += -DLLVM_ENABLE_LIBXML2=OFF
  118. # Disable optional Z3Prover since there is no such package in Buildroot.
  119. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_Z3_SOLVER=OFF
  120. LLVM_CONF_OPTS += -DLLVM_ENABLE_Z3_SOLVER=OFF
  121. # We don't use llvm for static only build, so enable PIC
  122. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_PIC=ON
  123. LLVM_CONF_OPTS += -DLLVM_ENABLE_PIC=ON
  124. # Default is Debug build, which requires considerably more disk space and
  125. # build time. Release build is selected for host and target because the linker
  126. # can run out of memory in Debug mode.
  127. HOST_LLVM_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release
  128. LLVM_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release
  129. # Compile llvm with the C++14 (ISO C++ 2014 standard).
  130. HOST_LLVM_CONF_OPTS += -DCMAKE_CXX_STANDARD=14
  131. LLVM_CONF_OPTS += -DCMAKE_CXX_STANDARD=14
  132. # Disabled, requires sys/ndir.h header
  133. # Disable debug in module
  134. HOST_LLVM_CONF_OPTS += \
  135. -DLLVM_ENABLE_MODULES=OFF \
  136. -DLLVM_ENABLE_MODULE_DEBUGGING=OFF
  137. LLVM_CONF_OPTS += \
  138. -DLLVM_ENABLE_MODULES=OFF \
  139. -DLLVM_ENABLE_MODULE_DEBUGGING=OFF
  140. # Don't change the standard library to libc++.
  141. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_LIBCXX=OFF
  142. LLVM_CONF_OPTS += -DLLVM_ENABLE_LIBCXX=OFF
  143. # Don't use lld as a linker.
  144. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_LLD=OFF
  145. LLVM_CONF_OPTS += -DLLVM_ENABLE_LLD=OFF
  146. # Generate code for the target. LLVM selects a target by looking at the
  147. # toolchain tuple
  148. HOST_LLVM_CONF_OPTS += -DLLVM_DEFAULT_TARGET_TRIPLE=$(GNU_TARGET_NAME)
  149. LLVM_CONF_OPTS += -DLLVM_DEFAULT_TARGET_TRIPLE=$(GNU_TARGET_NAME)
  150. # LLVM_HOST_TRIPLE has a misleading name, it is in fact the triple of the
  151. # system where llvm is going to run on. We need to specify triple for native
  152. # code generation on the target.
  153. # This solves "No available targets are compatible for this triple" with llvmpipe
  154. LLVM_CONF_OPTS += -DLLVM_HOST_TRIPLE=$(GNU_TARGET_NAME)
  155. # Building the Go and OCaml bindings is yet unsupported.
  156. HOST_LLVM_CONF_OPTS += \
  157. -DLLVM_ENABLE_BINDINGS=OFF
  158. # Builds a release host tablegen that gets used during the LLVM build.
  159. HOST_LLVM_CONF_OPTS += -DLLVM_OPTIMIZED_TABLEGEN=ON
  160. # Keep llvm utility binaries for the host. llvm-tblgen is built anyway as
  161. # CMakeLists.txt has add_subdirectory(utils/TableGen) unconditionally.
  162. HOST_LLVM_CONF_OPTS += \
  163. -DLLVM_BUILD_UTILS=ON \
  164. -DLLVM_INCLUDE_UTILS=ON \
  165. -DLLVM_INSTALL_UTILS=ON
  166. LLVM_CONF_OPTS += \
  167. -DLLVM_BUILD_UTILS=OFF \
  168. -DLLVM_INCLUDE_UTILS=OFF \
  169. -DLLVM_INSTALL_UTILS=OFF
  170. HOST_LLVM_CONF_OPTS += \
  171. -DLLVM_INCLUDE_TOOLS=ON \
  172. -DLLVM_BUILD_TOOLS=ON
  173. # We need to activate LLVM_INCLUDE_TOOLS, otherwise it does not generate
  174. # libLLVM.so
  175. LLVM_CONF_OPTS += \
  176. -DLLVM_INCLUDE_TOOLS=ON
  177. ifeq ($(BR2_PACKAGE_LLVM_RTTI),y)
  178. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_RTTI=ON
  179. LLVM_CONF_OPTS += -DLLVM_ENABLE_RTTI=ON
  180. else
  181. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_RTTI=OFF
  182. LLVM_CONF_OPTS += -DLLVM_ENABLE_RTTI=OFF
  183. endif
  184. HOST_LLVM_CONF_OPTS += -DLLVM_ENABLE_DUMP=OFF
  185. ifeq ($(BR2_PACKAGE_LLVM_DUMP),y)
  186. LLVM_CONF_OPTS += -DLLVM_ENABLE_DUMP=ON
  187. else
  188. LLVM_CONF_OPTS += -DLLVM_ENABLE_DUMP=OFF
  189. endif
  190. # Compiler-rt not in the source tree.
  191. # llvm runtime libraries are not in the source tree.
  192. # Polly is not in the source tree.
  193. HOST_LLVM_CONF_OPTS += \
  194. -DLLVM_BUILD_EXTERNAL_COMPILER_RT=OFF \
  195. -DLLVM_BUILD_RUNTIME=OFF \
  196. -DLLVM_INCLUDE_RUNTIMES=OFF
  197. LLVM_CONF_OPTS += \
  198. -DLLVM_BUILD_EXTERNAL_COMPILER_RT=OFF \
  199. -DLLVM_BUILD_RUNTIME=OFF \
  200. -DLLVM_INCLUDE_RUNTIMES=OFF
  201. HOST_LLVM_CONF_OPTS += \
  202. -DLLVM_ENABLE_WARNINGS=ON \
  203. -DLLVM_ENABLE_PEDANTIC=ON \
  204. -DLLVM_ENABLE_WERROR=OFF
  205. LLVM_CONF_OPTS += \
  206. -DLLVM_ENABLE_WARNINGS=ON \
  207. -DLLVM_ENABLE_PEDANTIC=ON \
  208. -DLLVM_ENABLE_WERROR=OFF
  209. HOST_LLVM_CONF_OPTS += \
  210. -DLLVM_BUILD_EXAMPLES=OFF \
  211. -DLLVM_BUILD_DOCS=OFF \
  212. -DLLVM_BUILD_TESTS=OFF \
  213. -DLLVM_ENABLE_DOXYGEN=OFF \
  214. -DLLVM_ENABLE_OCAMLDOC=OFF \
  215. -DLLVM_ENABLE_SPHINX=OFF \
  216. -DLLVM_INCLUDE_EXAMPLES=OFF \
  217. -DLLVM_INCLUDE_DOCS=OFF \
  218. -DLLVM_INCLUDE_GO_TESTS=OFF \
  219. -DLLVM_INCLUDE_TESTS=OFF \
  220. -DLLVM_INCLUDE_BENCHMARKS=OFF
  221. LLVM_CONF_OPTS += \
  222. -DLLVM_BUILD_EXAMPLES=OFF \
  223. -DLLVM_BUILD_DOCS=OFF \
  224. -DLLVM_BUILD_TESTS=OFF \
  225. -DLLVM_ENABLE_DOXYGEN=OFF \
  226. -DLLVM_ENABLE_OCAMLDOC=OFF \
  227. -DLLVM_ENABLE_SPHINX=OFF \
  228. -DLLVM_INCLUDE_EXAMPLES=OFF \
  229. -DLLVM_INCLUDE_DOCS=OFF \
  230. -DLLVM_INCLUDE_GO_TESTS=OFF \
  231. -DLLVM_INCLUDE_TESTS=OFF \
  232. -DLLVM_INCLUDE_BENCHMARKS=OFF
  233. # Copy llvm-config (host variant) to STAGING_DIR
  234. # llvm-config (host variant) returns include and lib directories
  235. # for the host if it's installed in host/bin:
  236. # output/host/bin/llvm-config --includedir
  237. # output/host/include
  238. # When installed in STAGING_DIR, llvm-config returns include and lib
  239. # directories from STAGING_DIR.
  240. # output/staging/usr/bin/llvm-config --includedir
  241. # output/staging/usr/include
  242. define LLVM_COPY_LLVM_CONFIG_TO_STAGING_DIR
  243. $(INSTALL) -D -m 0755 $(HOST_DIR)/bin/llvm-config \
  244. $(STAGING_DIR)/usr/bin/llvm-config
  245. endef
  246. HOST_LLVM_POST_INSTALL_HOOKS = LLVM_COPY_LLVM_CONFIG_TO_STAGING_DIR
  247. # The llvm-symbolizer binary is used by the Compiler-RT Fuzzer
  248. # and AddressSanitizer tools on the target for stack traces.
  249. # If we set -DLLVM_BUILD_TOOLS=ON this will also install the llvm-config
  250. # target binary to STAGING_DIR, which means we can no longer run it.
  251. # Therefore, overwrite it again with the host llvm-config.
  252. ifeq ($(BR2_PACKAGE_COMPILER_RT),y)
  253. LLVM_CONF_OPTS += \
  254. -DLLVM_BUILD_TOOLS=ON
  255. LLVM_POST_INSTALL_STAGING_HOOKS = LLVM_COPY_LLVM_CONFIG_TO_STAGING_DIR
  256. else
  257. LLVM_CONF_OPTS += \
  258. -DLLVM_BUILD_TOOLS=OFF
  259. endif
  260. # By default llvm-tblgen is built and installed on the target but it is
  261. # not necessary. Also erase LLVMHello.so from /usr/lib
  262. define LLVM_DELETE_LLVM_TBLGEN_TARGET
  263. rm -f $(TARGET_DIR)/usr/bin/llvm-tblgen $(TARGET_DIR)/usr/lib/LLVMHello.so
  264. endef
  265. LLVM_POST_INSTALL_TARGET_HOOKS = LLVM_DELETE_LLVM_TBLGEN_TARGET
  266. $(eval $(cmake-package))
  267. $(eval $(host-cmake-package))