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()