https://github.com/androm3da updated https://github.com/llvm/llvm-project/pull/201207
>From ea240269bbb901367e1acad7375e3f7521edb015 Mon Sep 17 00:00:00 2001 From: Brian Cain <[email protected]> Date: Mon, 1 Jun 2026 18:37:04 -0700 Subject: [PATCH] [Hexagon] Add cmake cache files for cross-toolchain distribution build Add and extend clang/cmake/caches/hexagon-unknown-linux-musl-clang* to drive install-distribution builds: host tools, per-target builtins, and runtimes for hexagon-unknown-linux-musl. --- .../caches/generic-allow-shared-imports.cmake | 11 ++ ...-unknown-linux-musl-clang-cross-dist.cmake | 32 ++++ ...known-linux-musl-clang-defaults-dist.cmake | 15 ++ ...exagon-unknown-linux-musl-clang-dist.cmake | 180 ++++++++++++++++++ ...-unknown-linux-musl-clang-dylib-dist.cmake | 10 + 5 files changed, 248 insertions(+) create mode 100644 clang/cmake/caches/generic-allow-shared-imports.cmake create mode 100644 clang/cmake/caches/hexagon-unknown-linux-musl-clang-cross-dist.cmake create mode 100644 clang/cmake/caches/hexagon-unknown-linux-musl-clang-defaults-dist.cmake create mode 100644 clang/cmake/caches/hexagon-unknown-linux-musl-clang-dist.cmake create mode 100644 clang/cmake/caches/hexagon-unknown-linux-musl-clang-dylib-dist.cmake diff --git a/clang/cmake/caches/generic-allow-shared-imports.cmake b/clang/cmake/caches/generic-allow-shared-imports.cmake new file mode 100644 index 0000000000000..50f336a23b8a0 --- /dev/null +++ b/clang/cmake/caches/generic-allow-shared-imports.cmake @@ -0,0 +1,11 @@ +# Override Platform/Generic.cmake's TARGET_SUPPORTS_SHARED_LIBS=FALSE. +# +# The baremetal builtins ExternalProject (CMAKE_SYSTEM_NAME=Generic) does +# find_package(LLVM) which loads LLVMExports.cmake. That file declares +# host-only shared libraries (LTO, Remarks) as SHARED IMPORTED targets. +# CMake 4.x rejects these on platforms where TARGET_SUPPORTS_SHARED_LIBS +# is FALSE, even though the builtins build never links against them. +# +# Loaded via CMAKE_PROJECT_INCLUDE so it runs after project() (which loads +# Platform/Generic.cmake) but before find_package(LLVM). +set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE) diff --git a/clang/cmake/caches/hexagon-unknown-linux-musl-clang-cross-dist.cmake b/clang/cmake/caches/hexagon-unknown-linux-musl-clang-cross-dist.cmake new file mode 100644 index 0000000000000..64c3fa2fcb467 --- /dev/null +++ b/clang/cmake/caches/hexagon-unknown-linux-musl-clang-cross-dist.cmake @@ -0,0 +1,32 @@ +# Cross-compilation additions: sysroot and clang symlinks — distribution build +# +# Loaded after hexagon-unknown-linux-musl-clang-dist.cmake to add +# cross-toolchain specifics. + +set(DEFAULT_SYSROOT "../target/hexagon-unknown-linux-musl/" CACHE STRING "") + +set(CLANG_LINKS_TO_CREATE + hexagon-linux-musl-clang++ + hexagon-linux-musl-clang + hexagon-unknown-linux-musl-clang++ + hexagon-unknown-linux-musl-clang + hexagon-none-elf-clang++ + hexagon-none-elf-clang + hexagon-unknown-none-elf-clang++ + hexagon-unknown-none-elf-clang + hexagon-h2-clang++ + hexagon-h2-clang + hexagon-unknown-h2-clang++ + hexagon-unknown-h2-clang + hexagon-unknown-h2-elf-clang++ + hexagon-unknown-h2-elf-clang + hexagon-h2-elf-clang++ + hexagon-h2-elf-clang + hexagon-qurt-clang++ + hexagon-qurt-clang + hexagon-unknown-qurt-clang++ + hexagon-unknown-qurt-clang + clang++ + clang-cl + clang-cpp + CACHE STRING "") diff --git a/clang/cmake/caches/hexagon-unknown-linux-musl-clang-defaults-dist.cmake b/clang/cmake/caches/hexagon-unknown-linux-musl-clang-defaults-dist.cmake new file mode 100644 index 0000000000000..9136a26c5f778 --- /dev/null +++ b/clang/cmake/caches/hexagon-unknown-linux-musl-clang-defaults-dist.cmake @@ -0,0 +1,15 @@ +# Clang defaults for Hexagon Linux (musl) cross-compilation — distribution build. +# +# Used by build-toolchain.sh for the full install-distribution build path. +# Load this before hexagon-unknown-linux-musl-clang-dist.cmake. +# +# Sets the compiler driver defaults so that plain `clang` invocations +# target hexagon-unknown-linux-musl with the expected runtime libraries. + + +set(LLVM_DEFAULT_TARGET_TRIPLE "hexagon-unknown-linux-musl" CACHE STRING "") +set(CLANG_DEFAULT_CXX_STDLIB "libc++" CACHE STRING "") +set(CLANG_DEFAULT_RTLIB "compiler-rt" CACHE STRING "") +set(CLANG_DEFAULT_UNWINDLIB "libunwind" CACHE STRING "") +set(CLANG_DEFAULT_LINKER "lld" CACHE STRING "") +set(CLANG_DEFAULT_OBJCOPY "llvm-objcopy" CACHE STRING "") diff --git a/clang/cmake/caches/hexagon-unknown-linux-musl-clang-dist.cmake b/clang/cmake/caches/hexagon-unknown-linux-musl-clang-dist.cmake new file mode 100644 index 0000000000000..66c40e694d119 --- /dev/null +++ b/clang/cmake/caches/hexagon-unknown-linux-musl-clang-dist.cmake @@ -0,0 +1,180 @@ +# Clang + LLVM host toolchain for Hexagon cross-compilation — distribution build +# +# Configures a distribution build of clang/lld/llvm-tools targeting +# hexagon-unknown-linux-musl, including per-target compiler-rt builtins +# and runtimes (libcxx/libcxxabi/libunwind/compiler-rt sanitizers). +# +# Usage (native host build): +# cmake -G Ninja \ +# -C clang/cmake/caches/hexagon-unknown-linux-musl-clang-defaults-dist.cmake \ +# -C clang/cmake/caches/hexagon-unknown-linux-musl-clang-dist.cmake \ +# -C clang/cmake/caches/hexagon-unknown-linux-musl-clang-cross-dist.cmake \ +# -DCMAKE_INSTALL_PREFIX=<prefix> \ +# -B <build> -S llvm +# cmake --build <build> --target install-distribution +# cmake --build <build> --target install-builtins # after musl headers +# cmake --build <build> --target install-runtimes-hexagon-unknown-linux-musl +# +# For zig cross-builds also add: +# -C clang/cmake/caches/hexagon-unknown-linux-musl-clang-dylib-dist.cmake + +set(LLVM_TARGETS_TO_BUILD "Hexagon" CACHE STRING "") +set(LLVM_ENABLE_PROJECTS "clang;lld" CACHE STRING "") +set(CMAKE_BUILD_TYPE Release CACHE STRING "") +set(LLVM_ENABLE_PIC ON CACHE BOOL "") + +# LLVM dylib is not needed for the cross-toolchain distribution. +# Kept OFF for consistency with ELD's static LLVM linkage (libLW.so). +set(LLVM_BUILD_LLVM_DYLIB OFF CACHE BOOL "") +set(LLVM_LINK_LLVM_DYLIB OFF CACHE BOOL "") +set(LLVM_VERSION_SUFFIX "" CACHE STRING "") + +set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib" CACHE STRING "") + +# Trim +set(LLVM_INSTALL_TOOLCHAIN_ONLY ON CACHE BOOL "") +set(LLVM_INCLUDE_TESTS OFF CACHE BOOL "") +set(LLVM_INCLUDE_DOCS OFF CACHE BOOL "") +set(LLVM_ENABLE_ZLIB ON CACHE BOOL "") +set(LLVM_ENABLE_ZSTD ON CACHE BOOL "") + +# Distribution components -- installed via `--target install-distribution` +set(LLVM_TOOLCHAIN_TOOLS + llvm-addr2line + llvm-ar + llvm-config + llvm-cov + llvm-cxxfilt + llvm-dwarfdump + llvm-mc + llvm-nm + llvm-objcopy + llvm-objdump + llvm-profdata + llvm-ranlib + llvm-readelf + llvm-readobj + llvm-size + llvm-strings + llvm-strip + llvm-symbolizer + CACHE STRING "") + +set(LLVM_DISTRIBUTION_COMPONENTS + clang + clang-resource-headers + lld + LTO + ${LLVM_TOOLCHAIN_TOOLS} + CACHE STRING "") +# Note: builtins are NOT in LLVM_DISTRIBUTION_COMPONENTS because the +# hexagon-unknown-linux-musl builtins need musl headers (stdlib.h) which +# are installed later. Build builtins explicitly via: +# cmake --build <build> --target install-builtins + +# -- Per-target builtins ----------------------------------------------- +set(LLVM_BUILTIN_TARGETS "hexagon-unknown-linux-musl;hexagon-unknown-none-elf" CACHE STRING "") + +# Linux builtins (see compiler-rt/cmake/caches/hexagon-linux-builtins.cmake) +# CMAKE_SYSROOT is needed because the build-tree clang doesn't resolve the +# relative DEFAULT_SYSROOT correctly; musl headers must be installed first. +set(BUILTINS_hexagon-unknown-linux-musl_CMAKE_SYSTEM_NAME Linux CACHE STRING "") +set(BUILTINS_hexagon-unknown-linux-musl_CMAKE_BUILD_TYPE Release CACHE STRING "") +set(BUILTINS_hexagon-unknown-linux-musl_CMAKE_SYSROOT + "${CMAKE_INSTALL_PREFIX}/target/hexagon-unknown-linux-musl" CACHE STRING "") +set(BUILTINS_hexagon-unknown-linux-musl_CMAKE_ASM_FLAGS "-G0 -mlong-calls -fno-pic" CACHE STRING "") +set(BUILTINS_hexagon-unknown-linux-musl_COMPILER_RT_BUILTINS_ENABLE_PIC OFF CACHE BOOL "") + +# Baremetal builtins (see compiler-rt/cmake/caches/hexagon-builtins-baremetal.cmake) +set(BUILTINS_hexagon-unknown-none-elf_CMAKE_SYSTEM_NAME Generic CACHE STRING "") +set(BUILTINS_hexagon-unknown-none-elf_CMAKE_BUILD_TYPE Release CACHE STRING "") +set(BUILTINS_hexagon-unknown-none-elf_CMAKE_ASM_FLAGS "-G0 -mlong-calls -fno-pic" CACHE STRING "") +set(BUILTINS_hexagon-unknown-none-elf_CMAKE_C_FLAGS "-ffreestanding" CACHE STRING "") +set(BUILTINS_hexagon-unknown-none-elf_CMAKE_CXX_FLAGS "-ffreestanding" CACHE STRING "") +set(BUILTINS_hexagon-unknown-none-elf_COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "") +set(BUILTINS_hexagon-unknown-none-elf_COMPILER_RT_BUILTINS_ENABLE_PIC OFF CACHE BOOL "") +# CMake 4.x + Generic platform rejects SHARED IMPORTED targets from +# find_package(LLVM). Override after project() so the declarations succeed. +set(BUILTINS_hexagon-unknown-none-elf_CMAKE_PROJECT_INCLUDE + "${CMAKE_CURRENT_LIST_DIR}/generic-allow-shared-imports.cmake" CACHE STRING "") + +# -- Per-target runtimes (built AFTER musl, via separate build target) - +set(LLVM_RUNTIME_TARGETS "hexagon-unknown-linux-musl" CACHE STRING "") + +# Sysroot path for musl headers -- populated by musl build before runtimes. +set(RUNTIMES_hexagon-unknown-linux-musl_CMAKE_SYSTEM_NAME Linux CACHE STRING "") +set(RUNTIMES_hexagon-unknown-linux-musl_CMAKE_BUILD_TYPE Release CACHE STRING "") +set(RUNTIMES_hexagon-unknown-linux-musl_CMAKE_SYSROOT + "${CMAKE_INSTALL_PREFIX}/target/hexagon-unknown-linux-musl" CACHE STRING "") +# Note: CMAKE_TRY_COMPILE_TARGET_TYPE is intentionally NOT set to STATIC_LIBRARY +# here. Runtimes configure lazily (at cmake --build time), after musl+builtins +# are fully installed, so cmake can do real link tests. This avoids false +# positives from check_library_exists() (e.g. __cxa_thread_atexit_impl). + +# Runtimes to build (see libcxx/cmake/caches/hexagon-linux-runtimes.cmake +# and compiler-rt/cmake/caches/hexagon-linux-clangrt.cmake) +set(RUNTIMES_hexagon-unknown-linux-musl_LLVM_ENABLE_RUNTIMES + "libcxx;libcxxabi;libunwind;compiler-rt" CACHE STRING "") + +# Per-target runtime dirs OFF -- the Hexagon driver overrides getCompilerRTPath() +# to return ${SysRoot}/usr/lib/ and searches there with arch-suffix naming +# (libclang_rt.<name>-hexagon.{a,so}). Per-target ON would install to a +# <triple>/ subdirectory that the driver doesn't search. All install dirs +# below are set explicitly, so the per-target default paths don't matter. +set(RUNTIMES_hexagon-unknown-linux-musl_LLVM_ENABLE_PER_TARGET_RUNTIME_DIR OFF CACHE BOOL "") + +# compiler-rt sanitizer/xray/memprof libraries -> sysroot lib dir. +# The Hexagon driver's getCompilerRTPath() returns ${SysRoot}/usr/lib/, +# so compiler-rt libraries must be installed there with arch-suffix names. +# Headers stay in the resource dir (COMPILER_RT_INSTALL_INCLUDE_DIR default). +set(RUNTIMES_hexagon-unknown-linux-musl_COMPILER_RT_INSTALL_LIBRARY_DIR + "target/hexagon-unknown-linux-musl/usr/lib" CACHE PATH "") + +# libc++/libcxxabi/libunwind headers and libraries -> sysroot. +# Paths are relative to CMAKE_INSTALL_PREFIX (the host toolchain root). +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXX_INSTALL_LIBRARY_DIR + "target/hexagon-unknown-linux-musl/usr/lib" CACHE STRING "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXX_INSTALL_INCLUDE_DIR + "target/hexagon-unknown-linux-musl/usr/include/c++/v1" CACHE STRING "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXX_INSTALL_INCLUDE_TARGET_DIR + "target/hexagon-unknown-linux-musl/usr/include/c++/v1" CACHE STRING "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXXABI_INSTALL_LIBRARY_DIR + "target/hexagon-unknown-linux-musl/usr/lib" CACHE STRING "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXXABI_INSTALL_INCLUDE_DIR + "target/hexagon-unknown-linux-musl/usr/include/c++/v1" CACHE STRING "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBUNWIND_INSTALL_LIBRARY_DIR + "target/hexagon-unknown-linux-musl/usr/lib" CACHE STRING "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBUNWIND_INSTALL_INCLUDE_DIR + "target/hexagon-unknown-linux-musl/usr/include" CACHE STRING "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXX_HAS_MUSL_LIBC ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXX_INCLUDE_BENCHMARKS OFF CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXX_INCLUDE_TESTS OFF CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXXABI_INCLUDE_TESTS OFF CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBUNWIND_INCLUDE_TESTS OFF CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXX_CXX_ABI libcxxabi CACHE STRING "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXXABI_USE_LLVM_UNWINDER ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXXABI_ENABLE_SHARED ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXX_USE_COMPILER_RT ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBCXXABI_USE_COMPILER_RT ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_COMPILER_RT_USE_LLVM_UNWINDER ON CACHE BOOL "") +# compiler-rt sanitizer/xray shared libs need in-tree libc++ and builtins. +# Following Fuchsia's runtimes configuration pattern: +# - COMPILER_RT_CXX_LIBRARY=libcxx: in-tree libc++ headers for C++ sources (XRay) +# - SANITIZER_CXX_ABI=libc++ + INTREE: link sanitizer .so against in-tree libc++abi +# - COMPILER_RT_USE_BUILTINS_LIBRARY=ON: statically links builtins into each +# compiler-rt runtime (via AddCompilerRT.cmake's add_compiler_rt_runtime), +# needed because Hexagon uses library calls for division (__hexagon_udivsi3 +# etc.) and also removes -Wl,-z,defs for any remaining deferred symbols +set(RUNTIMES_hexagon-unknown-linux-musl_COMPILER_RT_CXX_LIBRARY "libcxx" CACHE STRING "") +set(RUNTIMES_hexagon-unknown-linux-musl_COMPILER_RT_USE_BUILTINS_LIBRARY ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_SANITIZER_CXX_ABI "libc++" CACHE STRING "") +set(RUNTIMES_hexagon-unknown-linux-musl_SANITIZER_CXX_ABI_INTREE ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_COMPILER_RT_BUILD_BUILTINS OFF CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_COMPILER_RT_BUILD_SANITIZERS ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_COMPILER_RT_BUILD_XRAY ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_COMPILER_RT_BUILD_PROFILE ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_COMPILER_RT_BUILD_GWP_ASAN ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_COMPILER_RT_BUILD_LIBFUZZER ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_COMPILER_RT_BUILD_MEMPROF ON CACHE BOOL "") +set(RUNTIMES_hexagon-unknown-linux-musl_COMPILER_RT_BUILD_CTX_PROFILE ON CACHE BOOL "") diff --git a/clang/cmake/caches/hexagon-unknown-linux-musl-clang-dylib-dist.cmake b/clang/cmake/caches/hexagon-unknown-linux-musl-clang-dylib-dist.cmake new file mode 100644 index 0000000000000..b653a159faeed --- /dev/null +++ b/clang/cmake/caches/hexagon-unknown-linux-musl-clang-dylib-dist.cmake @@ -0,0 +1,10 @@ +# LLVM dylib settings for distribution cross-builds +# +# Loaded after hexagon-unknown-linux-musl-clang-dist.cmake to override the +# static linking defaults. ELD is incompatible with dylib (libLW.so +# conflicts with libLLVM.so), so ELD must be excluded when this cache +# is used. + +set(LLVM_BUILD_LLVM_DYLIB ON CACHE BOOL "") +set(LLVM_LINK_LLVM_DYLIB ON CACHE BOOL "") +set(CLANG_LINK_LLVM_DYLIB ON CACHE BOOL "") _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
