################################################################################ # # clang # ################################################################################ # LLVM, Clang and lld should be version bumped together CLANG_VERSION_MAJOR = 11 CLANG_VERSION = $(CLANG_VERSION_MAJOR).1.0 CLANG_SITE = https://github.com/llvm/llvm-project/releases/download/llvmorg-$(CLANG_VERSION) CLANG_SOURCE = clang-$(CLANG_VERSION).src.tar.xz CLANG_LICENSE = Apache-2.0 with exceptions CLANG_LICENSE_FILES = LICENSE.TXT CLANG_CPE_ID_VENDOR = llvm CLANG_SUPPORTS_IN_SOURCE_BUILD = NO CLANG_INSTALL_STAGING = YES HOST_CLANG_DEPENDENCIES = host-llvm host-libxml2 CLANG_DEPENDENCIES = llvm host-clang # LLVM >= 9.0 will soon require C++14 support, building llvm 8.x using a # toolchain using gcc < 5.1 gives an error but actually still works. Setting # this option makes it still build with gcc >= 4.8. # https://reviews.llvm.org/D57264 HOST_CLANG_CONF_OPTS += -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON CLANG_CONF_OPTS += -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON # This option is needed, otherwise multiple shared libs # (libclangAST.so, libclangBasic.so, libclangFrontend.so, etc.) will # be generated. As a final shared lib containing all these components # (libclang.so) is also generated, this resulted in the following # error when trying to use tools that use libclang: # $ CommandLine Error: Option 'track-memory' registered more than once! # $ LLVM ERROR: inconsistency in registered CommandLine options # By setting BUILD_SHARED_LIBS to OFF, we generate multiple static # libraries (the same way as host's clang build) and finally # libclang.so to be installed on the target. HOST_CLANG_CONF_OPTS += -DBUILD_SHARED_LIBS=OFF CLANG_CONF_OPTS += -DBUILD_SHARED_LIBS=OFF # Default is Debug build, which requires considerably more disk space # and build time. Release build is selected for host and target # because the linker can run out of memory in Debug mode. HOST_CLANG_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release CLANG_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release CLANG_CONF_OPTS += -DCMAKE_CROSSCOMPILING=1 # We need to build tools because libclang is a tool HOST_CLANG_CONF_OPTS += -DCLANG_BUILD_TOOLS=ON CLANG_CONF_OPTS += -DCLANG_BUILD_TOOLS=ON HOST_CLANG_CONF_OPTS += \ -DCLANG_BUILD_EXAMPLES=OFF \ -DCLANG_INCLUDE_DOCS=OFF \ -DCLANG_INCLUDE_TESTS=OFF CLANG_CONF_OPTS += \ -DCLANG_BUILD_EXAMPLES=OFF \ -DCLANG_INCLUDE_DOCS=OFF \ -DCLANG_INCLUDE_TESTS=OFF HOST_CLANG_CONF_OPTS += -DLLVM_DIR=$(HOST_DIR)/lib/cmake/llvm \ -DCLANG_DEFAULT_LINKER=$(TARGET_LD) CLANG_CONF_OPTS += -DLLVM_DIR=$(STAGING_DIR)/usr/lib/cmake/llvm \ -DCLANG_TABLEGEN:FILEPATH=$(HOST_DIR)/bin/clang-tblgen \ -DLLVM_TABLEGEN_EXE:FILEPATH=$(HOST_DIR)/bin/llvm-tblgen # Clang can't be used as compiler on the target since there are no # development files (headers) and other build tools. So remove clang # binaries and some other unnecessary files from target. CLANG_FILES_TO_REMOVE = \ /usr/bin/clang* \ /usr/bin/c-index-test \ /usr/bin/git-clang-format \ /usr/bin/scan-build \ /usr/bin/scan-view \ /usr/libexec/c++-analyzer \ /usr/libexec/ccc-analyzer \ /usr/share/clang \ /usr/share/opt-viewer \ /usr/share/scan-build \ /usr/share/scan-view \ /usr/share/man/man1/scan-build.1 \ /usr/lib/clang define CLANG_CLEANUP_TARGET rm -rf $(addprefix $(TARGET_DIR),$(CLANG_FILES_TO_REMOVE)) endef CLANG_POST_INSTALL_TARGET_HOOKS += CLANG_CLEANUP_TARGET # clang-tblgen is not installed by default, however it is necessary # for cross-compiling clang define HOST_CLANG_INSTALL_CLANG_TBLGEN $(INSTALL) -D -m 0755 $(HOST_CLANG_BUILDDIR)/bin/clang-tblgen \ $(HOST_DIR)/bin/clang-tblgen endef HOST_CLANG_POST_INSTALL_HOOKS = HOST_CLANG_INSTALL_CLANG_TBLGEN # This option must be enabled to link libclang dynamically against libLLVM.so HOST_CLANG_CONF_OPTS += -DLLVM_LINK_LLVM_DYLIB=ON CLANG_CONF_OPTS += -DLLVM_LINK_LLVM_DYLIB=ON # Prevent clang binaries from linking against LLVM static libs HOST_CLANG_CONF_OPTS += -DLLVM_DYLIB_COMPONENTS=all CLANG_CONF_OPTS += -DLLVM_DYLIB_COMPONENTS=all # Help host-clang to find our external toolchain, use a relative path from the clang # installation directory to the external toolchain installation directory in order to # not hardcode the toolchain absolute path. ifeq ($(BR2_TOOLCHAIN_EXTERNAL),y) HOST_CLANG_CONF_OPTS += -DGCC_INSTALL_PREFIX:PATH=`realpath --relative-to=$(HOST_DIR)/bin/ $(TOOLCHAIN_EXTERNAL_INSTALL_DIR)` endif define HOST_CLANG_INSTALL_WRAPPER_AND_SIMPLE_SYMLINKS $(Q)cd $(HOST_DIR)/bin; \ rm -f clang-$(CLANG_VERSION_MAJOR).br_real; \ mv clang-$(CLANG_VERSION_MAJOR) clang-$(CLANG_VERSION_MAJOR).br_real; \ ln -sf toolchain-wrapper-clang clang-$(CLANG_VERSION_MAJOR); \ for i in clang clang++ clang-cl clang-cpp; do \ ln -snf toolchain-wrapper-clang $$i; \ ln -snf clang-$(CLANG_VERSION_MAJOR).br_real $$i.br_real; \ done endef define HOST_CLANG_TOOLCHAIN_WRAPPER_BUILD $(HOSTCC) $(HOST_CFLAGS) $(TOOLCHAIN_WRAPPER_ARGS) \ -s -Wl,--hash-style=$(TOOLCHAIN_WRAPPER_HASH_STYLE) \ toolchain/toolchain-wrapper.c \ -o $(@D)/toolchain-wrapper-clang endef define HOST_CLANG_TOOLCHAIN_WRAPPER_INSTALL $(INSTALL) -D -m 0755 $(@D)/toolchain-wrapper-clang \ $(HOST_DIR)/bin/toolchain-wrapper-clang endef HOST_CLANG_TOOLCHAIN_WRAPPER_ARGS += -DBR_CROSS_PATH_SUFFIX='".br_real"' HOST_CLANG_POST_BUILD_HOOKS += HOST_CLANG_TOOLCHAIN_WRAPPER_BUILD HOST_CLANG_POST_INSTALL_HOOKS += HOST_CLANG_TOOLCHAIN_WRAPPER_INSTALL HOST_CLANG_POST_INSTALL_HOOKS += HOST_CLANG_INSTALL_WRAPPER_AND_SIMPLE_SYMLINKS $(eval $(cmake-package)) $(eval $(host-cmake-package))