# TODO investigate whether this is really needed: math(EXPR CUB_TEST_ARCH "${CUB_MINIMAL_ENABLED_ARCH} * 10") message(STATUS "CUB Test architecture (TEST_ARCH): ${CUB_TEST_ARCH}") # Create meta targets that build all tests for a single configuration: foreach(cub_target IN LISTS CUB_TARGETS) cub_get_target_property(config_prefix ${cub_target} PREFIX) set(config_meta_target ${config_prefix}.tests) add_custom_target(${config_meta_target}) add_dependencies(${config_prefix}.all ${config_meta_target}) endforeach() file(GLOB test_srcs RELATIVE ${CUB_SOURCE_DIR}/test CONFIGURE_DEPENDS test_*.cu ) ## cub_add_test # # Add a test executable and register it with ctest. # # target_name_var: Variable name to overwrite with the name of the test # target. Useful for post-processing target information. # test_name: The name of the test minus ".test." For example, # testing/vector.cu will be "vector", and testing/cuda/copy.cu will be # "cuda.copy". # test_src: The source file that implements the test. # cub_target: The reference cub target with configuration information. # function(cub_add_test target_name_var test_name test_src cub_target) cub_get_target_property(config_prefix ${cub_target} PREFIX) # The actual name of the test's target: set(test_target ${config_prefix}.test.${test_name}) set(${target_name_var} ${test_target} PARENT_SCOPE) # Related target names: set(config_meta_target ${config_prefix}.tests) set(test_meta_target cub.all.test.${test_name}) add_executable(${test_target} "${test_src}") target_link_libraries(${test_target} ${cub_target}) cub_clone_target_properties(${test_target} ${cub_target}) target_compile_definitions(${test_target} PRIVATE TEST_ARCH=${CUB_TEST_ARCH}) target_include_directories(${test_target} PRIVATE "${CUB_SOURCE_DIR}/test") # Add to the active configuration's meta target add_dependencies(${config_meta_target} ${test_target}) # Meta target that builds tests with this name for all configurations: if (NOT TARGET ${test_meta_target}) add_custom_target(${test_meta_target}) endif() add_dependencies(${test_meta_target} ${test_target}) if (CUB_ENABLE_TESTS_WITH_RDC) set_target_properties(${test_target} PROPERTIES CUDA_SEPARABLE_COMPILATION ON ) endif() add_test(NAME ${test_target} COMMAND "$" ) endfunction() # Sets HAS_QUICK_VARIANT / HAS_QUICKER_VARIANT / NO_VARIANTS to True/False in # the calling scope. # Used to detect variants of unit tests depending on whether a source file # contains the strings "QUICK_TEST" or "QUICKER_TEST". function(cub_check_for_test_variants src) file(READ "${src}" data) string(FIND "${data}" "QUICK_TEST" quick_loc) set(HAS_QUICK_VARIANT False PARENT_SCOPE) if (NOT quick_loc EQUAL -1) set(HAS_QUICK_VARIANT True PARENT_SCOPE) endif() string(FIND "${data}" "QUICKER_TEST" quicker_loc) set(HAS_QUICKER_VARIANT False PARENT_SCOPE) if (NOT quicker_loc EQUAL -1) set(HAS_QUICKER_VARIANT True PARENT_SCOPE) endif() set(NO_VARIANTS False PARENT_SCOPE) if (NOT (HAS_QUICK_VARIANT OR HAS_QUICKER_VARIANT)) set(NO_VARIANTS True PARENT_SCOPE) endif() endfunction() foreach (test_src IN LISTS test_srcs) # TODO: Per-test flags. get_filename_component(test_name "${test_src}" NAME_WE) string(REGEX REPLACE "^test_" "" test_name "${test_name}") # Some tests change behavior based on whether the compiler defs QUICK_TEST # and/or QUICKER_TEST are defined. Detect these and build variants for each # configuration: cub_check_for_test_variants("${test_src}") foreach(cub_target IN LISTS CUB_TARGETS) if (NO_VARIANTS) # Only one version of this test. cub_add_test(test_target ${test_name} "${test_src}" ${cub_target}) else() # By default (no flags), the "thorough" version of the test is built: cub_add_test(test_target_thorough ${test_name}.thorough "${test_src}" ${cub_target} ) # Add the other variants with appropriate suffixes: if (HAS_QUICK_VARIANT) cub_add_test(test_target_quick ${test_name}.quick "${test_src}" ${cub_target} ) target_compile_definitions(${test_target_quick} PRIVATE QUICK_TEST) endif() if (HAS_QUICKER_VARIANT) cub_add_test(test_target_quicker ${test_name}.quicker "${test_src}" ${cub_target} ) target_compile_definitions(${test_target_quicker} PRIVATE QUICKER_TEST) endif() endif() endforeach() endforeach()