[libc-commits] [libc] 548d132 - [libc][NFC] Refactor FLAGS expansion using cmake_language(CALL ...). (#80156)
via libc-commits
libc-commits at lists.llvm.org
Thu Feb 1 08:57:57 PST 2024
Author: lntue
Date: 2024-02-01T11:57:52-05:00
New Revision: 548d132b9457aa5223ee87d2306a7bec30da93d2
URL: https://github.com/llvm/llvm-project/commit/548d132b9457aa5223ee87d2306a7bec30da93d2
DIFF: https://github.com/llvm/llvm-project/commit/548d132b9457aa5223ee87d2306a7bec30da93d2.diff
LOG: [libc][NFC] Refactor FLAGS expansion using cmake_language(CALL ...). (#80156)
Added:
Modified:
libc/cmake/modules/LLVMLibCFlagRules.cmake
libc/cmake/modules/LLVMLibCLibraryRules.cmake
libc/cmake/modules/LLVMLibCObjectRules.cmake
libc/cmake/modules/LLVMLibCTestRules.cmake
Removed:
################################################################################
diff --git a/libc/cmake/modules/LLVMLibCFlagRules.cmake b/libc/cmake/modules/LLVMLibCFlagRules.cmake
index 9a48d38b02893..9bec716516f28 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 <function>`")
+ 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 adb3bdeea2cb3..81c207ec23176 100644
--- a/libc/cmake/modules/LLVMLibCLibraryRules.cmake
+++ b/libc/cmake/modules/LLVMLibCLibraryRules.cmake
@@ -207,97 +207,10 @@ endfunction(create_header_library)
# FLAGS <list of 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 c5c9f7c09a144..4213fe15731f1 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 0d0a47b33aaeb..5b96c5e9f8c80 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)
More information about the libc-commits
mailing list