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