RunCMakeTest.cmake 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. include(RunCMake)
  2. set(RunCMake_GENERATOR "Ninja")
  3. set(RunCMake_GENERATOR_IS_MULTI_CONFIG 0)
  4. # Detect ninja version so we know what tests can be supported.
  5. execute_process(
  6. COMMAND "${RunCMake_MAKE_PROGRAM}" --version
  7. OUTPUT_VARIABLE ninja_out
  8. ERROR_VARIABLE ninja_out
  9. RESULT_VARIABLE ninja_res
  10. OUTPUT_STRIP_TRAILING_WHITESPACE
  11. )
  12. if(ninja_res EQUAL 0 AND "x${ninja_out}" MATCHES "^x[0-9]+\\.[0-9]+")
  13. set(ninja_version "${ninja_out}")
  14. message(STATUS "ninja version: ${ninja_version}")
  15. else()
  16. message(FATAL_ERROR "'ninja --version' reported:\n${ninja_out}")
  17. endif()
  18. # Sanitize NINJA_STATUS since we expect default behavior.
  19. unset(ENV{NINJA_STATUS})
  20. if(CMAKE_HOST_WIN32)
  21. run_cmake(SelectCompilerWindows)
  22. else()
  23. run_cmake(SelectCompilerUNIX)
  24. endif()
  25. function(run_NinjaToolMissing)
  26. set(RunCMake_MAKE_PROGRAM ninja-tool-missing)
  27. run_cmake(NinjaToolMissing)
  28. endfunction()
  29. run_NinjaToolMissing()
  30. function(run_Intl)
  31. run_cmake(Intl)
  32. set(RunCMake_TEST_NO_CLEAN 1)
  33. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Intl-build)
  34. set(RunCMake_TEST_OUTPUT_MERGE 1)
  35. run_cmake_command(Intl-build ${CMAKE_COMMAND} --build .)
  36. endfunction()
  37. run_Intl()
  38. if(WIN32)
  39. if(RunCMake_MAKE_PROGRAM)
  40. set(maybe_MAKE_PROGRAM "-DRunCMake_MAKE_PROGRAM=${RunCMake_MAKE_PROGRAM}")
  41. endif()
  42. run_cmake_script(ShowIncludes-437-ClangCl -DshowIncludes=${showIncludes} ${maybe_MAKE_PROGRAM})
  43. run_cmake_script(ShowIncludes-437-English -DshowIncludes=${showIncludes} ${maybe_MAKE_PROGRAM})
  44. run_cmake_script(ShowIncludes-437-French -DshowIncludes=${showIncludes} ${maybe_MAKE_PROGRAM})
  45. run_cmake_script(ShowIncludes-437-German -DshowIncludes=${showIncludes} ${maybe_MAKE_PROGRAM})
  46. run_cmake_script(ShowIncludes-437-Italian -DshowIncludes=${showIncludes} ${maybe_MAKE_PROGRAM})
  47. run_cmake_script(ShowIncludes-54936-Chinese -DshowIncludes=${showIncludes} ${maybe_MAKE_PROGRAM})
  48. run_cmake_script(ShowIncludes-65001-Chinese -DshowIncludes=${showIncludes} ${maybe_MAKE_PROGRAM})
  49. run_cmake_script(ShowIncludes-65001-French -DshowIncludes=${showIncludes} ${maybe_MAKE_PROGRAM})
  50. run_cmake_script(ShowIncludes-65001-Japanese -DshowIncludes=${showIncludes} ${maybe_MAKE_PROGRAM})
  51. if(NOT CMake_TEST_NO_CODEPAGE_9xx)
  52. run_cmake_script(ShowIncludes-932-Japanese -DshowIncludes=${showIncludes} ${maybe_MAKE_PROGRAM})
  53. endif()
  54. unset(maybe_MAKE_PROGRAM)
  55. endif()
  56. function(run_NoWorkToDo)
  57. run_cmake(NoWorkToDo)
  58. set(RunCMake_TEST_NO_CLEAN 1)
  59. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/NoWorkToDo-build)
  60. set(RunCMake_TEST_OUTPUT_MERGE 1)
  61. run_cmake_command(NoWorkToDo-build ${CMAKE_COMMAND} --build .)
  62. run_cmake_command(NoWorkToDo-nowork ${CMAKE_COMMAND} --build . -- -d explain)
  63. endfunction()
  64. run_NoWorkToDo()
  65. function(run_VerboseBuild)
  66. run_cmake(VerboseBuild)
  67. set(RunCMake_TEST_NO_CLEAN 1)
  68. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/VerboseBuild-build)
  69. set(RunCMake_TEST_OUTPUT_MERGE 1)
  70. run_cmake_command(VerboseBuild-build ${CMAKE_COMMAND} --build . -v --clean-first)
  71. run_cmake_command(VerboseBuild-nowork ${CMAKE_COMMAND} --build . --verbose)
  72. endfunction()
  73. run_VerboseBuild()
  74. function(run_CMP0058 case)
  75. # Use a single build tree for a few tests without cleaning.
  76. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CMP0058-${case}-build)
  77. set(RunCMake_TEST_NO_CLEAN 1)
  78. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  79. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  80. run_cmake(CMP0058-${case})
  81. run_cmake_command(CMP0058-${case}-build ${CMAKE_COMMAND} --build .)
  82. endfunction()
  83. run_CMP0058(OLD-no)
  84. run_CMP0058(OLD-by)
  85. run_CMP0058(WARN-no)
  86. run_CMP0058(WARN-by)
  87. run_CMP0058(NEW-no)
  88. run_CMP0058(NEW-by)
  89. run_cmake_with_options(CustomCommandDepfile -DCMAKE_BUILD_TYPE=Debug)
  90. run_cmake(CustomCommandJobPool)
  91. run_cmake(JobPoolUsesTerminal)
  92. run_cmake(RspFileC)
  93. run_cmake(RspFileCXX)
  94. if(TEST_Fortran)
  95. run_cmake(RspFileFortran)
  96. endif()
  97. function(run_CommandConcat)
  98. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CommandConcat-build)
  99. set(RunCMake_TEST_NO_CLEAN 1)
  100. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  101. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  102. run_cmake(CommandConcat)
  103. run_cmake_command(CommandConcat-build ${CMAKE_COMMAND} --build .)
  104. endfunction()
  105. run_CommandConcat()
  106. function(run_SubDir)
  107. # Use a single build tree for a few tests without cleaning.
  108. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/SubDir-build)
  109. set(RunCMake_TEST_NO_CLEAN 1)
  110. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  111. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  112. run_cmake(SubDir)
  113. if(WIN32)
  114. set(SubDir_all [[SubDir\all]])
  115. set(SubDir_test [[SubDir\test]])
  116. set(SubDir_install [[SubDir\install]])
  117. set(SubDirBinary_test [[SubDirBinary\test]])
  118. set(SubDirBinary_all [[SubDirBinary\all]])
  119. set(SubDirBinary_install [[SubDirBinary\install]])
  120. else()
  121. set(SubDir_all [[SubDir/all]])
  122. set(SubDir_test [[SubDir/test]])
  123. set(SubDir_install [[SubDir/install]])
  124. set(SubDirBinary_all [[SubDirBinary/all]])
  125. set(SubDirBinary_test [[SubDirBinary/test]])
  126. set(SubDirBinary_install [[SubDirBinary/install]])
  127. endif()
  128. run_cmake_command(SubDir-build ${CMAKE_COMMAND} --build . --target ${SubDir_all})
  129. run_cmake_command(SubDir-test ${CMAKE_COMMAND} --build . --target ${SubDir_test})
  130. run_cmake_command(SubDir-install ${CMAKE_COMMAND} --build . --target ${SubDir_install})
  131. run_cmake_command(SubDirBinary-build ${CMAKE_COMMAND} --build . --target ${SubDirBinary_all})
  132. run_cmake_command(SubDirBinary-test ${CMAKE_COMMAND} --build . --target ${SubDirBinary_test})
  133. run_cmake_command(SubDirBinary-install ${CMAKE_COMMAND} --build . --target ${SubDirBinary_install})
  134. endfunction()
  135. run_SubDir()
  136. function(run_ninja dir)
  137. execute_process(
  138. COMMAND "${RunCMake_MAKE_PROGRAM}" ${ARGN}
  139. WORKING_DIRECTORY "${dir}"
  140. OUTPUT_VARIABLE ninja_stdout
  141. ERROR_VARIABLE ninja_stderr
  142. RESULT_VARIABLE ninja_result
  143. )
  144. if(NOT ninja_result EQUAL 0)
  145. message(STATUS "
  146. ============ beginning of ninja's stdout ============
  147. ${ninja_stdout}
  148. =============== end of ninja's stdout ===============
  149. ")
  150. message(STATUS "
  151. ============ beginning of ninja's stderr ============
  152. ${ninja_stderr}
  153. =============== end of ninja's stderr ===============
  154. ")
  155. message(FATAL_ERROR
  156. "top ninja build failed exited with status ${ninja_result}")
  157. endif()
  158. set(ninja_stdout "${ninja_stdout}" PARENT_SCOPE)
  159. endfunction(run_ninja)
  160. function (run_LooseObjectDepends)
  161. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/LooseObjectDepends-build)
  162. run_cmake(LooseObjectDepends)
  163. run_ninja("${RunCMake_TEST_BINARY_DIR}" "CMakeFiles/top.dir/top.c${CMAKE_C_OUTPUT_EXTENSION}")
  164. if (EXISTS "${RunCMake_TEST_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}dep${CMAKE_SHARED_LIBRARY_SUFFIX}")
  165. message(FATAL_ERROR
  166. "The `dep` library was created when requesting an object file to be "
  167. "built; this should no longer be necessary.")
  168. endif ()
  169. if (EXISTS "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/dep.dir/dep.c${CMAKE_C_OUTPUT_EXTENSION}")
  170. message(FATAL_ERROR
  171. "The `dep.c` object file was created when requesting an object file to "
  172. "be built; this should no longer be necessary.")
  173. endif ()
  174. endfunction ()
  175. run_LooseObjectDepends()
  176. function (run_CustomCommandExplictDepends)
  177. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CustomCommandExplicitDepends-build)
  178. run_cmake(CustomCommandExplicitDepends)
  179. set(DEP_LIB "${RunCMake_TEST_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}dep${CMAKE_SHARED_LIBRARY_SUFFIX}")
  180. run_ninja("${RunCMake_TEST_BINARY_DIR}" "command-option.h")
  181. if (EXISTS "${DEP_LIB}")
  182. message(FATAL_ERROR
  183. "The `dep` library was created when requesting a custom command to be "
  184. "generated; this should no longer be necessary when passing "
  185. "DEPENDS_EXPLICIT_ONLY option.")
  186. endif ()
  187. run_ninja("${RunCMake_TEST_BINARY_DIR}" "command-variable-on.h")
  188. if (EXISTS "${DEP_LIB}")
  189. message(FATAL_ERROR
  190. "The `dep` library was created when requesting a custom command to be "
  191. "generated; this should no longer be necessary when setting "
  192. "CMAKE_ADD_CUSTOM_COMMAND_DEPENDS_EXPLICIT_ONLY variable to ON.")
  193. endif ()
  194. run_ninja("${RunCMake_TEST_BINARY_DIR}" "command-variable-off.h")
  195. if (NOT EXISTS "${DEP_LIB}")
  196. message(FATAL_ERROR
  197. "The `dep` library was not created when requesting a custom command to be "
  198. "generated; this should be necessary when setting "
  199. "CMAKE_ADD_CUSTOM_COMMAND_DEPENDS_EXPLICIT_ONLY variable to OFF.")
  200. endif ()
  201. endfunction ()
  202. run_CustomCommandExplictDepends()
  203. function (run_AssumedSources)
  204. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/AssumedSources-build)
  205. run_cmake(AssumedSources)
  206. run_ninja("${RunCMake_TEST_BINARY_DIR}" "${RunCMake_TEST_BINARY_DIR}/target.c")
  207. if (NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/target.c")
  208. message(FATAL_ERROR
  209. "Dependencies for an assumed source did not hook up properly for 'target.c'.")
  210. endif ()
  211. run_ninja("${RunCMake_TEST_BINARY_DIR}" "${RunCMake_TEST_BINARY_DIR}/target-no-depends.c")
  212. if (EXISTS "${RunCMake_TEST_BINARY_DIR}/target-no-depends.c")
  213. message(FATAL_ERROR
  214. "Dependencies for an assumed source were magically hooked up for 'target-no-depends.c'.")
  215. endif ()
  216. endfunction ()
  217. run_AssumedSources()
  218. function(sleep delay)
  219. execute_process(
  220. COMMAND ${CMAKE_COMMAND} -E sleep ${delay}
  221. RESULT_VARIABLE result
  222. )
  223. if(NOT result EQUAL 0)
  224. message(FATAL_ERROR "failed to sleep for ${delay} second.")
  225. endif()
  226. endfunction(sleep)
  227. macro(ninja_escape_path path out)
  228. string(REPLACE "\$ " "\$\$" "${out}" "${path}")
  229. string(REPLACE " " "\$ " "${out}" "${${out}}")
  230. string(REPLACE ":" "\$:" "${out}" "${${out}}")
  231. endmacro(ninja_escape_path)
  232. macro(shell_escape string out)
  233. string(REPLACE "\"" "\\\"" "${out}" "${string}")
  234. endmacro(shell_escape)
  235. function(run_sub_cmake test ninja_output_path_prefix)
  236. set(top_build_dir "${RunCMake_BINARY_DIR}/${test}-build/")
  237. file(REMOVE_RECURSE "${top_build_dir}")
  238. file(MAKE_DIRECTORY "${top_build_dir}")
  239. ninja_escape_path("${ninja_output_path_prefix}"
  240. escaped_ninja_output_path_prefix)
  241. # Generate top build ninja file.
  242. set(top_build_ninja "${top_build_dir}/build.ninja")
  243. shell_escape("${top_build_ninja}" escaped_top_build_ninja)
  244. set(build_ninja_dep "${top_build_dir}/build_ninja_dep")
  245. ninja_escape_path("${build_ninja_dep}" escaped_build_ninja_dep)
  246. shell_escape("${CMAKE_COMMAND}" escaped_CMAKE_COMMAND)
  247. file(WRITE "${build_ninja_dep}" "fake dependency of top build.ninja file\n")
  248. if(WIN32)
  249. set(cmd_prefix "cmd.exe /C \"")
  250. set(cmd_suffix "\"")
  251. else()
  252. set(cmd_prefix "")
  253. set(cmd_suffix "")
  254. endif()
  255. set(fs_delay 3) # We assume the system as 1 sec timestamp resolution.
  256. file(WRITE "${top_build_ninja}" "\
  257. subninja ${escaped_ninja_output_path_prefix}/build.ninja
  258. default ${escaped_ninja_output_path_prefix}/all
  259. # Sleep for long enough before regenerating to make sure the timestamp of
  260. # the top build.ninja will be strictly greater than the timestamp of the
  261. # sub/build.ninja file.
  262. rule RERUN
  263. command = ${cmd_prefix}\"${escaped_CMAKE_COMMAND}\" -E sleep ${fs_delay} && \"${escaped_CMAKE_COMMAND}\" -E touch \"${escaped_top_build_ninja}\"${cmd_suffix}
  264. description = Testing regeneration
  265. generator = 1
  266. build build.ninja: RERUN ${escaped_build_ninja_dep} || ${escaped_ninja_output_path_prefix}/build.ninja
  267. pool = console
  268. ")
  269. # Run sub cmake project.
  270. set(RunCMake_TEST_OPTIONS "-DCMAKE_NINJA_OUTPUT_PATH_PREFIX=${ninja_output_path_prefix}")
  271. set(RunCMake_TEST_BINARY_DIR "${top_build_dir}/${ninja_output_path_prefix}")
  272. run_cmake(${test})
  273. # Check there is no 'default' statement in Ninja file generated by CMake.
  274. set(sub_build_ninja "${RunCMake_TEST_BINARY_DIR}/build.ninja")
  275. file(READ "${sub_build_ninja}" sub_build_ninja_file)
  276. if(sub_build_ninja_file MATCHES "\ndefault [^\n][^\n]*all\n")
  277. message(FATAL_ERROR
  278. "unexpected 'default' statement found in '${sub_build_ninja}'")
  279. endif()
  280. # Run ninja from the top build directory.
  281. run_ninja("${top_build_dir}")
  282. # Test regeneration rules run in order.
  283. set(main_cmakelists "${RunCMake_SOURCE_DIR}/CMakeLists.txt")
  284. sleep(${fs_delay})
  285. file(TOUCH "${main_cmakelists}")
  286. file(TOUCH "${build_ninja_dep}")
  287. run_ninja("${top_build_dir}")
  288. file(TIMESTAMP "${main_cmakelists}" mtime_main_cmakelists UTC)
  289. file(TIMESTAMP "${sub_build_ninja}" mtime_sub_build_ninja UTC)
  290. file(TIMESTAMP "${top_build_ninja}" mtime_top_build_ninja UTC)
  291. # Check sub build.ninja is regenerated.
  292. if(mtime_main_cmakelists STRGREATER mtime_sub_build_ninja)
  293. message(FATAL_ERROR
  294. "sub build.ninja not regenerated:
  295. CMakeLists.txt = ${mtime_main_cmakelists}
  296. sub/build.ninja = ${mtime_sub_build_ninja}")
  297. endif()
  298. # Check top build.ninja is regenerated after sub build.ninja.
  299. if(NOT mtime_top_build_ninja STRGREATER mtime_sub_build_ninja)
  300. message(FATAL_ERROR
  301. "top build.ninja not regenerated strictly after sub build.ninja:
  302. sub/build.ninja = ${mtime_sub_build_ninja}
  303. build.ninja = ${mtime_top_build_ninja}")
  304. endif()
  305. endfunction(run_sub_cmake)
  306. if("${ninja_version}" VERSION_LESS 1.6)
  307. message(WARNING "Ninja is too old; skipping rest of test.")
  308. return()
  309. endif()
  310. foreach(ninja_output_path_prefix "sub space" "sub")
  311. run_sub_cmake(Executable "${ninja_output_path_prefix}")
  312. run_sub_cmake(StaticLib "${ninja_output_path_prefix}")
  313. run_sub_cmake(SharedLib "${ninja_output_path_prefix}")
  314. run_sub_cmake(TwoLibs "${ninja_output_path_prefix}")
  315. run_sub_cmake(SubDirPrefix "${ninja_output_path_prefix}")
  316. run_sub_cmake(CustomCommandWorkingDirectory "${ninja_output_path_prefix}")
  317. endforeach(ninja_output_path_prefix)
  318. function (run_PreventTargetAliasesDupBuildRule)
  319. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/PreventTargetAliasesDupBuildRule-build)
  320. run_cmake(PreventTargetAliasesDupBuildRule)
  321. run_ninja("${RunCMake_TEST_BINARY_DIR}" -w dupbuild=err)
  322. endfunction ()
  323. run_PreventTargetAliasesDupBuildRule()
  324. function (run_PreventConfigureFileDupBuildRule)
  325. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/PreventConfigureFileDupBuildRule-build)
  326. run_cmake(PreventConfigureFileDupBuildRule)
  327. run_ninja("${RunCMake_TEST_BINARY_DIR}" -w dupbuild=err)
  328. endfunction()
  329. run_PreventConfigureFileDupBuildRule()
  330. function (run_ChangeBuildType)
  331. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/ChangeBuildType-build)
  332. set(RunCMake_TEST_OPTIONS "-DCMAKE_BUILD_TYPE:STRING=Debug")
  333. run_cmake(ChangeBuildType)
  334. unset(RunCMake_TEST_OPTIONS)
  335. run_ninja("${RunCMake_TEST_BINARY_DIR}" -w dupbuild=err)
  336. endfunction()
  337. run_ChangeBuildType()
  338. function(run_QtAutoMocDeps)
  339. set(QtX Qt${CMake_TEST_Qt_version})
  340. if(CMake_TEST_${QtX}Core_Version VERSION_GREATER_EQUAL 5.15.0)
  341. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/QtAutoMocDeps-build)
  342. run_cmake_with_options(QtAutoMocDeps
  343. "-Dwith_qt_version=${CMake_TEST_Qt_version}"
  344. "-D${QtX}_DIR=${${QtX}_DIR}"
  345. "-D${QtX}Core_DIR=${${QtX}Core_DIR}"
  346. "-D${QtX}Widgets_DIR=${${QtX}Widgets_DIR}"
  347. "-DCMAKE_PREFIX_PATH:STRING=${CMAKE_PREFIX_PATH}"
  348. )
  349. # Build the project.
  350. run_ninja("${RunCMake_TEST_BINARY_DIR}")
  351. # Touch just the library source file, which shouldn't cause a rerun of AUTOMOC
  352. # for app_with_qt target.
  353. file(TOUCH "${RunCMake_SOURCE_DIR}/simple_lib.cpp")
  354. # Build and assert that AUTOMOC was not run for app_with_qt.
  355. run_ninja("${RunCMake_TEST_BINARY_DIR}")
  356. if(ninja_stdout MATCHES "Automatic MOC for target app_with_qt")
  357. message(FATAL_ERROR
  358. "AUTOMOC should not have executed for 'app_with_qt' target:\nstdout:\n${ninja_stdout}")
  359. endif()
  360. # Assert that the subdir executables were not rebuilt.
  361. if(ninja_stdout MATCHES "Automatic MOC for target sub_exe_1")
  362. message(FATAL_ERROR
  363. "AUTOMOC should not have executed for 'sub_exe_1' target:\nstdout:\n${ninja_stdout}")
  364. endif()
  365. if(ninja_stdout MATCHES "Automatic MOC for target sub_exe_2")
  366. message(FATAL_ERROR
  367. "AUTOMOC should not have executed for 'sub_exe_2' target:\nstdout:\n${ninja_stdout}")
  368. endif()
  369. # Touch a header file to make sure an automoc dependency cycle is not introduced.
  370. file(TOUCH "${RunCMake_SOURCE_DIR}/MyWindow.h")
  371. run_ninja("${RunCMake_TEST_BINARY_DIR}")
  372. # Need to run a second time to hit the dependency cycle.
  373. run_ninja("${RunCMake_TEST_BINARY_DIR}")
  374. endif()
  375. endfunction()
  376. function(run_QtAutoMocSkipPch)
  377. set(QtX Qt${CMake_TEST_Qt_version})
  378. if(CMake_TEST_${QtX}Core_Version VERSION_GREATER_EQUAL 5.15.0)
  379. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/QtAutoMocSkipPch-build)
  380. run_cmake_with_options(QtAutoMocSkipPch
  381. "-Dwith_qt_version=${CMake_TEST_Qt_version}"
  382. "-D${QtX}_DIR=${${QtX}_DIR}"
  383. "-D${QtX}Core_DIR=${${QtX}Core_DIR}"
  384. "-DCMAKE_PREFIX_PATH:STRING=${CMAKE_PREFIX_PATH}"
  385. )
  386. # Build the project.
  387. run_ninja("${RunCMake_TEST_BINARY_DIR}")
  388. endif()
  389. endfunction()
  390. if(CMake_TEST_Qt_version)
  391. run_QtAutoMocDeps()
  392. run_QtAutoMocSkipPch()
  393. endif()