[libc-commits] [libc] [libc] Add baremetal minor archive support. (PR #203015)
Simi Pallipurath via libc-commits
libc-commits at lists.llvm.org
Wed Jun 10 08:26:01 PDT 2026
https://github.com/simpal01 created https://github.com/llvm/llvm-project/pull/203015
This adds support for building a minor LLVM libc archive on baremetal targets, such as libllvmstring.a, from only the entrypoints under a requested libc subdirectory.
When ENABLE_LLVM_LIBC_MINOR_VARIANT is enabled, the libc archive build now:
1. Requires a baremetal target.
2. Requires LLVM_LIBC_SUBARCHIVE_NAME to be set.
3. Selects only entrypoints matching that subarchive name, for example libc.src.<name>.*.
4. Builds and installs an archive using the requested name.
5. Avoids installing baremetal startup objects for minor archive builds.
This lets a minor variant provide only one category of libc routines instead of duplicating a full libc.a.
Assisted-by: codex, reviewed and cross checked, also tested with ATfE, by me.
>From 3cfc6e639428dc9421d6b33046a02e395b49754b Mon Sep 17 00:00:00 2001
From: Simi Pallipurath <simi.pallipurath at arm.com>
Date: Wed, 10 Jun 2026 13:10:15 +0100
Subject: [PATCH] [libc] Add baremetal minor archive support.
This adds support for building a minor LLVM
libc archive on baremetal targets, such as libllvmstring.a,
from only the entrypoints under a requested libc subdirectory.
When ENABLE_LLVM_LIBC_MINOR_VARIANT is enabled, the libc
archive build now:
1. Requires a baremetal target.
2. Requires LLVM_LIBC_SUBARCHIVE_NAME to be set.
3. Selects only entrypoints matching that subarchive name, for example libc.src.<name>.*.
4. Builds and installs an archive using the requested name.
5. Avoids installing baremetal startup objects for minor archive builds.
This lets a minor variant provide only one category of
libc routines instead of duplicating a full libc.a.
Assisted-by: codex, reviewed and cross checked, also tested with ATfE,
by me.
---
libc/lib/CMakeLists.txt | 62 +++++++++++++++++++++++----
libc/startup/baremetal/CMakeLists.txt | 10 +++--
2 files changed, 60 insertions(+), 12 deletions(-)
diff --git a/libc/lib/CMakeLists.txt b/libc/lib/CMakeLists.txt
index 08026e937be94..fa057c1c50137 100644
--- a/libc/lib/CMakeLists.txt
+++ b/libc/lib/CMakeLists.txt
@@ -1,15 +1,40 @@
+set(libc_subarchive_entrypoints "")
+if(ENABLE_LLVM_LIBC_MINOR_VARIANT)
+ if(NOT LIBC_TARGET_OS_IS_BAREMETAL)
+ message(FATAL_ERROR
+ "ENABLE_LLVM_LIBC_MINOR_VARIANT is only supported on baremetal targets.")
+ endif()
+ if(NOT LLVM_LIBC_SUBARCHIVE_NAME)
+ message(FATAL_ERROR
+ "ENABLE_LLVM_LIBC_MINOR_VARIANT requires LLVM_LIBC_SUBARCHIVE_NAME to be set.")
+ endif()
+endif()
+
set(libc_archive_targets "")
set(libc_archive_names "")
set(libc_archive_entrypoint_lists "")
-if(LLVM_LIBC_FULL_BUILD)
- list(APPEND libc_archive_names c m mvec)
- list(APPEND libc_archive_targets libc libm libmvec)
- list(APPEND libc_archive_entrypoint_lists
- TARGET_LIBC_ENTRYPOINTS TARGET_LIBM_ENTRYPOINTS TARGET_LIBMVEC_ENTRYPOINTS)
+if(NOT ENABLE_LLVM_LIBC_MINOR_VARIANT)
+ if(LLVM_LIBC_FULL_BUILD)
+ list(APPEND libc_archive_names c m mvec)
+ list(APPEND libc_archive_targets libc libm libmvec)
+ list(APPEND libc_archive_entrypoint_lists
+ TARGET_LIBC_ENTRYPOINTS TARGET_LIBM_ENTRYPOINTS TARGET_LIBMVEC_ENTRYPOINTS)
+ else()
+ list(APPEND libc_archive_names llvmlibc)
+ list(APPEND libc_archive_targets libc)
+ list(APPEND libc_archive_entrypoint_lists TARGET_LLVMLIBC_ENTRYPOINTS)
+ endif()
else()
- list(APPEND libc_archive_names llvmlibc)
- list(APPEND libc_archive_targets libc)
- list(APPEND libc_archive_entrypoint_lists TARGET_LLVMLIBC_ENTRYPOINTS)
+ foreach(entrypoint IN LISTS TARGET_LLVMLIBC_ENTRYPOINTS)
+ if(entrypoint MATCHES "^libc\\.src\\.${LLVM_LIBC_SUBARCHIVE_NAME}\\.")
+ list(APPEND libc_subarchive_entrypoints ${entrypoint})
+ endif()
+ endforeach()
+ if(NOT libc_subarchive_entrypoints)
+ message(FATAL_ERROR
+ "ENABLE_LLVM_LIBC_MINOR_VARIANT requires matching entrypoints for "
+ "'${LLVM_LIBC_SUBARCHIVE_NAME}'.")
+ endif()
endif()
set(added_archive_targets "")
@@ -56,6 +81,27 @@ foreach(archive IN ZIP_LISTS
endif()
endforeach()
+if(libc_subarchive_entrypoints)
+ add_entrypoint_library(
+ ${LLVM_LIBC_SUBARCHIVE_NAME}
+ DEPENDS
+ ${libc_subarchive_entrypoints}
+ )
+ set_target_properties(
+ ${LLVM_LIBC_SUBARCHIVE_NAME}
+ PROPERTIES
+ PREFIX ""
+ ARCHIVE_OUTPUT_NAME llvm${LLVM_LIBC_SUBARCHIVE_NAME}
+ )
+ if(LLVM_LIBC_FULL_BUILD)
+ target_link_libraries(${LLVM_LIBC_SUBARCHIVE_NAME} PUBLIC libc-headers)
+ if(TARGET libc-startup)
+ add_dependencies(${LLVM_LIBC_SUBARCHIVE_NAME} libc-startup)
+ endif()
+ endif()
+ list(APPEND added_archive_targets ${LLVM_LIBC_SUBARCHIVE_NAME})
+endif()
+
install(
TARGETS ${added_archive_targets}
ARCHIVE DESTINATION ${LIBC_INSTALL_LIBRARY_DIR}
diff --git a/libc/startup/baremetal/CMakeLists.txt b/libc/startup/baremetal/CMakeLists.txt
index e361000f788ea..0e50126b81bf2 100644
--- a/libc/startup/baremetal/CMakeLists.txt
+++ b/libc/startup/baremetal/CMakeLists.txt
@@ -69,7 +69,9 @@ add_custom_target(libc-startup)
set(fq_target_name libc.startup.baremetal.${LIBC_TARGET_ARCHITECTURE}.crt1)
add_dependencies(libc-startup ${fq_target_name})
-install(FILES $<TARGET_OBJECTS:${fq_target_name}>
- DESTINATION ${LIBC_INSTALL_LIBRARY_DIR}
- RENAME $<TARGET_PROPERTY:${fq_target_name},OUTPUT_NAME>
- COMPONENT libc)
+if(NOT ENABLE_LLVM_LIBC_MINOR_VARIANT)
+ install(FILES $<TARGET_OBJECTS:${fq_target_name}>
+ DESTINATION ${LIBC_INSTALL_LIBRARY_DIR}
+ RENAME $<TARGET_PROPERTY:${fq_target_name},OUTPUT_NAME>
+ COMPONENT libc)
+endif()
More information about the libc-commits
mailing list