diff --git a/libc/cmake/modules/LibcParseArguments.cmake b/libc/cmake/modules/LibcParseArguments.cmake new file mode 100644 index 0000000000000..ef4a2aff0ce82 --- /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()