RunCMakeTest.cmake 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. include(RunCMake)
  2. run_cmake(NoQt)
  3. if (DEFINED with_qt_version)
  4. set(RunCMake_TEST_OPTIONS
  5. -Dwith_qt_version=${with_qt_version}
  6. "-DQt${with_qt_version}_DIR:PATH=${Qt${with_qt_version}_DIR}"
  7. "-DCMAKE_PREFIX_PATH:STRING=${CMAKE_PREFIX_PATH}"
  8. )
  9. run_cmake(QtInFunction)
  10. run_cmake(QtInFunctionNested)
  11. run_cmake(QtInFunctionProperty)
  12. run_cmake(CMP0111-imported-target-full)
  13. run_cmake(CMP0111-imported-target-libname)
  14. run_cmake(CMP0111-imported-target-implib-only)
  15. block()
  16. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MocPredefs-build)
  17. run_cmake(MocPredefs)
  18. set(RunCMake_TEST_NO_CLEAN 1)
  19. run_cmake_command(MocPredefs-build ${CMAKE_COMMAND} --build . --config Debug)
  20. endblock()
  21. # Detect information from the toolchain:
  22. # - CMAKE_INCLUDE_FLAG_CXX
  23. # - CMAKE_INCLUDE_SYSTEM_FLAG_CXX
  24. run_cmake(Inspect)
  25. include("${RunCMake_BINARY_DIR}/Inspect-build/info.cmake")
  26. if(CMAKE_INCLUDE_SYSTEM_FLAG_CXX)
  27. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  28. string(REGEX REPLACE "^-" "/" test_expect_stdout "${CMAKE_INCLUDE_SYSTEM_FLAG_CXX}")
  29. else()
  30. set(test_expect_stdout "-*${CMAKE_INCLUDE_SYSTEM_FLAG_CXX}")
  31. endif()
  32. string(APPEND test_expect_stdout " *(\"[^\"]*|([^ ]|\\ )*)[\\/]dummy_autogen[\\/]include")
  33. if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  34. string(APPEND test_expect_stdout "_Debug")
  35. endif()
  36. block()
  37. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CMP0151-new-build)
  38. run_cmake_with_options(CMP0151-new ${RunCMake_TEST_OPTIONS} -DCMAKE_POLICY_DEFAULT_CMP0151=NEW)
  39. set(RunCMake_TEST_NO_CLEAN 1)
  40. set(RunCMake_TEST_EXPECT_stdout "${test_expect_stdout}")
  41. message(STATUS "RunCMake_TEST_EXPECT_stdout: ${RunCMake_TEST_EXPECT_stdout}")
  42. run_cmake_command(CMP0151-new-build ${CMAKE_COMMAND} --build . --config Debug --verbose)
  43. endblock()
  44. block()
  45. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/AutogenUseSystemIncludeOn-build)
  46. run_cmake_with_options(AutogenUseSystemIncludeOn ${RunCMake_TEST_OPTIONS} -DCMAKE_POLICY_DEFAULT_CMP0151=NEW)
  47. set(RunCMake_TEST_NO_CLEAN 1)
  48. set(RunCMake_TEST_EXPECT_stdout "${test_expect_stdout}")
  49. message(STATUS "RunCMake_TEST_EXPECT_stdout: ${RunCMake_TEST_EXPECT_stdout}")
  50. run_cmake_command(AutogenUseSystemIncludeOn ${CMAKE_COMMAND} --build . --config Debug --verbose)
  51. endblock()
  52. endif()
  53. if(CMAKE_INCLUDE_FLAG_CXX)
  54. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  55. string(REGEX REPLACE "^-" "/" test_expect_stdout "${CMAKE_INCLUDE_FLAG_CXX}")
  56. else()
  57. set(test_expect_stdout "-*${CMAKE_INCLUDE_FLAG_CXX}")
  58. endif()
  59. string(APPEND test_expect_stdout " *(\"[^\"]*|([^ ]|\\ )*)[\\/]dummy_autogen[\\/]include")
  60. if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  61. string(APPEND test_expect_stdout "_Debug")
  62. endif()
  63. block()
  64. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CMP0151-old-build)
  65. run_cmake_with_options(CMP0151-old ${RunCMake_TEST_OPTIONS} -DCMAKE_POLICY_DEFAULT_CMP0151=OLD)
  66. set(RunCMake_TEST_NO_CLEAN 1)
  67. set(RunCMake_TEST_EXPECT_stdout "${test_expect_stdout}")
  68. message(STATUS "RunCMake_TEST_EXPECT_stdout: ${RunCMake_TEST_EXPECT_stdout}")
  69. run_cmake_command(CMP0151-old-build ${CMAKE_COMMAND} --build . --config Debug --verbose)
  70. endblock()
  71. block()
  72. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/AutogenUseSystemIncludeOff-build)
  73. run_cmake_with_options(AutogenUseSystemIncludeOff ${RunCMake_TEST_OPTIONS} -DCMAKE_POLICY_DEFAULT_CMP0151=NEW)
  74. set(RunCMake_TEST_NO_CLEAN 1)
  75. set(RunCMake_TEST_EXPECT_stdout "${test_expect_stdout}")
  76. message(STATUS "RunCMake_TEST_EXPECT_stdout: ${RunCMake_TEST_EXPECT_stdout}")
  77. run_cmake_command(AutogenUseSystemIncludeOff ${CMAKE_COMMAND} --build . --config Debug --verbose)
  78. endblock()
  79. if(RunCMake_GENERATOR MATCHES "Make|Ninja")
  80. block()
  81. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/AutogenSkipLinting-build)
  82. list(APPEND RunCMake_TEST_OPTIONS
  83. "-DPSEUDO_CPPCHECK=${PSEUDO_CPPCHECK}"
  84. "-DPSEUDO_CPPLINT=${PSEUDO_CPPLINT}"
  85. "-DPSEUDO_IWYU=${PSEUDO_IWYU}"
  86. "-DPSEUDO_TIDY=${PSEUDO_TIDY}")
  87. run_cmake(AutogenSkipLinting)
  88. set(RunCMake_TEST_NO_CLEAN 1)
  89. run_cmake_command(AutogenSkipLinting-build ${CMAKE_COMMAND} --build . --config Debug --verbose)
  90. endblock()
  91. endif()
  92. endif()
  93. if(RunCMake_GENERATOR_IS_MULTI_CONFIG AND NOT RunCMake_GENERATOR MATCHES "Xcode")
  94. block()
  95. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MocGeneratedFile-build)
  96. run_cmake(MocGeneratedFile)
  97. set(RunCMake_TEST_NO_CLEAN 1)
  98. run_cmake_command(MocGeneratedFile-build ${CMAKE_COMMAND} --build . --config Debug --verbose)
  99. endblock()
  100. if(RunCMake_GENERATOR MATCHES "Ninja Multi-Config")
  101. block()
  102. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MocGeneratedFile-cross-config-build)
  103. list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_CROSS_CONFIGS=all)
  104. run_cmake(MocGeneratedFile)
  105. set(RunCMake_TEST_NO_CLEAN 1)
  106. run_cmake_command(MocGeneratedFile-cross-config-build ${CMAKE_COMMAND} --build . --config Release --target libgen:Debug)
  107. run_cmake_command(MocGeneratedFile-cross-config-build ${CMAKE_COMMAND} --build . --config Debug --target libgen:Release)
  108. endblock()
  109. endif()
  110. endif()
  111. if(RunCMake_GENERATOR MATCHES "Make|Ninja")
  112. block()
  113. if(QtCore_VERSION VERSION_GREATER_EQUAL 5.15.0)
  114. if (RunCMake_GENERATOR MATCHES "Ninja Multi-Config")
  115. set(config_list Debug Release RelWithDebInfo)
  116. else()
  117. set(config_list single-config)
  118. endif()
  119. foreach(config IN ITEMS ${config_list})
  120. block()
  121. if (config STREQUAL "single-config")
  122. set(config_suffix "")
  123. else()
  124. set(config_suffix "_${config}")
  125. endif()
  126. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/QtAutoMocDeps${config_suffix}-build)
  127. run_cmake(QtAutoMocDeps)
  128. set(RunCMake_TEST_NO_CLEAN 1)
  129. # Build the project.
  130. if (config STREQUAL "single-config")
  131. set(config_param "")
  132. else()
  133. set(config_param "--config ${config}")
  134. endif()
  135. run_cmake_command(QtAutoMocDeps-build ${CMAKE_COMMAND} --build . --verbose ${config_param})
  136. # Touch just the library source file, which shouldn't cause a rerun of AUTOMOC
  137. # for app_with_qt target.
  138. file(TOUCH "${RunCMake_SOURCE_DIR}/simple_lib.cpp")
  139. set(RunCMake_TEST_NOT_EXPECT_stdout "Automatic MOC for target app_with_qt|\
  140. Automatic MOC for target sub_exe_1|\
  141. Automatic MOC for target sub_exe_2")
  142. set(RunCMake_TEST_VARIANT_DESCRIPTION "-Don't execute AUTOMOC for 'app_with_qt', 'sub_exe_1' and 'sub_exe_2'")
  143. # Build and assert that AUTOMOC was not run for app_with_qt, sub_exe_1 and sub_exe_2.
  144. run_cmake_command(QtAutoMocDeps-build ${CMAKE_COMMAND} --build . --verbose ${config_param})
  145. unset(RunCMake_TEST_VARIANT_DESCRIPTION)
  146. unset(RunCMake_TEST_NOT_EXPECT_stdout)
  147. macro(check_file_exists file)
  148. if (EXISTS "${file}")
  149. set(check_result "PASSED")
  150. set(message_type "STATUS")
  151. else()
  152. set(check_result "FAILED")
  153. set(message_type "FATAL_ERROR")
  154. endif()
  155. message(${message_type} "QtAutoMocDeps-build-\"${file}\" was generated - ${check_result}")
  156. endmacro()
  157. check_file_exists("${RunCMake_TEST_BINARY_DIR}/app_with_qt_autogen/deps${config_suffix}")
  158. check_file_exists("${RunCMake_TEST_BINARY_DIR}/QtSubDir1/sub_exe_1_autogen/deps${config_suffix}")
  159. check_file_exists("${RunCMake_TEST_BINARY_DIR}/QtSubDir2/sub_exe_2_autogen/deps${config_suffix}")
  160. check_file_exists("${RunCMake_TEST_BINARY_DIR}/app_with_qt_autogen/timestamp${config_suffix}")
  161. check_file_exists("${RunCMake_TEST_BINARY_DIR}/QtSubDir1/sub_exe_1_autogen/timestamp${config_suffix}")
  162. check_file_exists("${RunCMake_TEST_BINARY_DIR}/QtSubDir2/sub_exe_2_autogen/timestamp${config_suffix}")
  163. # Touch a header file to make sure an automoc dependency cycle is not introduced.
  164. file(TOUCH "${RunCMake_SOURCE_DIR}/MyWindow.h")
  165. set(RunCMake_TEST_VARIANT_DESCRIPTION "-First build after touch to detect dependency cycle")
  166. run_cmake_command(QtAutoMocDeps-build ${CMAKE_COMMAND} --build . --verbose)
  167. # Need to run a second time to hit the dependency cycle.
  168. set(RunCMake_TEST_VARIANT_DESCRIPTION "-Don't hit dependency cycle")
  169. run_cmake_command(QtAutoMocDeps-build ${CMAKE_COMMAND} --build . --verbose)
  170. endblock()
  171. endforeach()
  172. endif()
  173. endblock()
  174. endif()
  175. function(run_make_program dir)
  176. execute_process(
  177. COMMAND "${RunCMake_MAKE_PROGRAM}" ${ARGN}
  178. WORKING_DIRECTORY "${dir}"
  179. OUTPUT_VARIABLE make_program_stdout
  180. ERROR_VARIABLE make_program_stderr
  181. RESULT_VARIABLE make_program_result
  182. )
  183. if (NOT DEFINED RunMakeProgram_expected_result)
  184. set(RunMakeProgram_expected_result 0)
  185. endif()
  186. if(NOT "${make_program_result}" MATCHES "${RunMakeProgram_expected_result}")
  187. message(STATUS "
  188. ============ beginning of ${RunCMake_MAKE_PROGRAM}'s stdout ============
  189. ${make_program_stdout}
  190. =============== end of ${RunCMake_MAKE_PROGRAM}'s stdout ===============
  191. ")
  192. message(STATUS "
  193. ============ beginning of ${RunCMake_MAKE_PROGRAM}'s stderr ============
  194. ${make_program_stderr}
  195. =============== end of ${RunCMake_MAKE_PROGRAM}'s stderr ===============
  196. ")
  197. message(FATAL_ERROR
  198. "top ${RunCMake_MAKE_PROGRAM} build failed exited with status ${make_program_result}")
  199. endif()
  200. set(make_program_stdout "${make_program_stdout}" PARENT_SCOPE)
  201. endfunction(run_make_program)
  202. function(count_substring STRING SUBSTRING COUNT_VAR)
  203. string(LENGTH "${STRING}" STRING_LENGTH)
  204. string(LENGTH "${SUBSTRING}" SUBSTRING_LENGTH)
  205. if (SUBSTRING_LENGTH EQUAL 0)
  206. message(FATAL_ERROR "SUBSTRING_LENGTH is 0")
  207. endif()
  208. if (STRING_LENGTH EQUAL 0)
  209. message(FATAL_ERROR "STRING_LENGTH is 0")
  210. endif()
  211. if (STRING_LENGTH LESS SUBSTRING_LENGTH)
  212. message(FATAL_ERROR "STRING_LENGTH is less than SUBSTRING_LENGTH")
  213. endif()
  214. set(COUNT 0)
  215. string(FIND "${STRING}" "${SUBSTRING}" SUBSTRING_START)
  216. while(SUBSTRING_START GREATER_EQUAL 0)
  217. math(EXPR COUNT "${COUNT} + 1")
  218. math(EXPR SUBSTRING_START "${SUBSTRING_START} + ${SUBSTRING_LENGTH}")
  219. string(SUBSTRING "${STRING}" ${SUBSTRING_START} -1 STRING)
  220. string(FIND "${STRING}" "${SUBSTRING}" SUBSTRING_START)
  221. endwhile()
  222. set(${COUNT_VAR} ${COUNT} PARENT_SCOPE)
  223. endfunction()
  224. function(expect_only_once make_program_stdout expected_output test_name)
  225. count_substring("${make_program_stdout}" "${expected_output}" count)
  226. if(NOT count EQUAL 1)
  227. message(STATUS "${test_name}-expect_only_once - FAILED")
  228. message(FATAL_ERROR "Expected to find ${expected_output} exactly once in ${make_program_stdout} but found ${count} occurrences of ${expected_output}")
  229. else()
  230. message(STATUS "${test_name}-expect_only_once - PASSED")
  231. endif()
  232. endfunction()
  233. function(expect_n_times string_to_check expected_output expected_count test_name)
  234. count_substring("${string_to_check}" "${expected_output}" count)
  235. if(NOT count EQUAL ${expected_count})
  236. message(STATUS "${test_name}-expect_${expected_count}_times - FAILED")
  237. message(FATAL_ERROR "Expected to find ${expected_output} exactly ${expected_count} times in ${string_to_check} but found ${count} occurrences of ${expected_output}")
  238. else()
  239. message(STATUS "${test_name}-expect_${expected_count}_times - PASSED")
  240. endif()
  241. endfunction()
  242. function(not_expect make_program_stdout unexpected_output test_name)
  243. count_substring("${make_program_stdout}" "${unexpected_output}" count)
  244. if(NOT count EQUAL 0)
  245. message(STATUS "${test_name}-not_expect - FAILED")
  246. message(FATAL_ERROR "Expected to find ${unexpected_output} exactly 0 times in ${make_program_stdout} but found ${count} occurrences of ${unexpected_output}")
  247. else()
  248. message(STATUS "${test_name}-not_expect - PASSED")
  249. endif()
  250. endfunction()
  251. if (QtCore_VERSION VERSION_GREATER_EQUAL 5.15.0)
  252. foreach(exe IN ITEMS Moc Uic Rcc)
  253. if(RunCMake_GENERATOR MATCHES "Ninja Multi-Config")
  254. block()
  255. set(RunCMake_TEST_VARIANT_DESCRIPTION "-CMake-configure")
  256. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Auto${exe}ExecutableConfig-multi-config-build)
  257. run_cmake_with_options(Auto${exe}ExecutableConfig ${RunCMake_TEST_OPTIONS} -DCMAKE_AUTOGEN_VERBOSE=ON)
  258. unset(RunCMake_TEST_VARIANT_DESCRIPTION)
  259. set(RunCMake_TEST_NO_CLEAN 1)
  260. foreach(config IN ITEMS Debug Release RelWithDebInfo)
  261. block()
  262. set(RunCMake_TEST_EXPECT_stdout ".*running_exe_${config}*")
  263. set(RunCMake_TEST_VARIANT_DESCRIPTION "-${config}-expect_running_exe_${config}")
  264. run_cmake_command(Auto${exe}ExecutableConfig-multi-config-build ${CMAKE_COMMAND} --build . --config ${config})
  265. endblock()
  266. endforeach()
  267. set(RunCMake_TEST_EXPECT_stdout "ninja: no work to do")
  268. foreach(config IN ITEMS Debug Release RelWithDebInfo)
  269. block()
  270. set(RunCMake_TEST_VARIANT_DESCRIPTION "-${config}-expect_no_work_to_do")
  271. run_cmake_command(Auto${exe}ExecutableConfig-multi-config-build ${CMAKE_COMMAND} --build . --config ${config})
  272. endblock()
  273. endforeach()
  274. endblock()
  275. block()
  276. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Auto${exe}ExecutableConfig-build)
  277. run_cmake_with_options(Auto${exe}ExecutableConfig ${RunCMake_TEST_OPTIONS} -DCMAKE_AUTOGEN_VERBOSE=ON)
  278. foreach(config IN ITEMS Debug Release RelWithDebInfo)
  279. block()
  280. run_make_program(${RunCMake_TEST_BINARY_DIR} --verbose -f build-${config}.ninja)
  281. set(expected_output "running_exe_${config}")
  282. expect_only_once("${make_program_stdout}" "${expected_output}" "Auto${exe}ExecutableConfig-${config}-${expected_output}")
  283. foreach(sub_config IN ITEMS Debug Release RelWithDebInfo)
  284. if(NOT sub_config STREQUAL config)
  285. set(unexpected_output "running_exe_${sub_config}")
  286. not_expect("${make_program_stdout}" "${unexpected_output}" "Auto${exe}ExecutableConfig-${config}-${unexpected_output}")
  287. endif()
  288. endforeach()
  289. if (exe STREQUAL "Moc" OR exe STREQUAL "Uic")
  290. set(expected_output "cmake_autogen")
  291. else()
  292. set(expected_output "cmake_autorcc")
  293. endif()
  294. expect_only_once("${make_program_stdout}" "${expected_output}" "Auto${exe}ExecutableConfig-${config}-${expected_output}")
  295. endblock()
  296. endforeach()
  297. endblock()
  298. block()
  299. foreach(ninja_config IN ITEMS Debug Release RelWithDebInfo)
  300. foreach(target_config IN ITEMS Debug Release RelWithDebInfo)
  301. block()
  302. set(TEST_SUFFIX "-CrossConfig-${ninja_config}-${target_config}")
  303. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Auto${exe}ExecutableConfig${TEST_SUFFIX}-build)
  304. set(RunCMake_TEST_VARIANT_DESCRIPTION ${TEST_SUFFIX})
  305. run_cmake_with_options(Auto${exe}ExecutableConfig ${RunCMake_TEST_OPTIONS} -DCMAKE_CROSS_CONFIGS=all -DCMAKE_DEFAULT_BUILD_TYPE=${ninja_config})
  306. unset(RunCMake_TEST_VARIANT_DESCRIPTION)
  307. run_make_program(${RunCMake_TEST_BINARY_DIR} --verbose -f build-${ninja_config}.ninja dummy:${target_config})
  308. set(expected_output "running_exe_${ninja_config}")
  309. expect_only_once("${make_program_stdout}" "${expected_output}" "Auto${exe}ExecutableConfig${TEST_SUFFIX}-${expected_output}")
  310. foreach(sub_config IN ITEMS Debug Release RelWithDebInfo)
  311. if(NOT sub_config STREQUAL ninja_config)
  312. set(unexpected_output "running_exe_${sub_config}")
  313. not_expect("${make_program_stdout}" "${unexpected_output}" "Auto${exe}ExecutableConfig${TEST_SUFFIX}-${unexpected_output}")
  314. endif()
  315. endforeach()
  316. if (exe STREQUAL "Moc" OR exe STREQUAL "Uic")
  317. set(expected_output "cmake_autogen")
  318. else()
  319. set(expected_output "cmake_autorcc")
  320. endif()
  321. expect_only_once("${make_program_stdout}" "${expected_output}" "Auto${exe}ExecutableConfig${TEST_SUFFIX}-${expected_output}")
  322. endblock()
  323. endforeach()
  324. endforeach()
  325. endblock()
  326. block()
  327. foreach(ninja_config IN ITEMS Debug Release RelWithDebInfo)
  328. set(TEST_SUFFIX "-CrossConfig-${ninja_config}-all-all")
  329. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Auto${exe}ExecutableConfig${TEST_SUFFIX}-build)
  330. set(RunCMake_TEST_VARIANT_DESCRIPTION ${TEST_SUFFIX})
  331. run_cmake_with_options(Auto${exe}ExecutableConfig ${RunCMake_TEST_OPTIONS} -DCMAKE_CROSS_CONFIGS=all)
  332. unset(RunCMake_TEST_VARIANT_DESCRIPTION)
  333. run_make_program(${RunCMake_TEST_BINARY_DIR} --verbose -f build-${ninja_config}.ninja all:all)
  334. endforeach()
  335. endblock()
  336. elseif (RunCMake_GENERATOR MATCHES "Ninja|Make")
  337. block()
  338. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Auto${exe}ExecutableConfig-build)
  339. foreach(config IN ITEMS Debug Release RelWithDebInfo)
  340. block()
  341. set(RunCMake_TEST_VARIANT_DESCRIPTION "-${config}")
  342. run_cmake_with_options(Auto${exe}ExecutableConfig ${RunCMake_TEST_OPTIONS} -DCMAKE_BUILD_TYPE=${config} -DCMAKE_AUTOGEN_VERBOSE=ON)
  343. unset(RunCMake_TEST_VARIANT_DESCRIPTION)
  344. set(RunCMake_TEST_NO_CLEAN 1)
  345. set(RunCMake_TEST_EXPECT_stdout ".*running_exe_${config}*")
  346. run_cmake_command(Auto${exe}ExecutableConfig-${config}-build ${CMAKE_COMMAND} --build .)
  347. endblock()
  348. endforeach()
  349. endblock()
  350. endif()
  351. endforeach()
  352. endif()
  353. # Visual Studio specific dependency tests
  354. if (RunCMake_GENERATOR MATCHES "Visual Studio")
  355. foreach(exe IN ITEMS Moc Uic Rcc)
  356. block()
  357. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${exe}Example-build)
  358. set(RunCMake_TEST_VARIANT_DESCRIPTION "-CMake-configure")
  359. run_cmake_with_options(${exe}Example ${RunCMake_TEST_OPTIONS} -DCMAKE_AUTOGEN_VERBOSE=ON)
  360. unset(RunCMake_TEST_VARIANT_DESCRIPTION)
  361. set(RunCMake_TEST_NO_CLEAN 1)
  362. foreach(config IN ITEMS Debug Release RelWithDebInfo)
  363. block()
  364. set(RunCMake_TEST_VARIANT_DESCRIPTION "-${config}-first-build")
  365. run_cmake_command(${exe}Example-build ${CMAKE_COMMAND} --build . --config ${config})
  366. endblock()
  367. endforeach()
  368. foreach(config IN ITEMS Debug Release RelWithDebInfo)
  369. block()
  370. if (exe STREQUAL "Moc" OR exe STREQUAL "Uic")
  371. set(RunCMake_TEST_NOT_EXPECT_stdout "Auto${exe}")
  372. set(not_expect_descripton "Auto${exe}")
  373. else ()
  374. set(RunCMake_TEST_NOT_EXPECT_stdout "qrc_data.cpp|Auto${exe}")
  375. set(not_expect_descripton "qrc_data.cpp_and_Auto${exe}")
  376. endif()
  377. set(RunCMake_TEST_VARIANT_DESCRIPTION "-second-build-${config}_expect_no_${not_expect_descripton}")
  378. run_cmake_command(${exe}Example-build ${CMAKE_COMMAND} --build . --config ${config})
  379. endblock()
  380. endforeach()
  381. endblock()
  382. endforeach()
  383. endif()
  384. if (RunCMake_GENERATOR MATCHES "Xcode")
  385. foreach(exe IN ITEMS Moc Uic Rcc)
  386. block()
  387. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${exe}Example-build)
  388. set(RunCMake_TEST_VARIANT_DESCRIPTION "-CMake-configure")
  389. set(RunCMake_TEST_EXPECT_stderr ".*")
  390. run_cmake_with_options(${exe}Example ${RunCMake_TEST_OPTIONS} -DCMAKE_AUTOGEN_VERBOSE=ON)
  391. set(RunCMake_TEST_NO_CLEAN 1)
  392. set(RunCMake_MAKE_PROGRAM ${CMAKE_COMMAND})
  393. run_make_program(${RunCMake_TEST_BINARY_DIR} --build . --config Debug)
  394. if (exe STREQUAL "Moc")
  395. set(expected_count 16)
  396. elseif (exe STREQUAL "Uic")
  397. set(expected_count 4)
  398. else()
  399. set(expected_count 12)
  400. endif()
  401. expect_n_times("${make_program_stdout}" "Auto${exe}:" ${expected_count} "${exe}Example-build-Auto${exe}")
  402. expect_n_times("${make_program_stdout}" "Auto${exe}:" ${expected_count} "${exe}Example-build-Auto${exe}")
  403. if (exe STREQUAL "Moc" OR exe STREQUAL "Uic")
  404. expect_n_times("${make_program_stdout}" "AutoGen:" 20 "${exe}Example-build-AutoGen:")
  405. endif()
  406. foreach(config IN ITEMS Debug Release RelWithDebInfo)
  407. block()
  408. run_make_program(${RunCMake_TEST_BINARY_DIR} --build . --config ${config})
  409. not_expect("${make_program_stdout}" "Auto${exe}" "${exe}Example-${config}_Auto${exe}")
  410. not_expect("${make_program_stdout}" "AutoGen:" "${exe}Example-${config}_AutoGen")
  411. endblock()
  412. endforeach()
  413. endblock()
  414. endforeach()
  415. endif()
  416. endif ()