[libc-commits] [libc] [libc][NFC] Add cmake facility to unify the way we parse arguments. (PR #156922)

via libc-commits libc-commits at lists.llvm.org
Thu Sep 4 09:48:35 PDT 2025


https://github.com/lntue updated https://github.com/llvm/llvm-project/pull/156922

>From 9d6ff481f95703e8038f4b543d74dd72701d8a17 Mon Sep 17 00:00:00 2001
From: Tue Ly <lntue.h at gmail.com>
Date: Thu, 4 Sep 2025 16:35:14 +0000
Subject: [PATCH 1/2] [libc][NFC] Add cmake facility to unify the way we parse
 arguments.

---
 libc/cmake/modules/LibcParseArguments.cmake | 87 +++++++++++++++++++++
 1 file changed, 87 insertions(+)
 create mode 100644 libc/cmake/modules/LibcParseArguments.cmake

diff --git a/libc/cmake/modules/LibcParseArguments.cmake b/libc/cmake/modules/LibcParseArguments.cmake
new file mode 100644
index 0000000000000..68287358a0389
--- /dev/null
+++ b/libc/cmake/modules/LibcParseArguments.cmake
@@ -0,0 +1,87 @@
+set(LLVM_LIBC_OPTIONAL_ARGS
+  ALIAS
+  PUBLIC
+  NO_GPU_BUNDLE
+  NO_RUN_POSTBUILD
+  C_TEST
+  NEED_MPFR
+  NEED_MPC
+  IS_GPU_BENCHMARK
+)
+
+set(LLVM_LIBC_SINGLE_VALUE_ARGS
+  CXX_STANDARD
+  SUITE
+  CREATE_TARGET_FUNCTION
+  HDR
+  DEST_HDR
+  YAML_FILE
+  GEN_HDR
+  NAME
+)
+
+set(LLVM_LIBC_MULTI_VALUE_ARGS
+  HDRS
+  SRCS
+  COMPILE_OPTIONS
+  LINK_OPTIONS
+  LINK_LIBRARIES
+  ENV
+  DEPENDS
+  FLAGS
+  ARGS
+  LOADER_ARGS
+)
+
+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
+  )
+  list(TRANSFORM ${arg_list}
+    PREPEND "FULL_BUILD_"
+    OUTPUT_VARIABLE ${arg_list}_FULL_BUILD
+  )
+  set(${arg_list}_COMPLETE ${arg_list} ${arg_list}_OVERLAY ${arg_list}_FULL_BUILD)
+endforeach()
+
+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_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(LLVM_LIBC_FULL_BUILD)
+      if(${name_prefix}_${argument}_FULL_BUILD)
+        list(APPEND ${name_prefix}_${argument} ${name_prefix}_${argument}_FULL_BUILD)
+      endif()
+    else()
+      if(${name_prefix}_${argument}_OVERLAY)
+        list(APPEND ${name_prefix}_${argument} ${name_prefix}_${argument}_OVERLAY)
+      endif()
+    endif()
+  endforeach()
+endmacro()
+
+# Forward all arguments that can be used for llvm_libc_parse_arguments again.
+# Assume that *_OVERLAY and *_FULL_BUILD args have been merged properly.
+macro(forward_arguments name_prefix output)
+  set(${output} "")
+  
+  foreach(argument ${LLVM_LIBC_OPTIONAL_ARGS})
+    if(${name_prefix}_${argument})
+      list(APPEND output ${argument})
+    endif()
+  endforeach()
+
+  foreach(argument ${LLVM_LIBC_SINGLE_VALUE_ARGS} ${LLVM_LIBC_MULTI_VALUE_ARGS})
+    if(${name_prefix}_${argument})
+      list(APPEND output ${argument} "${name_prefix}_${argument}")
+    endif()
+  endforeach()
+endmacro()

>From ee6195cec81a0c976181d9abf9abdaa444f68d25 Mon Sep 17 00:00:00 2001
From: Tue Ly <lntue.h at gmail.com>
Date: Thu, 4 Sep 2025 16:47:46 +0000
Subject: [PATCH 2/2] Appending the values, not the variable names.

---
 libc/cmake/modules/LibcParseArguments.cmake | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/libc/cmake/modules/LibcParseArguments.cmake b/libc/cmake/modules/LibcParseArguments.cmake
index 68287358a0389..ef4a2aff0ce82 100644
--- a/libc/cmake/modules/LibcParseArguments.cmake
+++ b/libc/cmake/modules/LibcParseArguments.cmake
@@ -42,7 +42,7 @@ foreach(arg_list LLVM_LIBC_OPTIONAL_ARGS LLVM_LIBC_SINGLE_VALUE_ARGS LLVM_LIBC_M
     PREPEND "FULL_BUILD_"
     OUTPUT_VARIABLE ${arg_list}_FULL_BUILD
   )
-  set(${arg_list}_COMPLETE ${arg_list} ${arg_list}_OVERLAY ${arg_list}_FULL_BUILD)
+  set(${arg_list}_COMPLETE ${${arg_list}} ${${arg_list}_OVERLAY} ${${arg_list}_FULL_BUILD})
 endforeach()
 
 macro(llvm_libc_parse_arguments name_prefix)
@@ -58,11 +58,11 @@ macro(llvm_libc_parse_arguments name_prefix)
   foreach(argument IN LISTS LLVM_LIBC_OPTIONAL_ARGS LLVM_LIBC_SINGLE_VALUE_ARGS LLVM_LIBC_MULTI_VALUE_ARGS)
     if(LLVM_LIBC_FULL_BUILD)
       if(${name_prefix}_${argument}_FULL_BUILD)
-        list(APPEND ${name_prefix}_${argument} ${name_prefix}_${argument}_FULL_BUILD)
+        list(APPEND ${name_prefix}_${argument} ${${name_prefix}_${argument}_FULL_BUILD})
       endif()
     else()
       if(${name_prefix}_${argument}_OVERLAY)
-        list(APPEND ${name_prefix}_${argument} ${name_prefix}_${argument}_OVERLAY)
+        list(APPEND ${name_prefix}_${argument} ${${name_prefix}_${argument}_OVERLAY})
       endif()
     endif()
   endforeach()
@@ -81,7 +81,7 @@ macro(forward_arguments name_prefix output)
 
   foreach(argument ${LLVM_LIBC_SINGLE_VALUE_ARGS} ${LLVM_LIBC_MULTI_VALUE_ARGS})
     if(${name_prefix}_${argument})
-      list(APPEND output ${argument} "${name_prefix}_${argument}")
+      list(APPEND output ${argument} "${${name_prefix}_${argument}}")
     endif()
   endforeach()
 endmacro()



More information about the libc-commits mailing list