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