[clang] [llvm] [cmake] Add config for riscv(32|64)-unknown-elf (PR #176353)
Ramkumar Ramachandra via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 19 07:59:48 PST 2026
https://github.com/artagnon updated https://github.com/llvm/llvm-project/pull/176353
>From 39c24174619c56623bf17254dd6cca10c987fbfe Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <artagnon at tenstorrent.com>
Date: Thu, 15 Jan 2026 16:15:39 +0000
Subject: [PATCH 1/5] [cmake] Add config for riscv(32|64)-unknown-elf
Add a config to clang/cmake/caches to document building compiler-rt for
a baremetal RISCV target. It was tested on macOS, and has necessitated
some fixes to LLVMConfig and ClangConfig: the inclusion of LLVMExports
relies on the target system supporting shared libraries, which is not
the case for a baremetal target. However, since it is not necessary,
guard the import with CMAKE_TARGET_SUPPORTS_SHARED_LIBS, which would be
completely non-functional for all non-baremetal targets. Also add
Generic-ELF to the CMAKE_SYSTEM_NAME matcher in HandleLLVMOptions, so we
can use Generic-ELF to describe the riscv(32|64)-unknown-elf targets.
Documenting building libcxx and libcxxabi for this target is left to a
follow-up.
---
clang/cmake/caches/BaremetalRISCV.cmake | 37 ++++++++++++++++++++++
clang/cmake/modules/ClangConfig.cmake.in | 4 ++-
llvm/cmake/modules/HandleLLVMOptions.cmake | 3 +-
llvm/cmake/modules/LLVMConfig.cmake.in | 2 +-
4 files changed, 43 insertions(+), 3 deletions(-)
create mode 100644 clang/cmake/caches/BaremetalRISCV.cmake
diff --git a/clang/cmake/caches/BaremetalRISCV.cmake b/clang/cmake/caches/BaremetalRISCV.cmake
new file mode 100644
index 0000000000000..bac61362f1094
--- /dev/null
+++ b/clang/cmake/caches/BaremetalRISCV.cmake
@@ -0,0 +1,37 @@
+# Build clang and compiler-rt for Baremetal RISC-V (cross-compiling)
+#
+# Use this as:
+#
+# $ cmake -GNinja -DCMAKE_BUILD_TYPE=Debug -DLLVM_ENABLE_PROJECTS=clang \
+# -DLLVM_ENABLE_RUNTIMES=compiler-rt \
+# -C../clang/cmake/caches/BaremetalRISCV.cmake ../llvm
+# $ ninja runtimes-riscv64-unknown-elf runtimes-riscv32-unknown-elf
+#
+set(TRIPLES riscv64-unknown-elf;riscv32-unknown-elf)
+set(LLVM_BUILTIN_TARGETS ${TRIPLES} CACHE STRING "")
+set(LLVM_RUNTIME_TARGETS ${TRIPLES} CACHE STRING "")
+set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ON CACHE BOOL "")
+
+foreach(target ${TRIPLES})
+ # builtins config
+ set(BUILTINS_${target}_CMAKE_BUILD_TYPE Release CACHE STRING "")
+ set(BUILTINS_${target}_CMAKE_SYSTEM_NAME Generic-ELF CACHE STRING "")
+ set(BUILTINS_${target}_COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "")
+ set(BUILTINS_${target}_COMPILER_RT_OS_DIR ${target} CACHE STRING "")
+
+ # enable compiler-rt in runtimes
+ set(RUNTIMES_${target}_ENABLE_RUNTIMES compiler-rt CACHE STRING "")
+
+ # runtimes config
+ set(RUNTIMES_${target}_CMAKE_BUILD_TYPE Release CACHE STRING "")
+ set(RUNTIMES_${target}_CMAKE_SYSTEM_NAME Generic-ELF CACHE STRING "")
+ set(RUNTIMES_${target}_COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "")
+ set(RUNTIMES_${target}_COMPILER_RT_OS_DIR ${target} CACHE STRING "")
+
+ # additional runtimes config for compiler-rt
+ set(RUNTIMES_${target}_COMPILER_RT_BUILD_LIBFUZZER OFF CACHE BOOL "")
+ set(RUNTIMES_${target}_COMPILER_RT_BUILD_PROFILE OFF CACHE BOOL "")
+ set(RUNTIMES_${target}_COMPILER_RT_BUILD_SANITIZERS OFF CACHE BOOL "")
+ set(RUNTIMES_${target}_COMPILER_RT_BUILD_XRAY OFF CACHE BOOL "")
+ set(RUNTIMES_${target}_COMPILER_RT_USE_BUILTINS_LIBRARY ON CACHE BOOL "")
+endforeach()
diff --git a/clang/cmake/modules/ClangConfig.cmake.in b/clang/cmake/modules/ClangConfig.cmake.in
index 68f723d050117..e762cc199f49b 100644
--- a/clang/cmake/modules/ClangConfig.cmake.in
+++ b/clang/cmake/modules/ClangConfig.cmake.in
@@ -13,7 +13,9 @@ set(CLANG_LINK_CLANG_DYLIB "@CLANG_LINK_CLANG_DYLIB@")
set(CLANG_DEFAULT_LINKER "@CLANG_DEFAULT_LINKER@")
# Provide all our library targets to users.
- at CLANG_CONFIG_INCLUDE_EXPORTS@
+if(CMAKE_TARGET_SUPPORTS_SHARED_LIBS)
+ @CLANG_CONFIG_INCLUDE_EXPORTS@
+endif()
# By creating clang-tablegen-targets here, subprojects that depend on Clang's
# tablegen-generated headers can always depend on this target whether building
diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake
index 8b7c8cd4028bd..675089fe56158 100644
--- a/llvm/cmake/modules/HandleLLVMOptions.cmake
+++ b/llvm/cmake/modules/HandleLLVMOptions.cmake
@@ -242,7 +242,8 @@ elseif(FUCHSIA OR UNIX OR CYGWIN)
else()
set(LLVM_HAVE_LINK_VERSION_SCRIPT 1)
endif()
-elseif(CMAKE_SYSTEM_NAME STREQUAL "Generic")
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Generic" OR
+ CMAKE_SYSTEM_NAME STREQUAL "Generic-ELF")
set(LLVM_ON_UNIX 0)
set(LLVM_HAVE_LINK_VERSION_SCRIPT 0)
else()
diff --git a/llvm/cmake/modules/LLVMConfig.cmake.in b/llvm/cmake/modules/LLVMConfig.cmake.in
index 70c807abea98a..9d050b8d21d41 100644
--- a/llvm/cmake/modules/LLVMConfig.cmake.in
+++ b/llvm/cmake/modules/LLVMConfig.cmake.in
@@ -144,7 +144,7 @@ set(LLVM_ENABLE_SHARED_LIBS @BUILD_SHARED_LIBS@)
set(LLVM_DEFAULT_EXTERNAL_LIT "@LLVM_CONFIG_DEFAULT_EXTERNAL_LIT@")
set(LLVM_LIT_ARGS "@LLVM_LIT_ARGS@")
-if(NOT TARGET LLVMSupport)
+if(NOT TARGET LLVMSupport AND CMAKE_TARGET_SUPPORTS_SHARED_LIBS)
@LLVM_CONFIG_INCLUDE_EXPORTS@
@llvm_config_include_buildtree_only_exports@
endif()
>From 137c1edd7b748d6284f09fe9bc2700c5fef38941 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <artagnon at tenstorrent.com>
Date: Fri, 16 Jan 2026 15:11:58 +0000
Subject: [PATCH 2/5] [cmake] Fix issues with patch
---
clang/cmake/caches/BaremetalRISCV.cmake | 2 ++
clang/cmake/modules/ClangConfig.cmake.in | 2 +-
llvm/CMakeLists.txt | 3 +++
llvm/cmake/modules/LLVMConfig.cmake.in | 2 +-
4 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/clang/cmake/caches/BaremetalRISCV.cmake b/clang/cmake/caches/BaremetalRISCV.cmake
index bac61362f1094..5830268c48b1a 100644
--- a/clang/cmake/caches/BaremetalRISCV.cmake
+++ b/clang/cmake/caches/BaremetalRISCV.cmake
@@ -18,6 +18,7 @@ foreach(target ${TRIPLES})
set(BUILTINS_${target}_CMAKE_SYSTEM_NAME Generic-ELF CACHE STRING "")
set(BUILTINS_${target}_COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "")
set(BUILTINS_${target}_COMPILER_RT_OS_DIR ${target} CACHE STRING "")
+ set(BUILTINS_${target}_LLVM_CONFIG_NO_EXPORTS ON CACHE BOOL "")
# enable compiler-rt in runtimes
set(RUNTIMES_${target}_ENABLE_RUNTIMES compiler-rt CACHE STRING "")
@@ -27,6 +28,7 @@ foreach(target ${TRIPLES})
set(RUNTIMES_${target}_CMAKE_SYSTEM_NAME Generic-ELF CACHE STRING "")
set(RUNTIMES_${target}_COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_OS_DIR ${target} CACHE STRING "")
+ set(RUNTIMES_${target}_LLVM_CONFIG_NO_EXPORTS ON CACHE BOOL "")
# additional runtimes config for compiler-rt
set(RUNTIMES_${target}_COMPILER_RT_BUILD_LIBFUZZER OFF CACHE BOOL "")
diff --git a/clang/cmake/modules/ClangConfig.cmake.in b/clang/cmake/modules/ClangConfig.cmake.in
index e762cc199f49b..65e9b53d8fa6b 100644
--- a/clang/cmake/modules/ClangConfig.cmake.in
+++ b/clang/cmake/modules/ClangConfig.cmake.in
@@ -13,7 +13,7 @@ set(CLANG_LINK_CLANG_DYLIB "@CLANG_LINK_CLANG_DYLIB@")
set(CLANG_DEFAULT_LINKER "@CLANG_DEFAULT_LINKER@")
# Provide all our library targets to users.
-if(CMAKE_TARGET_SUPPORTS_SHARED_LIBS)
+if(NOT LLVM_CONFIG_NO_EXPORTS)
@CLANG_CONFIG_INCLUDE_EXPORTS@
endif()
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index 9954053591d30..98fbbda958c99 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -894,6 +894,9 @@ else()
option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin only)" OFF)
endif()
+option(LLVM_CONFIG_NO_EXPORTS "Suppress exports in CMake package" OFF)
+mark_as_advanced(LLVM_CONFIG_NO_EXPORTS)
+
# Used to test building the llvm shared library with explicit symbol visibility on
# Windows and Linux. For ELF platforms default symbols visibility is set to hidden.
set(LLVM_BUILD_LLVM_DYLIB_VIS FALSE CACHE BOOL "")
diff --git a/llvm/cmake/modules/LLVMConfig.cmake.in b/llvm/cmake/modules/LLVMConfig.cmake.in
index 9d050b8d21d41..60c9cc3c3093f 100644
--- a/llvm/cmake/modules/LLVMConfig.cmake.in
+++ b/llvm/cmake/modules/LLVMConfig.cmake.in
@@ -144,7 +144,7 @@ set(LLVM_ENABLE_SHARED_LIBS @BUILD_SHARED_LIBS@)
set(LLVM_DEFAULT_EXTERNAL_LIT "@LLVM_CONFIG_DEFAULT_EXTERNAL_LIT@")
set(LLVM_LIT_ARGS "@LLVM_LIT_ARGS@")
-if(NOT TARGET LLVMSupport AND CMAKE_TARGET_SUPPORTS_SHARED_LIBS)
+if((NOT TARGET LLVMSupport) AND (NOT LLVM_CONFIG_NO_EXPORTS))
@LLVM_CONFIG_INCLUDE_EXPORTS@
@llvm_config_include_buildtree_only_exports@
endif()
>From fdccdaae12f40d3591e4484c7f0ed8e00760b0a8 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <artagnon at tenstorrent.com>
Date: Fri, 16 Jan 2026 22:33:03 +0000
Subject: [PATCH 3/5] [BaremetalRISCV] Address some nits
---
clang/cmake/caches/BaremetalRISCV.cmake | 6 +++---
llvm/cmake/modules/HandleLLVMOptions.cmake | 3 +--
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/clang/cmake/caches/BaremetalRISCV.cmake b/clang/cmake/caches/BaremetalRISCV.cmake
index 5830268c48b1a..dada72dfafaff 100644
--- a/clang/cmake/caches/BaremetalRISCV.cmake
+++ b/clang/cmake/caches/BaremetalRISCV.cmake
@@ -1,4 +1,4 @@
-# Build clang and compiler-rt for Baremetal RISC-V (cross-compiling)
+# Build clang and compiler-rt targeting Baremetal RISC-V (cross-compiling)
#
# Use this as:
#
@@ -15,7 +15,7 @@ set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ON CACHE BOOL "")
foreach(target ${TRIPLES})
# builtins config
set(BUILTINS_${target}_CMAKE_BUILD_TYPE Release CACHE STRING "")
- set(BUILTINS_${target}_CMAKE_SYSTEM_NAME Generic-ELF CACHE STRING "")
+ set(BUILTINS_${target}_CMAKE_SYSTEM_NAME Generic CACHE STRING "")
set(BUILTINS_${target}_COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "")
set(BUILTINS_${target}_COMPILER_RT_OS_DIR ${target} CACHE STRING "")
set(BUILTINS_${target}_LLVM_CONFIG_NO_EXPORTS ON CACHE BOOL "")
@@ -25,7 +25,7 @@ foreach(target ${TRIPLES})
# runtimes config
set(RUNTIMES_${target}_CMAKE_BUILD_TYPE Release CACHE STRING "")
- set(RUNTIMES_${target}_CMAKE_SYSTEM_NAME Generic-ELF CACHE STRING "")
+ set(RUNTIMES_${target}_CMAKE_SYSTEM_NAME Generic CACHE STRING "")
set(RUNTIMES_${target}_COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_OS_DIR ${target} CACHE STRING "")
set(RUNTIMES_${target}_LLVM_CONFIG_NO_EXPORTS ON CACHE BOOL "")
diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake
index 675089fe56158..8b7c8cd4028bd 100644
--- a/llvm/cmake/modules/HandleLLVMOptions.cmake
+++ b/llvm/cmake/modules/HandleLLVMOptions.cmake
@@ -242,8 +242,7 @@ elseif(FUCHSIA OR UNIX OR CYGWIN)
else()
set(LLVM_HAVE_LINK_VERSION_SCRIPT 1)
endif()
-elseif(CMAKE_SYSTEM_NAME STREQUAL "Generic" OR
- CMAKE_SYSTEM_NAME STREQUAL "Generic-ELF")
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Generic")
set(LLVM_ON_UNIX 0)
set(LLVM_HAVE_LINK_VERSION_SCRIPT 0)
else()
>From 201971ff4b4f443cad380e1edffb4d4382af2081 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <artagnon at tenstorrent.com>
Date: Fri, 16 Jan 2026 23:17:58 +0000
Subject: [PATCH 4/5] BaremetalRISCV: fix some issues
---
clang/cmake/caches/BaremetalRISCV.cmake | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)
diff --git a/clang/cmake/caches/BaremetalRISCV.cmake b/clang/cmake/caches/BaremetalRISCV.cmake
index dada72dfafaff..96b81c8ff7735 100644
--- a/clang/cmake/caches/BaremetalRISCV.cmake
+++ b/clang/cmake/caches/BaremetalRISCV.cmake
@@ -1,4 +1,4 @@
-# Build clang and compiler-rt targeting Baremetal RISC-V (cross-compiling)
+# Build compiler-rt for Baremetal RISC-V (cross-compiling)
#
# Use this as:
#
@@ -10,7 +10,6 @@
set(TRIPLES riscv64-unknown-elf;riscv32-unknown-elf)
set(LLVM_BUILTIN_TARGETS ${TRIPLES} CACHE STRING "")
set(LLVM_RUNTIME_TARGETS ${TRIPLES} CACHE STRING "")
-set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ON CACHE BOOL "")
foreach(target ${TRIPLES})
# builtins config
@@ -29,11 +28,4 @@ foreach(target ${TRIPLES})
set(RUNTIMES_${target}_COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_OS_DIR ${target} CACHE STRING "")
set(RUNTIMES_${target}_LLVM_CONFIG_NO_EXPORTS ON CACHE BOOL "")
-
- # additional runtimes config for compiler-rt
- set(RUNTIMES_${target}_COMPILER_RT_BUILD_LIBFUZZER OFF CACHE BOOL "")
- set(RUNTIMES_${target}_COMPILER_RT_BUILD_PROFILE OFF CACHE BOOL "")
- set(RUNTIMES_${target}_COMPILER_RT_BUILD_SANITIZERS OFF CACHE BOOL "")
- set(RUNTIMES_${target}_COMPILER_RT_BUILD_XRAY OFF CACHE BOOL "")
- set(RUNTIMES_${target}_COMPILER_RT_USE_BUILTINS_LIBRARY ON CACHE BOOL "")
endforeach()
>From 18b04d299faf52e645f650dff834006a0e601199 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <artagnon at tenstorrent.com>
Date: Mon, 19 Jan 2026 15:58:00 +0000
Subject: [PATCH 5/5] [BaremetalRISCV] Broken on macOS without hack; revert
hack
---
clang/cmake/caches/BaremetalRISCV.cmake | 4 ++--
clang/cmake/modules/ClangConfig.cmake.in | 4 +---
llvm/CMakeLists.txt | 3 ---
llvm/cmake/modules/LLVMConfig.cmake.in | 2 +-
4 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/clang/cmake/caches/BaremetalRISCV.cmake b/clang/cmake/caches/BaremetalRISCV.cmake
index 96b81c8ff7735..daa19b38b08d9 100644
--- a/clang/cmake/caches/BaremetalRISCV.cmake
+++ b/clang/cmake/caches/BaremetalRISCV.cmake
@@ -7,6 +7,8 @@
# -C../clang/cmake/caches/BaremetalRISCV.cmake ../llvm
# $ ninja runtimes-riscv64-unknown-elf runtimes-riscv32-unknown-elf
#
+# Tested on Linux host; doesn't work on macOS host.
+#
set(TRIPLES riscv64-unknown-elf;riscv32-unknown-elf)
set(LLVM_BUILTIN_TARGETS ${TRIPLES} CACHE STRING "")
set(LLVM_RUNTIME_TARGETS ${TRIPLES} CACHE STRING "")
@@ -17,7 +19,6 @@ foreach(target ${TRIPLES})
set(BUILTINS_${target}_CMAKE_SYSTEM_NAME Generic CACHE STRING "")
set(BUILTINS_${target}_COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "")
set(BUILTINS_${target}_COMPILER_RT_OS_DIR ${target} CACHE STRING "")
- set(BUILTINS_${target}_LLVM_CONFIG_NO_EXPORTS ON CACHE BOOL "")
# enable compiler-rt in runtimes
set(RUNTIMES_${target}_ENABLE_RUNTIMES compiler-rt CACHE STRING "")
@@ -27,5 +28,4 @@ foreach(target ${TRIPLES})
set(RUNTIMES_${target}_CMAKE_SYSTEM_NAME Generic CACHE STRING "")
set(RUNTIMES_${target}_COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "")
set(RUNTIMES_${target}_COMPILER_RT_OS_DIR ${target} CACHE STRING "")
- set(RUNTIMES_${target}_LLVM_CONFIG_NO_EXPORTS ON CACHE BOOL "")
endforeach()
diff --git a/clang/cmake/modules/ClangConfig.cmake.in b/clang/cmake/modules/ClangConfig.cmake.in
index 65e9b53d8fa6b..68f723d050117 100644
--- a/clang/cmake/modules/ClangConfig.cmake.in
+++ b/clang/cmake/modules/ClangConfig.cmake.in
@@ -13,9 +13,7 @@ set(CLANG_LINK_CLANG_DYLIB "@CLANG_LINK_CLANG_DYLIB@")
set(CLANG_DEFAULT_LINKER "@CLANG_DEFAULT_LINKER@")
# Provide all our library targets to users.
-if(NOT LLVM_CONFIG_NO_EXPORTS)
- @CLANG_CONFIG_INCLUDE_EXPORTS@
-endif()
+ at CLANG_CONFIG_INCLUDE_EXPORTS@
# By creating clang-tablegen-targets here, subprojects that depend on Clang's
# tablegen-generated headers can always depend on this target whether building
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index 98fbbda958c99..9954053591d30 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -894,9 +894,6 @@ else()
option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin only)" OFF)
endif()
-option(LLVM_CONFIG_NO_EXPORTS "Suppress exports in CMake package" OFF)
-mark_as_advanced(LLVM_CONFIG_NO_EXPORTS)
-
# Used to test building the llvm shared library with explicit symbol visibility on
# Windows and Linux. For ELF platforms default symbols visibility is set to hidden.
set(LLVM_BUILD_LLVM_DYLIB_VIS FALSE CACHE BOOL "")
diff --git a/llvm/cmake/modules/LLVMConfig.cmake.in b/llvm/cmake/modules/LLVMConfig.cmake.in
index 60c9cc3c3093f..70c807abea98a 100644
--- a/llvm/cmake/modules/LLVMConfig.cmake.in
+++ b/llvm/cmake/modules/LLVMConfig.cmake.in
@@ -144,7 +144,7 @@ set(LLVM_ENABLE_SHARED_LIBS @BUILD_SHARED_LIBS@)
set(LLVM_DEFAULT_EXTERNAL_LIT "@LLVM_CONFIG_DEFAULT_EXTERNAL_LIT@")
set(LLVM_LIT_ARGS "@LLVM_LIT_ARGS@")
-if((NOT TARGET LLVMSupport) AND (NOT LLVM_CONFIG_NO_EXPORTS))
+if(NOT TARGET LLVMSupport)
@LLVM_CONFIG_INCLUDE_EXPORTS@
@llvm_config_include_buildtree_only_exports@
endif()
More information about the cfe-commits
mailing list