diff --git a/libc/cmake/modules/LLVMLibCFlagRules.cmake b/libc/cmake/modules/LLVMLibCFlagRules.cmake index 9a48d38b02893e..9bec716516f288 100644 --- a/libc/cmake/modules/LLVMLibCFlagRules.cmake +++ b/libc/cmake/modules/LLVMLibCFlagRules.cmake @@ -129,6 +129,135 @@ function(get_fq_dep_list_without_flag output_list flag) set(${output_list} ${fq_dep_no_flag_list} PARENT_SCOPE) endfunction(get_fq_dep_list_without_flag) +# Check if a `flag` is set +function(check_flag result flag_name) + list(FIND ARGN ${flag_name}_FLAG has_flag) + if(${has_flag} LESS 0) + list(FIND ARGN "${flag_name}_FLAG__ONLY" has_flag) + endif() + if(${has_flag} GREATER -1) + set(${result} TRUE PARENT_SCOPE) + else() + set(${result} FALSE PARENT_SCOPE) + endif() +endfunction(check_flag) + +# Generate all flags' combinations and call the corresponding function provided +# by `CREATE_TARGET` to create a target for each combination. +function(expand_flags_for_target target_name flags) + cmake_parse_arguments( + "EXPAND_FLAGS" + "" # Optional arguments + "CREATE_TARGET" # Single-value arguments + "DEPENDS;FLAGS" # Multi-value arguments + ${ARGN} + ) + + list(LENGTH flags nflags) + if(NOT ${nflags}) + cmake_language(CALL ${EXPAND_FLAGS_CREATE_TARGET} + ${target_name} + ${EXPAND_FLAGS_UNPARSED_ARGUMENTS} + DEPENDS ${EXPAND_FLAGS_DEPENDS} + FLAGS ${EXPAND_FLAGS_FLAGS} + ) + return() + endif() + + list(GET flags 0 flag) + list(REMOVE_AT flags 0) + extract_flag_modifier(${flag} real_flag modifier) + + if(NOT "${modifier}" STREQUAL "NO") + expand_flags_for_target( + ${target_name} + "${flags}" + DEPENDS ${EXPAND_FLAGS_DEPENDS} + FLAGS ${EXPAND_FLAGS_FLAGS} + CREATE_TARGET ${EXPAND_FLAGS_CREATE_TARGET} + ${EXPAND_FLAGS_UNPARSED_ARGUMENTS} + ) + endif() + + if("${real_flag}" STREQUAL "" OR "${modifier}" STREQUAL "ONLY") + return() + endif() + + set(NEW_FLAGS ${EXPAND_FLAGS_FLAGS}) + list(REMOVE_ITEM NEW_FLAGS ${flag}) + get_fq_dep_list_without_flag(NEW_DEPS ${real_flag} ${EXPAND_FLAGS_DEPENDS}) + + # Only target with `flag` has `.__NO_flag` target, `flag__NO` and + # `flag__ONLY` do not. + if("${modifier}" STREQUAL "") + set(TARGET_NAME "${target_name}.__NO_${flag}") + else() + set(TARGET_NAME "${target_name}") + endif() + + expand_flags_for_target( + ${TARGET_NAME} + "${flags}" + DEPENDS ${NEW_DEPS} + FLAGS ${NEW_FLAGS} + CREATE_TARGET ${EXPAND_FLAGS_CREATE_TARGET} + ${EXPAND_FLAGS_UNPARSED_ARGUMENTS} + ) +endfunction(expand_flags_for_target) + +# Collect all flags from a target's dependency, and then forward to +# `expand_flags_for_target to generate all flags' combinations and call +# the corresponding function provided by `CREATE_TARGET` to create a target for +# each combination. +function(add_target_with_flags target_name) + cmake_parse_arguments( + "ADD_TO_EXPAND" + "" # Optional arguments + "CREATE_TARGET;" # Single value arguments + "DEPENDS;FLAGS;ADD_FLAGS" # Multi-value arguments + ${ARGN} + ) + + if(NOT target_name) + message(FATAL_ERROR "Bad target name") + endif() + + if(NOT ADD_TO_EXPAND_CREATE_TARGET) + message(FATAL_ERROR "Missing function to create targets. Please specify " + "`CREATE_TARGET `") + endif() + + get_fq_target_name(${target_name} fq_target_name) + + if(ADD_TO_EXPAND_DEPENDS AND ("${SHOW_INTERMEDIATE_OBJECTS}" STREQUAL "DEPS")) + message(STATUS "Gathering FLAGS from dependencies for ${fq_target_name}") + endif() + + get_fq_deps_list(fq_deps_list ${ADD_TO_EXPAND_DEPENDS}) + get_flags_from_dep_list(deps_flag_list ${fq_deps_list}) + + # Appending ADD_FLAGS before flags from dependency. + if(ADD_TO_EXPAND_ADD_FLAGS) + list(APPEND ADD_TO_EXPAND_FLAGS ${ADD_TO_EXPAND_ADD_FLAGS}) + endif() + list(APPEND ADD_TO_EXPAND_FLAGS ${deps_flag_list}) + remove_duplicated_flags("${ADD_TO_EXPAND_FLAGS}" flags) + list(SORT flags) + + if(SHOW_INTERMEDIATE_OBJECTS AND flags) + message(STATUS "Target ${fq_target_name} has FLAGS: ${flags}") + endif() + + expand_flags_for_target( + ${fq_target_name} + "${flags}" + DEPENDS "${fq_deps_list}" + FLAGS "${flags}" + CREATE_TARGET ${ADD_TO_EXPAND_CREATE_TARGET} + ${ADD_TO_EXPAND_UNPARSED_ARGUMENTS} + ) +endfunction(add_target_with_flags) + # Special flags set(FMA_OPT_FLAG "FMA_OPT") set(ROUND_OPT_FLAG "ROUND_OPT") diff --git a/libc/cmake/modules/LLVMLibCLibraryRules.cmake b/libc/cmake/modules/LLVMLibCLibraryRules.cmake index adb3bdeea2cb3b..81c207ec23176a 100644 --- a/libc/cmake/modules/LLVMLibCLibraryRules.cmake +++ b/libc/cmake/modules/LLVMLibCLibraryRules.cmake @@ -207,97 +207,10 @@ endfunction(create_header_library) # FLAGS # ) -# Internal function, used by `add_header_library`. -function(expand_flags_for_header_library target_name flags) - cmake_parse_arguments( - "EXPAND_FLAGS" - "IGNORE_MARKER" # Optional arguments - "" # Single-value arguments - "DEPENDS;FLAGS" # Multi-value arguments - ${ARGN} - ) - - list(LENGTH flags nflags) - if(NOT ${nflags}) - create_header_library( - ${target_name} - DEPENDS ${EXPAND_FLAGS_DEPENDS} - FLAGS ${EXPAND_FLAGS_FLAGS} - ${EXPAND_FLAGS_UNPARSED_ARGUMENTS} - ) - return() - endif() - - list(GET flags 0 flag) - list(REMOVE_AT flags 0) - extract_flag_modifier(${flag} real_flag modifier) - - if(NOT "${modifier}" STREQUAL "NO") - expand_flags_for_header_library( - ${target_name} - "${flags}" - DEPENDS ${EXPAND_FLAGS_DEPENDS} IGNORE_MARKER - FLAGS ${EXPAND_FLAGS_FLAGS} IGNORE_MARKER - ${EXPAND_FLAGS_UNPARSED_ARGUMENTS} - ) - endif() - - if("${real_flag}" STREQUAL "" OR "${modifier}" STREQUAL "ONLY") - return() - endif() - - set(NEW_FLAGS ${EXPAND_FLAGS_FLAGS}) - list(REMOVE_ITEM NEW_FLAGS ${flag}) - get_fq_dep_list_without_flag(NEW_DEPS ${real_flag} ${EXPAND_FLAGS_DEPENDS}) - - # Only target with `flag` has `.__NO_flag` target, `flag__NO` and - # `flag__ONLY` do not. - if("${modifier}" STREQUAL "") - set(TARGET_NAME "${target_name}.__NO_${flag}") - else() - set(TARGET_NAME "${target_name}") - endif() - - expand_flags_for_header_library( - ${TARGET_NAME} - "${flags}" - DEPENDS ${NEW_DEPS} IGNORE_MARKER - FLAGS ${NEW_FLAGS} IGNORE_MARKER - ${EXPAND_FLAGS_UNPARSED_ARGUMENTS} - ) -endfunction(expand_flags_for_header_library) - function(add_header_library target_name) - cmake_parse_arguments( - "ADD_TO_EXPAND" - "" # Optional arguments - "" # Single value arguments - "DEPENDS;FLAGS" # Multi-value arguments + add_target_with_flags( + ${target_name} + CREATE_TARGET create_header_library ${ARGN} ) - - get_fq_target_name(${target_name} fq_target_name) - - if(ADD_TO_EXPAND_DEPENDS AND ("${SHOW_INTERMEDIATE_OBJECTS}" STREQUAL "DEPS")) - message(STATUS "Gathering FLAGS from dependencies for ${fq_target_name}") - endif() - - get_fq_deps_list(fq_deps_list ${ADD_TO_EXPAND_DEPENDS}) - get_flags_from_dep_list(deps_flag_list ${fq_deps_list}) - - list(APPEND ADD_TO_EXPAND_FLAGS ${deps_flag_list}) - remove_duplicated_flags("${ADD_TO_EXPAND_FLAGS}" flags) - list(SORT flags) - - if(SHOW_INTERMEDIATE_OBJECTS AND flags) - message(STATUS "Header library ${fq_target_name} has FLAGS: ${flags}") - endif() - - expand_flags_for_header_library( - ${fq_target_name} - "${flags}" - DEPENDS ${fq_deps_list} IGNORE_MARKER - FLAGS ${flags} IGNORE_MARKER - ${ADD_TO_EXPAND_UNPARSED_ARGUMENTS} - ) endfunction(add_header_library) diff --git a/libc/cmake/modules/LLVMLibCObjectRules.cmake b/libc/cmake/modules/LLVMLibCObjectRules.cmake index c5c9f7c09a144b..4213fe15731f1a 100644 --- a/libc/cmake/modules/LLVMLibCObjectRules.cmake +++ b/libc/cmake/modules/LLVMLibCObjectRules.cmake @@ -1,32 +1,46 @@ set(OBJECT_LIBRARY_TARGET_TYPE "OBJECT_LIBRARY") -function(_get_common_compile_options output_var flags) - list(FIND flags ${FMA_OPT_FLAG} fma) - if(${fma} LESS 0) - list(FIND flags "${FMA_OPT_FLAG}__ONLY" fma) - endif() - if((${fma} GREATER -1) AND (LIBC_TARGET_ARCHITECTURE_IS_RISCV64 OR - (LIBC_CPU_FEATURES MATCHES "FMA"))) - set(ADD_FMA_FLAG TRUE) - endif() +function(_get_compile_options_from_flags output_var) + set(compile_options "") - list(FIND flags ${ROUND_OPT_FLAG} round) - if(${round} LESS 0) - list(FIND flags "${ROUND_OPT_FLAG}__ONLY" round) + if(LIBC_TARGET_ARCHITECTURE_IS_RISCV64 OR(LIBC_CPU_FEATURES MATCHES "FMA")) + check_flag(ADD_FMA_FLAG ${FMA_OPT_FLAG} ${flags}) endif() - if((${round} GREATER -1) AND (LIBC_CPU_FEATURES MATCHES "SSE4_2")) - set(ADD_SSE4_2_FLAG TRUE) + check_flag(ADD_SSE4_2_FLAG ${ROUND_OPT_FLAG} ${flags}) + check_flag(ADD_EXPLICIT_SIMD_OPT_FLAG ${EXPLICIT_SIMD_OPT_FLAG} ${flags}) + + if(LLVM_COMPILER_IS_GCC_COMPATIBLE) + if(ADD_FMA_FLAG) + if(LIBC_TARGET_ARCHITECTURE_IS_X86) + list(APPEND compile_options "-mavx2") + list(APPEND compile_options "-mfma") + elseif(LIBC_TARGET_ARCHITECTURE_IS_RISCV64) + list(APPEND compile_options "-D__LIBC_RISCV_USE_FMA") + endif() + endif() + if(ADD_SSE4_2_FLAG) + list(APPEND compile_options "-msse4.2") + endif() + if(ADD_EXPLICIT_SIMD_OPT_FLAG) + list(APPEND compile_options "-D__LIBC_EXPLICIT_SIMD_OPT") + endif() + elseif(MSVC) + if(ADD_FMA_FLAG) + list(APPEND compile_options "/arch:AVX2") + endif() + if(ADD_EXPLICIT_SIMD_OPT_FLAG) + list(APPEND compile_options "/D__LIBC_EXPLICIT_SIMD_OPT") + endif() endif() - list(FIND flags ${EXPLICIT_SIMD_OPT_FLAG} explicit_simd) - if(${explicit_simd} LESS 0) - list(FIND flags "${EXPLICIT_SIMD_OPT_FLAG}__ONLY" explicit_simd) - endif() - if(${explicit_simd} GREATER -1) - set(ADD_EXPLICIT_SIMD_OPT_FLAG TRUE) - endif() + set(${output_var} ${compile_options} PARENT_SCOPE) +endfunction(_get_compile_options_from_flags) + +function(_get_common_compile_options output_var flags) + _get_compile_options_from_flags(compile_flags ${flags}) + + set(compile_options ${LIBC_COMPILE_OPTIONS_DEFAULT} ${compile_flags}) - set(compile_options ${LIBC_COMPILE_OPTIONS_DEFAULT}) if(LLVM_COMPILER_IS_GCC_COMPATIBLE) list(APPEND compile_options "-fpie") @@ -62,29 +76,9 @@ function(_get_common_compile_options output_var flags) list(APPEND compile_options "-Wthread-safety") list(APPEND compile_options "-Wglobal-constructors") endif() - if(ADD_FMA_FLAG) - if(LIBC_TARGET_ARCHITECTURE_IS_X86) - list(APPEND compile_options "-mavx2") - list(APPEND compile_options "-mfma") - elseif(LIBC_TARGET_ARCHITECTURE_IS_RISCV64) - list(APPEND compile_options "-D__LIBC_RISCV_USE_FMA") - endif() - endif() - if(ADD_SSE4_2_FLAG) - list(APPEND compile_options "-msse4.2") - endif() - if(ADD_EXPLICIT_SIMD_OPT_FLAG) - list(APPEND compile_options "-D__LIBC_EXPLICIT_SIMD_OPT") - endif() elseif(MSVC) list(APPEND compile_options "/EHs-c-") list(APPEND compile_options "/GR-") - if(ADD_FMA_FLAG) - list(APPEND compile_options "/arch:AVX2") - endif() - if(ADD_EXPLICIT_SIMD_OPT_FLAG) - list(APPEND compile_options "/D__LIBC_EXPLICIT_SIMD_OPT") - endif() endif() if (LIBC_TARGET_ARCHITECTURE_IS_GPU) list(APPEND compile_options "-nogpulib") @@ -428,99 +422,11 @@ function(create_object_library fq_target_name) endif() endfunction(create_object_library) -# Internal function, used by `add_object_library`. -function(expand_flags_for_object_library target_name flags) - cmake_parse_arguments( - "EXPAND_FLAGS" - "IGNORE_MARKER" # Optional arguments - "" # Single-value arguments - "DEPENDS;FLAGS" # Multi-value arguments - ${ARGN} - ) - - list(LENGTH flags nflags) - if(NOT ${nflags}) - create_object_library( - ${target_name} - DEPENDS ${EXPAND_FLAGS_DEPENDS} - FLAGS ${EXPAND_FLAGS_FLAGS} - ${EXPAND_FLAGS_UNPARSED_ARGUMENTS} - ) - return() - endif() - - list(GET flags 0 flag) - list(REMOVE_AT flags 0) - extract_flag_modifier(${flag} real_flag modifier) - - if(NOT "${modifier}" STREQUAL "NO") - expand_flags_for_object_library( - ${target_name} - "${flags}" - DEPENDS "${EXPAND_FLAGS_DEPENDS}" IGNORE_MARKER - FLAGS "${EXPAND_FLAGS_FLAGS}" IGNORE_MARKER - "${EXPAND_FLAGS_UNPARSED_ARGUMENTS}" - ) - endif() - - if("${real_flag}" STREQUAL "" OR "${modifier}" STREQUAL "ONLY") - return() - endif() - - set(NEW_FLAGS ${EXPAND_FLAGS_FLAGS}) - list(REMOVE_ITEM NEW_FLAGS ${flag}) - get_fq_dep_list_without_flag(NEW_DEPS ${real_flag} ${EXPAND_FLAGS_DEPENDS}) - - # Only target with `flag` has `.__NO_flag` target, `flag__NO` and - # `flag__ONLY` do not. - if("${modifier}" STREQUAL "") - set(TARGET_NAME "${target_name}.__NO_${flag}") - else() - set(TARGET_NAME "${target_name}") - endif() - - expand_flags_for_object_library( - ${TARGET_NAME} - "${flags}" - DEPENDS "${NEW_DEPS}" IGNORE_MARKER - FLAGS "${NEW_FLAGS}" IGNORE_MARKER - "${EXPAND_FLAGS_UNPARSED_ARGUMENTS}" - ) -endfunction(expand_flags_for_object_library) - function(add_object_library target_name) - cmake_parse_arguments( - "ADD_TO_EXPAND" - "" # Optional arguments - "" # Single value arguments - "DEPENDS;FLAGS" # Multi-value arguments - ${ARGN} - ) - - get_fq_target_name(${target_name} fq_target_name) - - if(ADD_TO_EXPAND_DEPENDS AND ("${SHOW_INTERMEDIATE_OBJECTS}" STREQUAL "DEPS")) - message(STATUS "Gathering FLAGS from dependencies for ${fq_target_name}") - endif() - - get_fq_deps_list(fq_deps_list ${ADD_TO_EXPAND_DEPENDS}) - get_flags_from_dep_list(deps_flag_list ${fq_deps_list}) - - list(APPEND ADD_TO_EXPAND_FLAGS ${deps_flag_list}) - remove_duplicated_flags("${ADD_TO_EXPAND_FLAGS}" flags) - list(SORT flags) - - if(SHOW_INTERMEDIATE_OBJECTS AND flags) - message(STATUS "Object library ${fq_target_name} has FLAGS: ${flags}") - endif() - - expand_flags_for_object_library( - ${fq_target_name} - "${flags}" - DEPENDS "${fq_deps_list}" IGNORE_MARKER - FLAGS "${flags}" IGNORE_MARKER - ${ADD_TO_EXPAND_UNPARSED_ARGUMENTS} - ) + add_target_with_flags( + ${target_name} + CREATE_TARGET create_object_library + ${ARGN}) endfunction(add_object_library) set(ENTRYPOINT_OBJ_TARGET_TYPE "ENTRYPOINT_OBJ") @@ -790,103 +696,24 @@ function(create_entrypoint_object fq_target_name) endfunction(create_entrypoint_object) -# Internal function, used by `add_entrypoint_object`. -function(expand_flags_for_entrypoint_object target_name flags) - cmake_parse_arguments( - "EXPAND_FLAGS" - "IGNORE_MARKER" # Optional arguments - "" # Single-value arguments - "DEPENDS;FLAGS" # Multi-value arguments - ${ARGN} - ) - - list(LENGTH flags nflags) - if(NOT ${nflags}) - create_entrypoint_object( - ${target_name} - DEPENDS ${EXPAND_FLAGS_DEPENDS} - FLAGS ${EXPAND_FLAGS_FLAGS} - ${EXPAND_FLAGS_UNPARSED_ARGUMENTS} - ) - return() - endif() - - list(GET flags 0 flag) - list(REMOVE_AT flags 0) - extract_flag_modifier(${flag} real_flag modifier) - - if(NOT "${modifier}" STREQUAL "NO") - expand_flags_for_entrypoint_object( - ${target_name} - "${flags}" - DEPENDS "${EXPAND_FLAGS_DEPENDS}" IGNORE_MARKER - FLAGS "${EXPAND_FLAGS_FLAGS}" IGNORE_MARKER - "${EXPAND_FLAGS_UNPARSED_ARGUMENTS}" - ) - endif() - - if("${real_flag}" STREQUAL "" OR "${modifier}" STREQUAL "ONLY") - return() - endif() - - set(NEW_FLAGS ${EXPAND_FLAGS_FLAGS}) - list(REMOVE_ITEM NEW_FLAGS ${flag}) - get_fq_dep_list_without_flag(NEW_DEPS ${real_flag} ${EXPAND_FLAGS_DEPENDS}) - - # Only target with `flag` has `.__NO_flag` target, `flag__NO` and - # `flag__ONLY` do not. - if("${modifier}" STREQUAL "") - set(TARGET_NAME "${target_name}.__NO_${flag}") - else() - set(TARGET_NAME "${target_name}") - endif() - - expand_flags_for_entrypoint_object( - ${TARGET_NAME} - "${flags}" - DEPENDS "${NEW_DEPS}" IGNORE_MARKER - FLAGS "${NEW_FLAGS}" IGNORE_MARKER - "${EXPAND_FLAGS_UNPARSED_ARGUMENTS}" - ) -endfunction(expand_flags_for_entrypoint_object) - function(add_entrypoint_object target_name) cmake_parse_arguments( - "ADD_TO_EXPAND" + "ADD_ENTRYPOINT_OBJ" "" # Optional arguments "NAME" # Single value arguments - "DEPENDS;FLAGS" # Multi-value arguments + "" # Multi-value arguments ${ARGN} ) - get_fq_target_name(${target_name} fq_target_name) - - if(ADD_TO_EXPAND_DEPENDS AND ("${SHOW_INTERMEDIATE_OBJECTS}" STREQUAL "DEPS")) - message(STATUS "Gathering FLAGS from dependencies for ${fq_target_name}") - endif() - - get_fq_deps_list(fq_deps_list ${ADD_TO_EXPAND_DEPENDS}) - get_flags_from_dep_list(deps_flag_list ${fq_deps_list}) - - list(APPEND ADD_TO_EXPAND_FLAGS ${deps_flag_list}) - remove_duplicated_flags("${ADD_TO_EXPAND_FLAGS}" flags) - list(SORT flags) - - if(SHOW_INTERMEDIATE_OBJECTS AND flags) - message(STATUS "Entrypoint object ${fq_target_name} has FLAGS: ${flags}") + if(NOT ADD_ENTRYPOINT_OBJ_NAME) + set(ADD_ENTRYPOINT_OBJ_NAME ${target_name}) endif() - if(NOT ADD_TO_EXPAND_NAME) - set(ADD_TO_EXPAND_NAME ${target_name}) - endif() - - expand_flags_for_entrypoint_object( - ${fq_target_name} - "${flags}" - NAME ${ADD_TO_EXPAND_NAME} IGNORE_MARKER - DEPENDS "${fq_deps_list}" IGNORE_MARKER - FLAGS "${flags}" IGNORE_MARKER - ${ADD_TO_EXPAND_UNPARSED_ARGUMENTS} + add_target_with_flags( + ${target_name} + NAME ${ADD_ENTRYPOINT_OBJ_NAME} + CREATE_TARGET create_entrypoint_object + ${ADD_ENTRYPOINT_OBJ_UNPARSED_ARGUMENTS} ) endfunction(add_entrypoint_object) diff --git a/libc/cmake/modules/LLVMLibCTestRules.cmake b/libc/cmake/modules/LLVMLibCTestRules.cmake index 0d0a47b33aaeba..5b96c5e9f8c801 100644 --- a/libc/cmake/modules/LLVMLibCTestRules.cmake +++ b/libc/cmake/modules/LLVMLibCTestRules.cmake @@ -246,99 +246,12 @@ function(create_libc_unittest fq_target_name) add_dependencies(libc-unit-tests ${fq_target_name}) endfunction(create_libc_unittest) -# Internal function, used by `add_libc_unittest`. -function(expand_flags_for_libc_unittest target_name flags) - cmake_parse_arguments( - "EXPAND_FLAGS" - "IGNORE_MARKER" # No Optional arguments - "" # No Single-value arguments - "DEPENDS;FLAGS" # Multi-value arguments - ${ARGN} - ) - - list(LENGTH flags nflags) - if(NOT ${nflags}) - create_libc_unittest( - ${target_name} - DEPENDS "${EXPAND_FLAGS_DEPENDS}" - FLAGS "${EXPAND_FLAGS_FLAGS}" - "${EXPAND_FLAGS_UNPARSED_ARGUMENTS}" - ) - return() - endif() - - list(GET flags 0 flag) - list(REMOVE_AT flags 0) - extract_flag_modifier(${flag} real_flag modifier) - - if(NOT "${modifier}" STREQUAL "NO") - expand_flags_for_libc_unittest( - ${target_name} - "${flags}" - DEPENDS "${EXPAND_FLAGS_DEPENDS}" IGNORE_MARKER - FLAGS "${EXPAND_FLAGS_FLAGS}" IGNORE_MARKER - "${EXPAND_FLAGS_UNPARSED_ARGUMENTS}" - ) - endif() - - if("${real_flag}" STREQUAL "" OR "${modifier}" STREQUAL "ONLY") - return() - endif() - - set(NEW_FLAGS ${EXPAND_FLAGS_FLAGS}) - list(REMOVE_ITEM NEW_FLAGS ${flag}) - get_fq_dep_list_without_flag(NEW_DEPS ${real_flag} ${EXPAND_FLAGS_DEPENDS}) - - # Only target with `flag` has `.__NO_flag` target, `flag__NO` and - # `flag__ONLY` do not. - if("${modifier}" STREQUAL "") - set(TARGET_NAME "${target_name}.__NO_${flag}") - else() - set(TARGET_NAME "${target_name}") - endif() - - expand_flags_for_libc_unittest( - ${TARGET_NAME} - "${flags}" - DEPENDS "${NEW_DEPS}" IGNORE_MARKER - FLAGS "${NEW_FLAGS}" IGNORE_MARKER - "${EXPAND_FLAGS_UNPARSED_ARGUMENTS}" - ) -endfunction(expand_flags_for_libc_unittest) - function(add_libc_unittest target_name) - cmake_parse_arguments( - "ADD_TO_EXPAND" - "" # Optional arguments - "" # Single value arguments - "DEPENDS;FLAGS" # Multi-value arguments + add_target_with_flags( + ${target_name} + CREATE_TARGET create_libc_unittest ${ARGN} ) - - get_fq_target_name(${target_name} fq_target_name) - - if(ADD_TO_EXPAND_DEPENDS AND ("${SHOW_INTERMEDIATE_OBJECTS}" STREQUAL "DEPS")) - message(STATUS "Gathering FLAGS from dependencies for ${fq_target_name}") - endif() - - get_fq_deps_list(fq_deps_list ${ADD_TO_EXPAND_DEPENDS}) - get_flags_from_dep_list(deps_flag_list ${fq_deps_list}) - - list(APPEND ADD_TO_EXPAND_FLAGS ${deps_flag_list}) - remove_duplicated_flags("${ADD_TO_EXPAND_FLAGS}" flags) - list(SORT flags) - - if(SHOW_INTERMEDIATE_OBJECTS AND flags) - message(STATUS "Unit test ${fq_target_name} has FLAGS: ${flags}") - endif() - - expand_flags_for_libc_unittest( - ${fq_target_name} - "${flags}" - DEPENDS ${fq_deps_list} IGNORE_MARKER - FLAGS ${flags} IGNORE_MARKER - ${ADD_TO_EXPAND_UNPARSED_ARGUMENTS} - ) endfunction(add_libc_unittest) function(add_libc_exhaustive_testsuite suite_name)