[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}}")
+ endif()
+ endforeach()
+
+ # Merge mode-specific multi-value arguments (append to base list).
+ foreach(argument IN LISTS LLVM_LIBC_MULTI_VALUE_ARGS)
+ if(${name_prefix}_${${name_prefix}_BUILD_MODE}_${argument})
+ list(APPEND ${name_prefix}_${argument} ${${name_prefix}_${${name_prefix}_BUILD_MODE}_${argument}})
+ libc_log(DEPS "${name_prefix}: appending ${${name_prefix}_BUILD_MODE}_${argument} to ${argument}: ${${name_prefix}_${argument}}")
----------------
labath wrote:
All this indirection makes the code hard to follow. I'm thinking... could this be a function instead of a macro? Then, it could use regular unprefixed names internally and just publish (`set(PARENT_SCOPE)`) the result as a last step. WDYT?
https://github.com/llvm/llvm-project/pull/232089
More information about the libc-commits
mailing list