RunCMakeTest.cmake 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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;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. # Configure generated query files to compare CMake output
  33. if (ARGS_COPY_QUERIES)
  34. file(MAKE_DIRECTORY ${RunCMake_TEST_BINARY_DIR}/query)
  35. set(generated_queries "0;1;2")
  36. foreach(n ${generated_queries})
  37. configure_file(
  38. "${query_dir}/generated/query-${n}.json.in"
  39. "${RunCMake_TEST_BINARY_DIR}/query/query-${n}.json"
  40. )
  41. endforeach()
  42. endif()
  43. # Configure Test Case
  44. set(RunCMake_TEST_NO_CLEAN 1)
  45. if (ARGS_NO_WARN)
  46. list(APPEND ARGS_CONFIGURE_ARG "-Wno-dev")
  47. endif()
  48. set(RunCMake_TEST_SOURCE_DIR ${RunCMake_SOURCE_DIR}/project)
  49. run_cmake_with_options(${test} ${ARGS_CONFIGURE_ARG})
  50. # Follow-up Commands
  51. if (ARGS_BUILD)
  52. run_cmake_command(${test}-build ${CMAKE_COMMAND} --build . --config Debug)
  53. endif()
  54. if (ARGS_BUILD_MAKE_PROGRAM)
  55. run_cmake_command(${test}-make-program ${RunCMake_MAKE_PROGRAM})
  56. endif()
  57. if (ARGS_INSTALL)
  58. run_cmake_command(${test}-install ${CMAKE_COMMAND} --install . --prefix install --config Debug)
  59. endif()
  60. if (ARGS_TEST)
  61. run_cmake_command(${test}-test ${CMAKE_CTEST_COMMAND} . -C Debug)
  62. endif()
  63. if (ARGS_MANUAL_HOOK)
  64. run_cmake_command(${test}-index ${CMAKE_CTEST_COMMAND} --collect-instrumentation .)
  65. endif()
  66. # Run Post-Test Checks
  67. # Check scripts need to run after ALL run_cmake_command have finished
  68. if (ARGS_CHECK_SCRIPT)
  69. set(RunCMake-check-file ${ARGS_CHECK_SCRIPT})
  70. set(RunCMake_CHECK_ONLY 1)
  71. run_cmake(${test}-verify)
  72. unset(RunCMake-check-file)
  73. unset(RunCMake_CHECK_ONLY)
  74. endif()
  75. endfunction()
  76. # Bad Queries
  77. instrument(bad-query)
  78. instrument(bad-hook)
  79. instrument(empty)
  80. instrument(bad-version)
  81. # Verify Hooks Run and Index File
  82. instrument(hooks-1 BUILD INSTALL TEST STATIC_QUERY)
  83. instrument(hooks-2 BUILD INSTALL TEST)
  84. instrument(hooks-no-callbacks MANUAL_HOOK)
  85. # Check data file contents
  86. instrument(no-query BUILD INSTALL TEST
  87. CHECK_SCRIPT check-data-dir.cmake)
  88. instrument(dynamic-query BUILD INSTALL TEST DYNAMIC_QUERY
  89. CHECK_SCRIPT check-data-dir.cmake)
  90. instrument(both-query BUILD INSTALL TEST DYNAMIC_QUERY
  91. CHECK_SCRIPT check-data-dir.cmake)
  92. # cmake_instrumentation command
  93. instrument(cmake-command
  94. COPY_QUERIES NO_WARN DYNAMIC_QUERY
  95. CHECK_SCRIPT check-generated-queries.cmake)
  96. instrument(cmake-command-data
  97. COPY_QUERIES NO_WARN BUILD INSTALL TEST DYNAMIC_QUERY
  98. CHECK_SCRIPT check-data-dir.cmake)
  99. instrument(cmake-command-bad-api-version NO_WARN)
  100. instrument(cmake-command-bad-data-version NO_WARN)
  101. instrument(cmake-command-missing-version NO_WARN)
  102. instrument(cmake-command-bad-arg NO_WARN)
  103. instrument(cmake-command-parallel-install
  104. BUILD INSTALL TEST NO_WARN INSTALL_PARALLEL DYNAMIC_QUERY
  105. CHECK_SCRIPT check-data-dir.cmake)
  106. if (UNIX AND ${RunCMake_GENERATOR} MATCHES "^Ninja")
  107. instrument(cmake-command-ninja NO_WARN
  108. BUILD_MAKE_PROGRAM
  109. CHECK_SCRIPT check-ninja-hooks.cmake)
  110. endif()