[libc-commits] [libc] [libc][cmake] Fix and enhance LibcParseArguments and add unified libc_log helper (PR #232089)

Pavel Labath via libc-commits libc-commits at lists.llvm.org
Thu Oct 15 02:24:07 PDT 2026


================
@@ -29,59 +139,81 @@ set(LLVM_LIBC_MULTI_VALUE_ARGS
   ENV
   DEPENDS
   FLAGS
+  ADD_FLAGS
   ARGS
   LOADER_ARGS
 )
 
+# Generate OVERLAY_<arg> and FULL_BUILD_<arg> variants for every base argument.
 foreach(arg_list LLVM_LIBC_OPTIONAL_ARGS LLVM_LIBC_SINGLE_VALUE_ARGS LLVM_LIBC_MULTI_VALUE_ARGS)
   list(TRANSFORM ${arg_list}
     PREPEND "OVERLAY_"
-    OUTPUT_VARIABLE ${arg_list}_OVERLAY
+    OUTPUT_VARIABLE OVERLAY_${arg_list}
   )
   list(TRANSFORM ${arg_list}
     PREPEND "FULL_BUILD_"
-    OUTPUT_VARIABLE ${arg_list}_FULL_BUILD
+    OUTPUT_VARIABLE FULL_BUILD_${arg_list}
   )
-  set(${arg_list}_COMPLETE ${${arg_list}} ${${arg_list}_OVERLAY} ${${arg_list}_FULL_BUILD})
+  set(${arg_list}_COMPLETE ${${arg_list}} ${OVERLAY_${arg_list}} ${FULL_BUILD_${arg_list}})
 endforeach()
 
+# Parse arguments and automatically merge mode-specific options into the
+# canonical <name_prefix>_<argument> variables.
 macro(llvm_libc_parse_arguments name_prefix)
   cmake_parse_arguments(
     ${name_prefix}
-    "${LLVM_LIBC_OPTIONAL_ARGS_COMPLETE}"
-    "${LLVM_LIBC_SINGLE_VALUE_ARGS_COMPLETE}"
+    "${LLVM_LIBC_COMMON_OPTIONAL_ARGS};${LLVM_LIBC_OPTIONAL_ARGS_COMPLETE}"
+    "${LLVM_LIBC_COMMON_SINGLE_VALUE_ARGS};${LLVM_LIBC_SINGLE_VALUE_ARGS_COMPLETE}"
     "${LLVM_LIBC_MULTI_VALUE_ARGS_COMPLETE}"
     ${ARGN}
   )
 
-  # Collect overlay and full build args
-  foreach(argument IN LISTS LLVM_LIBC_OPTIONAL_ARGS LLVM_LIBC_SINGLE_VALUE_ARGS LLVM_LIBC_MULTI_VALUE_ARGS)
+  if(NOT ${name_prefix}_BUILD_MODE)
     if(LLVM_LIBC_FULL_BUILD)
-      if(${name_prefix}_${argument}_FULL_BUILD)
-        list(APPEND ${name_prefix}_${argument} ${${name_prefix}_${argument}_FULL_BUILD})
-      endif()
+      set(${name_prefix}_BUILD_MODE "FULL_BUILD")
     else()
-      if(${name_prefix}_${argument}_OVERLAY)
-        list(APPEND ${name_prefix}_${argument} ${${name_prefix}_${argument}_OVERLAY})
-      endif()
+      set(${name_prefix}_BUILD_MODE "OVERLAY")
+    endif()
+  elseif(NOT (${name_prefix}_BUILD_MODE STREQUAL "FULL_BUILD" OR ${name_prefix}_BUILD_MODE STREQUAL "OVERLAY"))
+    message(FATAL_ERROR "Invalid BUILD_MODE '${${name_prefix}_BUILD_MODE}'. Expected 'FULL_BUILD' or 'OVERLAY'.")
+  endif()
+
+  # Merge mode-specific optional and single-value arguments (override base value).
+  foreach(argument IN LISTS LLVM_LIBC_OPTIONAL_ARGS LLVM_LIBC_SINGLE_VALUE_ARGS)
+    if(${name_prefix}_${${name_prefix}_BUILD_MODE}_${argument})
+      set(${name_prefix}_${argument} "${${name_prefix}_${${name_prefix}_BUILD_MODE}_${argument}}")
+      libc_log(DEPS "${name_prefix}: overriding ${argument} with ${${name_prefix}_BUILD_MODE}_${argument}=${${name_prefix}_${argument}}")
----------------
labath wrote:

Maybe it be better to forbid overriding optional and single value args altogether? Is there a use case for it?
It seems to me that if one wants and argument to have different values in full vs. overlay mode, one should just say so...

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


More information about the libc-commits mailing list