DiscoverTests.cmake raw
1 # TODO: rework/remove once test discovery is implemented upstream:
2 # https://gitlab.kitware.com/cmake/cmake/-/issues/26920
3 function(discover_tests target)
4 set(options "")
5 set(oneValueArgs DISCOVERY_MATCH TEST_NAME_REPLACEMENT TEST_ARGS_REPLACEMENT)
6 set(multiValueArgs DISCOVERY_ARGS PROPERTIES)
7 cmake_parse_arguments(PARSE_ARGV 1 arg "${options}" "${oneValueArgs}" "${multiValueArgs}")
8
9 set(file_base ${CMAKE_CURRENT_BINARY_DIR}/${target})
10 set(include_file ${file_base}_include.cmake)
11
12 set(properties_content)
13 list(LENGTH arg_PROPERTIES properties_len)
14 if(properties_len GREATER "0")
15 set(properties_content " set_tests_properties(\"\${test_name}\" PROPERTIES\n")
16 math(EXPR num_properties "${properties_len} / 2")
17 foreach(i RANGE 0 ${num_properties} 2)
18 math(EXPR value_index "${i} + 1")
19 list(GET arg_PROPERTIES ${i} name)
20 list(GET arg_PROPERTIES ${value_index} value)
21 string(APPEND properties_content " \"${name}\" \"${value}\"\n")
22 endforeach()
23 string(APPEND properties_content " )\n")
24 endif()
25
26 string(CONCAT include_content
27 "set(runner [[$<TARGET_FILE:${target}>]])\n"
28 "set(launcher [[$<TARGET_PROPERTY:${target},TEST_LAUNCHER>]])\n"
29 "set(emulator [[$<$<BOOL:${CMAKE_CROSSCOMPILING}>:$<TARGET_PROPERTY:${target},CROSSCOMPILING_EMULATOR>>]])\n"
30 "\n"
31 "execute_process(\n"
32 " COMMAND \${launcher} \${emulator} \${runner} ${arg_DISCOVERY_ARGS}\n"
33 " OUTPUT_VARIABLE output OUTPUT_STRIP_TRAILING_WHITESPACE\n"
34 " ERROR_VARIABLE output ERROR_STRIP_TRAILING_WHITESPACE\n"
35 " RESULT_VARIABLE result\n"
36 ")\n"
37 "\n"
38 "if(NOT result EQUAL 0)\n"
39 " add_test([[${target}_DISCOVERY_FAILURE]] \${launcher} \${emulator} \${runner} ${arg_DISCOVERY_ARGS})\n"
40 "else()\n"
41 " string(REPLACE \"\\n\" \";\" lines \"\${output}\")\n"
42 " foreach(line IN LISTS lines)\n"
43 " if(line MATCHES \"${arg_DISCOVERY_MATCH}\")\n"
44 " string(REGEX REPLACE \"${arg_DISCOVERY_MATCH}\" \"${arg_TEST_NAME_REPLACEMENT}\" test_name \"\${line}\")\n"
45 " string(REGEX REPLACE \"${arg_DISCOVERY_MATCH}\" \"${arg_TEST_ARGS_REPLACEMENT}\" test_args \"\${line}\")\n"
46 " separate_arguments(test_args)\n"
47 " add_test(\"\${test_name}\" \${launcher} \${emulator} \${runner} \${test_args})\n"
48 ${properties_content}
49 " endif()\n"
50 " endforeach()\n"
51 "endif()\n"
52 )
53
54 get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
55 if(is_multi_config)
56 file(GENERATE
57 OUTPUT ${file_base}_include-$<CONFIG>.cmake
58 CONTENT "${include_content}"
59 )
60 file(WRITE ${include_file}
61 "include(\"${file_base}_include-\${CTEST_CONFIGURATION_TYPE}.cmake\")"
62 )
63 else()
64 file(GENERATE
65 OUTPUT ${include_file}
66 CONTENT "${include_content}"
67 )
68 endif()
69
70 set_property(DIRECTORY APPEND PROPERTY TEST_INCLUDE_FILES ${include_file})
71 endfunction()
72