RunCMakeTest.cmake 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. cmake_minimum_required(VERSION 3.12)
  2. include(RunCMake)
  3. # We do not contact any remote URLs, but may use a local one.
  4. # Remove any proxy configuration that may change behavior.
  5. unset(ENV{http_proxy})
  6. unset(ENV{https_proxy})
  7. run_cmake(BadIndependentStep1)
  8. run_cmake(BadIndependentStep2)
  9. run_cmake(NoOptions)
  10. run_cmake(SourceEmpty)
  11. run_cmake(SourceMissing)
  12. run_cmake(CMAKE_CACHE_ARGS)
  13. run_cmake(CMAKE_CACHE_DEFAULT_ARGS)
  14. run_cmake(CMAKE_CACHE_mix)
  15. if(NOT XCODE_VERSION OR XCODE_VERSION VERSION_LESS 12)
  16. run_cmake(NO_DEPENDS-CMP0114-WARN)
  17. run_cmake(NO_DEPENDS-CMP0114-OLD)
  18. endif()
  19. run_cmake(NO_DEPENDS-CMP0114-NEW)
  20. run_cmake(NO_DEPENDS-CMP0114-NEW-Direct)
  21. run_cmake(Add_StepDependencies)
  22. run_cmake(Add_StepDependencies_iface)
  23. run_cmake(Add_StepDependencies_iface_step)
  24. run_cmake(Add_StepDependencies_no_target)
  25. run_cmake(UsesTerminal)
  26. if(XCODE_VERSION AND XCODE_VERSION VERSION_GREATER_EQUAL 12)
  27. run_cmake(Xcode-CMP0114)
  28. endif()
  29. macro(check_steps_missing proj)
  30. set(steps "${ARGN}")
  31. foreach(step ${steps})
  32. if(EXISTS ${RunCMake_TEST_BINARY_DIR}/${proj}-${step}-mark)
  33. string(APPEND RunCMake_TEST_FAILED "${proj} '${step}' step ran but should not have\n")
  34. endif()
  35. endforeach()
  36. endmacro()
  37. macro(check_steps_present proj)
  38. set(steps "${ARGN}")
  39. foreach(step ${steps})
  40. if(NOT EXISTS ${RunCMake_TEST_BINARY_DIR}/${proj}-${step}-mark)
  41. string(APPEND RunCMake_TEST_FAILED "${proj} '${step}' step did not run but should have\n")
  42. endif()
  43. endforeach()
  44. endmacro()
  45. function(run_steps_CMP0114 val)
  46. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Steps-CMP0114-${val}-build)
  47. run_cmake(Steps-CMP0114-${val})
  48. set(RunCMake_TEST_NO_CLEAN 1)
  49. run_cmake_command(Steps-CMP0114-${val}-build-download ${CMAKE_COMMAND} --build . --target proj1-download)
  50. run_cmake_command(Steps-CMP0114-${val}-build-update ${CMAKE_COMMAND} --build . --target proj1-update)
  51. run_cmake_command(Steps-CMP0114-${val}-build-install ${CMAKE_COMMAND} --build . --target proj1-install)
  52. run_cmake_command(Steps-CMP0114-${val}-build-test ${CMAKE_COMMAND} --build . --target proj1-test)
  53. endfunction()
  54. if(NOT XCODE_VERSION OR XCODE_VERSION VERSION_LESS 12)
  55. run_steps_CMP0114(OLD)
  56. endif()
  57. run_steps_CMP0114(NEW)
  58. # Run both cmake and build steps. We always do a clean before the
  59. # build to ensure that the download step re-runs each time.
  60. function(__ep_test_with_build testName)
  61. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${testName}-build)
  62. set(RunCMake_TEST_NO_CLEAN 1)
  63. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  64. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  65. run_cmake(${testName})
  66. run_cmake_command(${testName}-clean ${CMAKE_COMMAND} --build . --target clean)
  67. run_cmake_command(${testName}-build ${CMAKE_COMMAND} --build .)
  68. endfunction()
  69. find_package(Python3)
  70. function(__ep_test_with_build_with_server testName)
  71. if(NOT Python3_EXECUTABLE)
  72. return()
  73. endif()
  74. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${testName}-build)
  75. set(RunCMake_TEST_NO_CLEAN 1)
  76. set(RunCMake_TEST_TIMEOUT 20)
  77. set(RunCMake_TEST_OUTPUT_MERGE TRUE)
  78. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  79. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  80. set(URL_FILE ${RunCMake_BINARY_DIR}/${testName}.url)
  81. if(EXISTS "${URL_FILE}")
  82. file(REMOVE "${URL_FILE}")
  83. endif()
  84. execute_process(
  85. COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/DownloadServer.py --file "${URL_FILE}" ${ARGN}
  86. OUTPUT_FILE ${RunCMake_BINARY_DIR}/${testName}-python.txt
  87. ERROR_FILE ${RunCMake_BINARY_DIR}/${testName}-python.txt
  88. RESULT_VARIABLE result
  89. TIMEOUT 30
  90. )
  91. if(NOT result EQUAL 0)
  92. message(FATAL_ERROR "Failed to start download server:\n ${result}")
  93. endif()
  94. foreach(i RANGE 1 8)
  95. if(EXISTS ${URL_FILE})
  96. break()
  97. endif()
  98. execute_process(COMMAND ${CMAKE_COMMAND} -E sleep ${i})
  99. endforeach()
  100. if(NOT EXISTS ${URL_FILE})
  101. message(FATAL_ERROR "Failed to load download server URL from:\n ${URL_FILE}")
  102. endif()
  103. file(READ ${URL_FILE} SERVER_URL)
  104. message(STATUS "URL : ${URL_FILE} - ${SERVER_URL}")
  105. run_cmake_with_options(${testName} ${CMAKE_COMMAND} -DSERVER_URL=${SERVER_URL} )
  106. run_cmake_command(${testName}-clean ${CMAKE_COMMAND} --build . --target clean)
  107. run_cmake_command(${testName}-build ${CMAKE_COMMAND} --build .)
  108. endfunction()
  109. __ep_test_with_build(MultiCommand)
  110. set(RunCMake_TEST_OUTPUT_MERGE 1)
  111. __ep_test_with_build(PreserveEmptyArgs)
  112. set(RunCMake_TEST_OUTPUT_MERGE 0)
  113. # Output is not predictable enough to be able to verify it reliably
  114. # when using the various different Visual Studio generators
  115. if(NOT RunCMake_GENERATOR MATCHES "Visual Studio")
  116. __ep_test_with_build(LogOutputOnFailure)
  117. __ep_test_with_build(LogOutputOnFailureMerged)
  118. __ep_test_with_build(DownloadTimeout)
  119. __ep_test_with_build_with_server(DownloadInactivityTimeout --speed_limit --limit_duration 40)
  120. __ep_test_with_build_with_server(DownloadInactivityResume --speed_limit --limit_duration 1)
  121. endif()
  122. # We can't test the substitution when using the old MSYS due to
  123. # make/sh mangling the paths (substitution is performed correctly,
  124. # but the mangling means we can't reliably test the output).
  125. # There is no such issue when using the newer MSYS though. Therefore,
  126. # we need to bypass the substitution test if using old MSYS.
  127. # See merge request 1537 for discussion.
  128. set(doSubstitutionTest YES)
  129. if(RunCMake_GENERATOR STREQUAL "MSYS Makefiles")
  130. execute_process(COMMAND uname OUTPUT_VARIABLE uname)
  131. if(uname MATCHES "^MINGW32_NT")
  132. set(doSubstitutionTest NO)
  133. endif()
  134. endif()
  135. if(doSubstitutionTest)
  136. __ep_test_with_build(Substitutions)
  137. endif()
  138. function(__ep_test_CONFIGURE_HANDLED_BY_BUILD)
  139. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CONFIGURE_HANDLED_BY_BUILD-build)
  140. run_cmake(CONFIGURE_HANDLED_BY_BUILD)
  141. if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  142. set(BUILD_CONFIG --config Debug)
  143. set(STAMP_DIR "${RunCMake_TEST_BINARY_DIR}/stamp/Debug")
  144. else()
  145. set(BUILD_CONFIG "")
  146. set(STAMP_DIR "${RunCMake_TEST_BINARY_DIR}/stamp")
  147. endif()
  148. set(RunCMake_TEST_NO_CLEAN 1)
  149. run_cmake_command(CONFIGURE_HANDLED_BY_BUILD-build ${CMAKE_COMMAND} --build . ${BUILD_CONFIG})
  150. # Calculate timestamps before rebuilding so we can compare before and after in
  151. # CONFIGURE_HANDLED_BY_BUILD-rebuild-check.cmake
  152. file(TIMESTAMP "${STAMP_DIR}/proj1-configure" PROJ1_CONFIGURE_TIMESTAMP_BEFORE "%s")
  153. # When BUILD_ALWAYS is set, the build stamp is never created.
  154. file(TIMESTAMP "${STAMP_DIR}/proj2-configure" PROJ2_CONFIGURE_TIMESTAMP_BEFORE "%s")
  155. file(TIMESTAMP "${STAMP_DIR}/proj2-build" PROJ2_BUILD_TIMESTAMP_BEFORE "%s")
  156. run_cmake_command(CONFIGURE_HANDLED_BY_BUILD-rebuild ${CMAKE_COMMAND} --build . ${BUILD_CONFIG})
  157. endfunction()
  158. if(NOT RunCMake_GENERATOR MATCHES "Visual Studio 9 ")
  159. __ep_test_CONFIGURE_HANDLED_BY_BUILD()
  160. endif()
  161. find_package(Git QUIET)
  162. if(GIT_EXECUTABLE)
  163. # Note that there appear to be differences in where git writes its output to
  164. # on some platforms. It may go to stdout or stderr, so force it to be merged.
  165. set(RunCMake_TEST_OUTPUT_MERGE TRUE)
  166. run_cmake(FetchGitTags)
  167. set(RunCMake_TEST_OUTPUT_MERGE FALSE)
  168. endif()