RunCMakeTest.cmake 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. cmake_minimum_required(VERSION 3.30)
  2. include(RunCMake)
  3. function(instrument test)
  4. # Set Paths Variables
  5. set(config "${CMAKE_CURRENT_LIST_DIR}/config")
  6. set(ENV{CMAKE_CONFIG_DIR} ${config})
  7. cmake_parse_arguments(ARGS
  8. "BUILD;BUILD_MAKE_PROGRAM;INSTALL;TEST;COPY_QUERIES;COPY_QUERIES_GENERATED;NO_WARN;STATIC_QUERY;DYNAMIC_QUERY;INSTALL_PARALLEL;MANUAL_HOOK"
  9. "CHECK_SCRIPT;CONFIGURE_ARG" "" ${ARGN})
  10. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test})
  11. set(uuid "a37d1069-1972-4901-b9c9-f194aaf2b6e0")
  12. set(v1 ${RunCMake_TEST_BINARY_DIR}/.cmake/instrumentation-${uuid}/v1)
  13. set(query_dir ${CMAKE_CURRENT_LIST_DIR}/query)
  14. # Clear previous instrumentation data
  15. # We can't use RunCMake_TEST_NO_CLEAN 0 because we preserve queries placed in the build tree after
  16. file(REMOVE_RECURSE ${RunCMake_TEST_BINARY_DIR})
  17. # Set hook command
  18. set(static_query_hook_arg 0)
  19. if (ARGS_STATIC_QUERY)
  20. set(static_query_hook_arg 1)
  21. endif()
  22. set(GET_HOOK "\\\"${CMAKE_COMMAND}\\\" -P \\\"${RunCMake_SOURCE_DIR}/hook.cmake\\\" ${static_query_hook_arg}")
  23. # Load query JSON and cmake (with cmake_instrumentation(...)) files
  24. set(query ${query_dir}/${test}.json.in)
  25. set(cmake_file ${query_dir}/${test}.cmake)
  26. if (EXISTS ${query})
  27. file(MAKE_DIRECTORY ${v1}/query)
  28. configure_file(${query} ${v1}/query/${test}.json)
  29. elseif (EXISTS ${cmake_file})
  30. list(APPEND ARGS_CONFIGURE_ARG "-DINSTRUMENT_COMMAND_FILE=${cmake_file}")
  31. endif()
  32. set(copy_loc ${RunCMake_TEST_BINARY_DIR}/query)
  33. if (ARGS_COPY_QUERIES_GENERATED)
  34. set(ARGS_COPY_QUERIES TRUE)
  35. set(copy_loc ${v1}/query/generated) # Copied files here should be cleared on configure
  36. endif()
  37. if (ARGS_COPY_QUERIES)
  38. file(MAKE_DIRECTORY ${copy_loc})
  39. set(generated_queries "0;1;2")
  40. foreach(n IN LISTS generated_queries)
  41. configure_file(
  42. "${query_dir}/generated/query-${n}.json.in"
  43. "${copy_loc}/query-${n}.json"
  44. )
  45. endforeach()
  46. endif()
  47. # Configure Test Case
  48. set(RunCMake_TEST_NO_CLEAN 1)
  49. if (ARGS_NO_WARN)
  50. list(APPEND ARGS_CONFIGURE_ARG "-Wno-dev")
  51. endif()
  52. set(RunCMake_TEST_SOURCE_DIR ${RunCMake_SOURCE_DIR}/project)
  53. if(NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
  54. set(maybe_CMAKE_BUILD_TYPE -DCMAKE_BUILD_TYPE=Debug)
  55. endif()
  56. run_cmake_with_options(${test} ${ARGS_CONFIGURE_ARG} ${maybe_CMAKE_BUILD_TYPE})
  57. # Follow-up Commands
  58. if (ARGS_BUILD)
  59. run_cmake_command(${test}-build ${CMAKE_COMMAND} --build . --config Debug)
  60. endif()
  61. if (ARGS_BUILD_MAKE_PROGRAM)
  62. run_cmake_command(${test}-make-program ${RunCMake_MAKE_PROGRAM})
  63. endif()
  64. if (ARGS_INSTALL)
  65. run_cmake_command(${test}-install ${CMAKE_COMMAND} --install . --prefix install --config Debug)
  66. endif()
  67. if (ARGS_TEST)
  68. run_cmake_command(${test}-test ${CMAKE_CTEST_COMMAND} . -C Debug)
  69. endif()
  70. if (ARGS_MANUAL_HOOK)
  71. run_cmake_command(${test}-index ${CMAKE_CTEST_COMMAND} --collect-instrumentation .)
  72. endif()
  73. # Run Post-Test Checks
  74. # Check scripts need to run after ALL run_cmake_command have finished
  75. if (ARGS_CHECK_SCRIPT)
  76. set(RunCMake-check-file ${ARGS_CHECK_SCRIPT})
  77. set(RunCMake_CHECK_ONLY 1)
  78. run_cmake(${test}-verify)
  79. unset(RunCMake-check-file)
  80. unset(RunCMake_CHECK_ONLY)
  81. endif()
  82. endfunction()
  83. # Bad Queries
  84. instrument(bad-option)
  85. instrument(bad-hook)
  86. instrument(empty)
  87. instrument(bad-version)
  88. # Verify Hooks Run and Index File
  89. instrument(hooks-1 BUILD INSTALL TEST STATIC_QUERY)
  90. instrument(hooks-2 BUILD INSTALL TEST)
  91. instrument(hooks-no-callbacks MANUAL_HOOK)
  92. # Check data file contents for optional query data
  93. instrument(no-query BUILD INSTALL TEST
  94. CHECK_SCRIPT check-data-dir.cmake)
  95. instrument(dynamic-query BUILD INSTALL TEST DYNAMIC_QUERY
  96. CHECK_SCRIPT check-data-dir.cmake)
  97. instrument(both-query BUILD INSTALL TEST DYNAMIC_QUERY
  98. CHECK_SCRIPT check-data-dir.cmake)
  99. # cmake_instrumentation command
  100. instrument(cmake-command
  101. COPY_QUERIES NO_WARN DYNAMIC_QUERY
  102. CHECK_SCRIPT check-generated-queries.cmake)
  103. instrument(cmake-command-data
  104. COPY_QUERIES NO_WARN BUILD INSTALL TEST DYNAMIC_QUERY
  105. CHECK_SCRIPT check-data-dir.cmake)
  106. instrument(cmake-command-bad-api-version NO_WARN)
  107. instrument(cmake-command-bad-data-version NO_WARN)
  108. instrument(cmake-command-missing-version NO_WARN)
  109. instrument(cmake-command-bad-arg NO_WARN)
  110. instrument(cmake-command-parallel-install
  111. BUILD INSTALL TEST NO_WARN INSTALL_PARALLEL DYNAMIC_QUERY
  112. CHECK_SCRIPT check-data-dir.cmake)
  113. instrument(cmake-command-resets-generated NO_WARN
  114. COPY_QUERIES_GENERATED
  115. CHECK_SCRIPT check-data-dir.cmake
  116. )
  117. # FIXME(#26668) This does not work on Windows
  118. if (UNIX)
  119. instrument(cmake-command-make-program NO_WARN
  120. BUILD_MAKE_PROGRAM
  121. CHECK_SCRIPT check-make-program-hooks.cmake)
  122. endif()