[clang] [libc] [llvm] [libc][Github] Perform baremetal libc builds (PR #167583)

Petr Hosek via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 14 07:47:05 PST 2025


================
@@ -0,0 +1,54 @@
+# Expects target triple to be passed as `ARCH_TRIPLE`
+# A sample invocation:
+#
+# cmake -S . -B build \
+#   -DCMAKE_CXX_COMPILER=/usr/bin/clang \
+#   -DCMAKE_C_COMPILER=/usr/bin/clang++ \
+#   -DCMAKE_BUILD_TYPE=MinSizeRel \
+#   -DCMAKE_C_COMPILER_LAUNCHER=ccache \
+#   -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
+#   -DARCH_TRIPLE=riscv32-unknown-elf \
+#   -G Ninja \
+#   -S runtimes \
+#   -C libc/cmake/caches/Standalone_libc_baremetal.cmake
+
+set(CMAKE_SYSTEM_NAME Generic CACHE STRING "")
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY CACHE STRING "")
+set(LLVM_ENABLE_RUNTIMES "libc" CACHE STRING "")
+set(LLVM_INCLUDE_TESTS OFF CACHE BOOL "")
+set(CMAKE_C_COMPILER_WORKS ON CACHE BOOL "")
+set(CMAKE_CXX_COMPILER_WORKS ON CACHE BOOL "")
+set(CMAKE_SYSROOT "" CACHE STRING "")
+
+set(CMAKE_C_COMPILER_TARGET ${ARCH_TRIPLE} CACHE STRING "")
+set(CMAKE_CXX_COMPILER_TARGET ${ARCH_TRIPLE} CACHE STRING "")
+set(CMAKE_ASM_COMPILER_TARGET ${ARCH_TRIPLE} CACHE STRING "")
+set(LLVM_DEFAULT_TARGET_TRIPLE ${ARCH_TRIPLE} CACHE STRING "")
+set(LIBC_TARGET_TRIPLE ${ARCH_TRIPLE} CACHE STRING "")
+
+set(LLVM_LIBC_FULL_BUILD "ON" CACHE BOOL "")
+
+if(ARCH_TRIPLE MATCHES "^arm.*")
+  set(CMAKE_SYSTEM_PROCESSOR arm CACHE STRING "")
+endif()
+if(ARCH_TRIPLE MATCHES "^riscv.*")
+  set(CMAKE_SYSTEM_PROCESSOR RISCV CACHE STRING "")
+endif()
+
+foreach(lang C;CXX;ASM)
+  if(${ARCH_TRIPLE} STREQUAL "armv6m-none-eabi")
+    set(CMAKE_${lang}_FLAGS "-march=armv6m -mcpu=cortex-m0plus -mfloat-abi=soft -Wno-atomic-alignment \"-Dvfprintf(stream, format, vlist)=vprintf(format, vlist)\" \"-Dfprintf(stream, format, ...)=printf(format)\" \"-Dfputs(string, stream)=puts(string)\" -D_LIBCPP_PRINT=1" CACHE STRING "")
+  endif()
+  if(${ARCH_TRIPLE} STREQUAL "armv7m-none-eabi")
+    set(CMAKE_${lang}_FLAGS "-march=armv7m -mcpu=cortex-m4 -mfloat-abi=soft -Wno-atomic-alignment \"-Dvfprintf(stream, format, vlist)=vprintf(format, vlist)\" \"-Dfprintf(stream, format, ...)=printf(format)\" \"-Dfputs(string, stream)=puts(string)\" -D_LIBCPP_PRINT=1" CACHE STRING "")
+  endif()
+  if(${ARCH_TRIPLE} STREQUAL "armv7em-none-eabi")
+    set(CMAKE_${lang}_FLAGS "-march=armv7em -mcpu=cortex-m4 -mfloat-abi=soft -Wno-atomic-alignment \"-Dvfprintf(stream, format, vlist)=vprintf(format, vlist)\" \"-Dfprintf(stream, format, ...)=printf(format)\" \"-Dfputs(string, stream)=puts(string)\" -D_LIBCPP_PRINT=1" CACHE STRING "")
+  endif()
+  if(${ARCH_TRIPLE} STREQUAL "armv8m.main-none-eabi")
+    set(CMAKE_${lang}_FLAGS "-mfloat-abi=softfp -march=armv8m.main+fp+dsp -mcpu=cortex-m33" CACHE STRING "")
+  endif()
+  if(${ARCH_TRIPLE} STREQUAL "armv8.1m.main-none-eabi")
+    set(CMAKE_${lang}_FLAGS "-mfloat-abi=hard -march=armv8.1-m.main+mve.fp+fp.dp -mcpu=cortex-m55" CACHE STRING "")
+  endif()
+endforeach()
----------------
petrhosek wrote:

I'd split these into separate files, i.e. we would have a file with common flags (above) such as `baremetal.cmake` and then per-target files like `armv6m_none_eabi.cmake` which have `include(baremetal.cmake)`. See https://github.com/raspberrypi/pico-sdk/blob/master/cmake/preload/toolchains/pico_arm_cortex_m33_clang.cmake for an example of this approach.

https://github.com/llvm/llvm-project/pull/167583


More information about the llvm-commits mailing list