RunCMakeTest.cmake 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. include(RunCMake)
  2. # For `if (IN_LIST)`
  3. cmake_policy(SET CMP0057 NEW)
  4. run_cmake(Inspect)
  5. include("${RunCMake_BINARY_DIR}/Inspect-build/info.cmake")
  6. # Test negative cases where C++20 modules do not work.
  7. run_cmake(NoCXX)
  8. if ("cxx_std_20" IN_LIST CMAKE_CXX_COMPILE_FEATURES)
  9. # This test requires that the compiler be told to compile in an older-than-20
  10. # standard. If the compiler forces a standard to be used, skip it.
  11. if (NOT forced_cxx_standard)
  12. run_cmake(NoCXX20)
  13. if(CMAKE_CXX_STANDARD_DEFAULT AND CMAKE_CXX20_STANDARD_COMPILE_OPTION)
  14. run_cmake_with_options(ImplicitCXX20 -DCMAKE_CXX20_STANDARD_COMPILE_OPTION=${CMAKE_CXX20_STANDARD_COMPILE_OPTION})
  15. endif()
  16. endif ()
  17. run_cmake(NoScanningSourceFileProperty)
  18. run_cmake(NoScanningTargetProperty)
  19. run_cmake(NoScanningVariable)
  20. run_cmake(CMP0155-OLD)
  21. run_cmake(CMP0155-NEW)
  22. run_cmake(CMP0155-NEW-with-rule)
  23. endif ()
  24. if (RunCMake_GENERATOR MATCHES "Ninja")
  25. execute_process(
  26. COMMAND "${CMAKE_MAKE_PROGRAM}" --version
  27. RESULT_VARIABLE res
  28. OUTPUT_VARIABLE ninja_version
  29. ERROR_VARIABLE err
  30. OUTPUT_STRIP_TRAILING_WHITESPACE
  31. ERROR_STRIP_TRAILING_WHITESPACE)
  32. if (res)
  33. message(WARNING
  34. "Failed to determine `ninja` version: ${err}")
  35. set(ninja_version "0")
  36. endif ()
  37. endif ()
  38. set(generator_supports_cxx_modules 0)
  39. if (RunCMake_GENERATOR MATCHES "Ninja" AND
  40. ninja_version VERSION_GREATER_EQUAL "1.11" AND
  41. "cxx_std_20" IN_LIST CMAKE_CXX_COMPILE_FEATURES)
  42. set(generator_supports_cxx_modules 1)
  43. endif ()
  44. if (RunCMake_GENERATOR MATCHES "Visual Studio" AND
  45. CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "19.34")
  46. set(generator_supports_cxx_modules 1)
  47. endif ()
  48. # Test behavior when the generator does not support C++20 modules.
  49. if (NOT generator_supports_cxx_modules)
  50. if ("cxx_std_20" IN_LIST CMAKE_CXX_COMPILE_FEATURES)
  51. run_cmake(NoDyndepSupport)
  52. endif ()
  53. # Bail; the remaining tests require the generator to successfully generate
  54. # with C++20 modules in the source list.
  55. return ()
  56. endif ()
  57. set(fileset_types
  58. Modules)
  59. set(scopes
  60. Interface
  61. Private
  62. Public)
  63. set(target_types
  64. Interface
  65. Static
  66. )
  67. foreach (fileset_type IN LISTS fileset_types)
  68. foreach (scope IN LISTS scopes)
  69. foreach (target_type IN LISTS target_types)
  70. run_cmake("FileSet${fileset_type}${scope}On${target_type}")
  71. endforeach ()
  72. endforeach ()
  73. run_cmake("FileSet${fileset_type}InterfaceImported")
  74. # Test the error messages when a non-C++ source file is found in the source
  75. # list.
  76. run_cmake("NotCompiledSource${fileset_type}")
  77. run_cmake("NotCXXSource${fileset_type}")
  78. endforeach ()
  79. if ("cxx_std_23" IN_LIST CMAKE_CXX_COMPILE_FEATURES)
  80. run_cmake(CXXImportStdConfig)
  81. run_cmake(CXXImportStdHeadTarget)
  82. run_cmake(CXXImportStdLinkLanguage)
  83. run_cmake(CXXImportStdInvalidGenex)
  84. endif ()
  85. if ("cxx_std_23" IN_LIST CMAKE_CXX_COMPILE_FEATURES AND
  86. NOT have_cxx23_import_std)
  87. run_cmake(NoCXX23TargetUnset)
  88. run_cmake(NoCXX23TargetNotRequired)
  89. run_cmake(NoCXX23TargetRequired)
  90. endif ()
  91. if ("cxx_std_26" IN_LIST CMAKE_CXX_COMPILE_FEATURES AND
  92. NOT have_cxx26_import_std)
  93. run_cmake(NoCXX26TargetUnset)
  94. run_cmake(NoCXX26TargetNotRequired)
  95. run_cmake(NoCXX26TargetRequired)
  96. endif ()
  97. run_cmake(InstallBMI)
  98. run_cmake(InstallBMIGenericArgs)
  99. run_cmake(InstallBMIIgnore)
  100. run_cmake(ExportBuildCxxModules)
  101. run_cmake(ExportBuildCxxModulesTargets)
  102. run_cmake(ExportInstallCxxModules)
  103. # Generator-specific tests.
  104. if (RunCMake_GENERATOR MATCHES "Ninja")
  105. run_cmake(NinjaDependInfoFileSet)
  106. run_cmake(NinjaDependInfoExport)
  107. run_cmake(NinjaDependInfoExportFilesystemSafe)
  108. run_cmake(NinjaDependInfoBMIInstall)
  109. run_cmake(NinjaForceResponseFile) # issue#25367
  110. run_cmake(NinjaDependInfoCompileDatabase)
  111. elseif (RunCMake_GENERATOR MATCHES "Visual Studio")
  112. run_cmake(VisualStudioNoSyntheticTargets)
  113. else ()
  114. message(FATAL_ERROR
  115. "Please add 'DependInfo' tests for the '${RunCMake_GENERATOR}' generator.")
  116. endif ()
  117. # Actual compilation tests.
  118. if (NOT CMake_TEST_MODULE_COMPILATION)
  119. return ()
  120. endif ()
  121. function (run_cxx_module_test directory)
  122. set(test_name "${directory}")
  123. if (NOT ARGN STREQUAL "")
  124. list(POP_FRONT ARGN test_name)
  125. endif ()
  126. set(RunCMake_TEST_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/examples/${directory}")
  127. set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/examples/${test_name}-build")
  128. if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
  129. set(RunCMake_TEST_OPTIONS -DCMAKE_CONFIGURATION_TYPES=Debug)
  130. else ()
  131. set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Debug)
  132. endif ()
  133. if (RunCMake_CXXModules_INSTALL)
  134. set(prefix "${RunCMake_BINARY_DIR}/examples/${test_name}-install")
  135. file(REMOVE_RECURSE "${prefix}")
  136. list(APPEND RunCMake_TEST_OPTIONS
  137. "-DCMAKE_INSTALL_PREFIX=${prefix}")
  138. endif ()
  139. list(APPEND RunCMake_TEST_OPTIONS
  140. "-DCMake_TEST_MODULE_COMPILATION_RULES=${CMake_TEST_MODULE_COMPILATION_RULES}"
  141. ${ARGN})
  142. run_cmake("examples/${test_name}")
  143. set(RunCMake_TEST_NO_CLEAN 1)
  144. if (RunCMake_CXXModules_TARGET)
  145. run_cmake_command("examples/${test_name}-build" "${CMAKE_COMMAND}" --build . --config Debug --target "${RunCMake_CXXModules_TARGET}")
  146. else ()
  147. run_cmake_command("examples/${test_name}-build" "${CMAKE_COMMAND}" --build . --config Debug)
  148. foreach (RunCMake_CXXModules_TARGET IN LISTS RunCMake_CXXModules_TARGETS)
  149. set(RunCMake_CXXModules_CONFIG "Debug")
  150. set(RunCMake_CXXModules_NAME_SUFFIX "")
  151. if (RunCMake_CXXModules_TARGET MATCHES "(.*)@(.*)")
  152. set(RunCMake_CXXModules_TARGET "${CMAKE_MATCH_1}")
  153. set(RunCMake_CXXModules_CONFIG "${CMAKE_MATCH_2}")
  154. set(RunCMake_CXXModules_NAME_SUFFIX "-${RunCMake_CXXModules_CONFIG}")
  155. endif ()
  156. run_cmake_command("examples/${test_name}-target-${RunCMake_CXXModules_TARGET}${RunCMake_CXXModules_NAME_SUFFIX}" "${CMAKE_COMMAND}" --build . --target "${RunCMake_CXXModules_TARGET}" --config "${RunCMake_CXXModules_CONFIG}")
  157. endforeach ()
  158. endif ()
  159. if (RunCMake_CXXModules_INSTALL)
  160. run_cmake_command("examples/${test_name}-install" "${CMAKE_COMMAND}" --build . --target install --config Debug)
  161. endif ()
  162. if (NOT RunCMake_CXXModules_NO_TEST)
  163. run_cmake_command("examples/${test_name}-test" "${CMAKE_CTEST_COMMAND}" -C Debug --output-on-failure)
  164. endif ()
  165. if (RunCMake_CXXModules_REBUILD)
  166. execute_process(COMMAND ${CMAKE_COMMAND} -E sleep 1.125) # handle 1s resolution
  167. include("${RunCMake_TEST_SOURCE_DIR}/pre-rebuild.cmake")
  168. execute_process(COMMAND ${CMAKE_COMMAND} -E sleep 1.125) # handle 1s resolution
  169. run_cmake_command("examples/${test_name}-rebuild" "${CMAKE_COMMAND}" --build . --config Debug)
  170. endif ()
  171. endfunction ()
  172. function (run_cxx_module_test_target directory target)
  173. set(RunCMake_CXXModules_TARGET "${target}")
  174. set(RunCMake_CXXModules_NO_TEST 1)
  175. run_cxx_module_test("${directory}" ${ARGN})
  176. endfunction ()
  177. function (run_cxx_module_test_rebuild directory)
  178. set(RunCMake_CXXModules_INSTALL 0)
  179. set(RunCMake_CXXModules_NO_TEST 1)
  180. set(RunCMake_CXXModules_REBUILD 1)
  181. run_cxx_module_test("${directory}" ${ARGN})
  182. endfunction ()
  183. # Module compilation features:
  184. # Compiler-based:
  185. # - `named`: basic support for named modules is available
  186. # - `shared`: shared libraries are supported
  187. # - `partitions`: module partitions are supported
  188. # - `internal_partitions`: internal module partitions are supported
  189. # - `bmionly`: the compiler supports BMI-only builds
  190. # - `import_std23`: the compiler supports `import std` for C++23
  191. #
  192. # Generator-based:
  193. # - `compile_commands`: the generator supports `compile_commands.json`
  194. # - `collation`: the generator supports module collation features
  195. # - `export_bmi`: the generator supports exporting BMIs
  196. # - `ninja`: a `ninja` binary is available to perform `Ninja`-only testing
  197. # (assumed if the generator matches `Ninja`).
  198. string(REPLACE "," ";" CMake_TEST_MODULE_COMPILATION "${CMake_TEST_MODULE_COMPILATION}")
  199. if (RunCMake_GENERATOR MATCHES "Ninja")
  200. list(APPEND CMake_TEST_MODULE_COMPILATION
  201. "ninja")
  202. endif ()
  203. if (RunCMake_GENERATOR MATCHES "Ninja")
  204. if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
  205. set(ninja_cmp0154_target "CMakeFiles/ninja_cmp0154.dir/Debug/unrelated.cxx${CMAKE_CXX_OUTPUT_EXTENSION}")
  206. else ()
  207. set(ninja_cmp0154_target "CMakeFiles/ninja_cmp0154.dir/unrelated.cxx${CMAKE_CXX_OUTPUT_EXTENSION}")
  208. endif ()
  209. run_cxx_module_test_target(ninja-cmp0154 "${ninja_cmp0154_target}")
  210. endif ()
  211. run_cxx_module_test(scan-with-pch)
  212. # Tests which use named modules.
  213. if ("named" IN_LIST CMake_TEST_MODULE_COMPILATION)
  214. run_cxx_module_test(simple)
  215. run_cxx_module_test(file-sets-with-dot)
  216. run_cxx_module_test(vs-without-flags)
  217. run_cxx_module_test(library library-static -DBUILD_SHARED_LIBS=OFF)
  218. run_cxx_module_test(unity-build)
  219. run_cxx_module_test(object-library)
  220. run_cxx_module_test(generated)
  221. run_cxx_module_test(deep-chain)
  222. run_cxx_module_test(non-trivial-collation-order)
  223. run_cxx_module_test(non-trivial-collation-order-randomized)
  224. run_cxx_module_test(duplicate)
  225. set(RunCMake_CXXModules_NO_TEST 1)
  226. run_cxx_module_test(import-from-object)
  227. run_cxx_module_test(circular)
  228. run_cxx_module_test(try-compile)
  229. run_cxx_module_test(try-run)
  230. unset(RunCMake_CXXModules_NO_TEST)
  231. run_cxx_module_test(same-src-name)
  232. run_cxx_module_test(scan_properties)
  233. run_cxx_module_test(target-objects)
  234. if ("cxx_std_23" IN_LIST CMAKE_CXX_COMPILE_FEATURES AND
  235. "import_std23" IN_LIST CMake_TEST_MODULE_COMPILATION)
  236. run_cxx_module_test(import-std)
  237. set(RunCMake_CXXModules_NO_TEST 1)
  238. run_cxx_module_test(import-std-no-std-property)
  239. unset(RunCMake_CXXModules_NO_TEST)
  240. run_cxx_module_test(import-std-export-no-std-build)
  241. set(RunCMake_CXXModules_INSTALL 1)
  242. run_cxx_module_test(import-std-export-no-std-install)
  243. unset(RunCMake_CXXModules_INSTALL)
  244. if ("collation" IN_LIST CMake_TEST_MODULE_COMPILATION)
  245. run_cxx_module_test(import-std-not-in-export-build)
  246. run_cxx_module_test(import-std-transitive import-std-transitive-not-in-export-build "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/examples/import-std-not-in-export-build-build")
  247. set(RunCMake_CXXModules_INSTALL 1)
  248. run_cxx_module_test(import-std-not-in-export-install)
  249. unset(RunCMake_CXXModules_INSTALL)
  250. run_cxx_module_test(import-std-transitive import-std-transitive-not-in-export-install "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/examples/import-std-not-in-export-install-install")
  251. run_cxx_module_test(import-std-transitive import-std-transitive-export-no-std-build "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/examples/import-std-export-no-std-build-build" -DEXPORT_NO_STD=1)
  252. run_cxx_module_test(import-std-transitive import-std-transitive-export-no-std-install "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/examples/import-std-export-no-std-install-install" -DEXPORT_NO_STD=1)
  253. endif ()
  254. endif ()
  255. endif ()
  256. # Tests which require compile commands support.
  257. if ("compile_commands" IN_LIST CMake_TEST_MODULE_COMPILATION)
  258. run_cxx_module_test(export-compile-commands)
  259. endif ()
  260. macro (setup_export_build_database_targets)
  261. set(RunCMake_CXXModules_TARGETS
  262. cmake_build_database-CXX
  263. cmake_build_database)
  264. if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
  265. list(INSERT RunCMake_CXXModules_TARGETS 0
  266. cmake_build_database-CXX-Debug
  267. cmake_build_database-Debug
  268. # Other config targets.
  269. cmake_build_database-CXX-Release@Release
  270. cmake_build_database-Release@Release)
  271. endif ()
  272. endmacro ()
  273. # Tests which require build database support.
  274. if ("build_database" IN_LIST CMake_TEST_MODULE_COMPILATION)
  275. setup_export_build_database_targets()
  276. set(RunCMake_CXXModules_NO_TEST 1)
  277. run_cxx_module_test(export-build-database)
  278. unset(RunCMake_CXXModules_NO_TEST)
  279. unset(RunCMake_CXXModules_TARGETS)
  280. endif ()
  281. # Tests which require collation work.
  282. if ("collation" IN_LIST CMake_TEST_MODULE_COMPILATION)
  283. run_cxx_module_test(public-req-private)
  284. set(RunCMake_CXXModules_NO_TEST 1)
  285. run_cxx_module_test(req-private-other-target)
  286. unset(RunCMake_CXXModules_NO_TEST)
  287. run_cxx_module_test_rebuild(depchain-modmap)
  288. run_cxx_module_test_rebuild(depchain-modules-json-file)
  289. if (RunCMake_GENERATOR MATCHES "Ninja")
  290. run_cxx_module_test_rebuild(depchain-collation-restat)
  291. endif ()
  292. endif ()
  293. # Tests which use named modules in shared libraries.
  294. if ("shared" IN_LIST CMake_TEST_MODULE_COMPILATION)
  295. run_cxx_module_test(library library-shared -DBUILD_SHARED_LIBS=ON)
  296. endif ()
  297. # Tests which use partitions.
  298. if ("partitions" IN_LIST CMake_TEST_MODULE_COMPILATION)
  299. run_cxx_module_test(partitions)
  300. endif ()
  301. # Tests which use internal partitions.
  302. if ("internal_partitions" IN_LIST CMake_TEST_MODULE_COMPILATION)
  303. run_cxx_module_test(internal-partitions)
  304. endif ()
  305. function (run_cxx_module_import_test type name)
  306. set(RunCMake_CXXModules_INSTALL 0)
  307. if ("EXPORT_BUILD_DATABASE" IN_LIST ARGN)
  308. list(REMOVE_ITEM ARGN EXPORT_BUILD_DATABASE)
  309. list(APPEND ARGN -DCMAKE_EXPORT_BUILD_DATABASE=1)
  310. endif ()
  311. run_cxx_module_test(import-modules "import-modules-${name}" "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/examples/${name}-${type}" ${ARGN})
  312. endfunction ()
  313. # Tests which install BMIs
  314. if ("export_bmi" IN_LIST CMake_TEST_MODULE_COMPILATION)
  315. run_cxx_module_test(export-interface-no-properties-build)
  316. run_cxx_module_test(export-interface-build)
  317. run_cxx_module_test(export-include-directories-build)
  318. run_cxx_module_test(export-include-directories-old-cmake-build)
  319. run_cxx_module_test(export-usage-build)
  320. run_cxx_module_test(export-bmi-and-interface-build)
  321. run_cxx_module_test(export-command-sepdir-build)
  322. run_cxx_module_test(export-transitive-targets-build)
  323. run_cxx_module_test(export-transitive-modules1-build)
  324. run_cxx_module_test(export-transitive-modules-build export-transitive-modules-build "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/examples/export-transitive-modules1-build-build" )
  325. run_cxx_module_test(export-with-headers-build)
  326. if ("collation" IN_LIST CMake_TEST_MODULE_COMPILATION AND
  327. "bmionly" IN_LIST CMake_TEST_MODULE_COMPILATION)
  328. run_cxx_module_import_test(build export-interface-build)
  329. run_cxx_module_import_test(build export-interface-no-properties-build -DNO_PROPERTIES=1)
  330. run_cxx_module_import_test(build export-include-directories-build -DINCLUDE_PROPERTIES=1)
  331. run_cxx_module_import_test(build export-bmi-and-interface-build -DWITH_BMIS=1)
  332. run_cxx_module_import_test(build export-command-sepdir-build -DEXPORT_COMMAND_SEPDIR=1)
  333. run_cxx_module_import_test(build export-transitive-targets-build -DTRANSITIVE_TARGETS=1)
  334. run_cxx_module_import_test(build export-transitive-modules-build -DTRANSITIVE_MODULES=1)
  335. run_cxx_module_import_test(build export-with-headers-build -DWITH_HEADERS=1)
  336. if ("build_database" IN_LIST CMake_TEST_MODULE_COMPILATION)
  337. setup_export_build_database_targets()
  338. run_cxx_module_import_test(build export-build-database -DBUILD_DATABASE=1 EXPORT_BUILD_DATABASE)
  339. unset(RunCMake_CXXModules_TARGETS)
  340. endif ()
  341. endif ()
  342. endif ()
  343. # All of the following tests perform installation.
  344. set(RunCMake_CXXModules_INSTALL 1)
  345. # Tests which install BMIs
  346. if ("install_bmi" IN_LIST CMake_TEST_MODULE_COMPILATION)
  347. run_cxx_module_test(install-bmi)
  348. run_cxx_module_test(install-bmi-and-interfaces)
  349. if ("export_bmi" IN_LIST CMake_TEST_MODULE_COMPILATION)
  350. run_cxx_module_test(export-interface-no-properties-install)
  351. run_cxx_module_test(export-interface-install)
  352. run_cxx_module_test(export-include-directories-install)
  353. run_cxx_module_test(export-include-directories-old-cmake-install)
  354. run_cxx_module_test(export-usage-install)
  355. run_cxx_module_test(export-bmi-and-interface-install)
  356. run_cxx_module_test(export-command-sepdir-install)
  357. run_cxx_module_test(export-transitive-targets-install)
  358. run_cxx_module_test(export-transitive-modules1-install)
  359. run_cxx_module_test(export-transitive-modules-install export-transitive-modules-install "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/examples/export-transitive-modules1-install-install" )
  360. run_cxx_module_test(export-with-headers-install)
  361. if ("collation" IN_LIST CMake_TEST_MODULE_COMPILATION AND
  362. "bmionly" IN_LIST CMake_TEST_MODULE_COMPILATION)
  363. run_cxx_module_import_test(install export-interface-install)
  364. run_cxx_module_import_test(install export-interface-no-properties-install -DNO_PROPERTIES=1)
  365. run_cxx_module_import_test(install export-include-directories-install -DINCLUDE_PROPERTIES=1)
  366. run_cxx_module_import_test(install export-bmi-and-interface-install -DWITH_BMIS=1)
  367. run_cxx_module_import_test(install export-command-sepdir-install -DEXPORT_COMMAND_SEPDIR=1)
  368. run_cxx_module_import_test(install export-transitive-targets-install -DTRANSITIVE_TARGETS=1)
  369. run_cxx_module_import_test(install export-transitive-modules-install -DTRANSITIVE_MODULES=1)
  370. run_cxx_module_import_test(install export-with-headers-install -DWITH_HEADERS=1)
  371. endif ()
  372. endif ()
  373. endif ()
  374. # All remaining tests require a working `Ninja` generator to set up a test case
  375. # for the current generator.
  376. if (NOT "ninja" IN_LIST CMake_TEST_MODULE_COMPILATION)
  377. return ()
  378. endif ()
  379. # All remaining tests require `bmionly` in order to consume from the `ninja`
  380. # build.
  381. if (NOT "bmionly" IN_LIST CMake_TEST_MODULE_COMPILATION)
  382. return ()
  383. endif ()
  384. function (run_cxx_module_test_ninja directory)
  385. set(RunCMake_GENERATOR "Ninja")
  386. set(RunCMake_CXXModules_NO_TEST 1)
  387. set(RunCMake_CXXModules_INSTALL 1)
  388. # `Ninja` is not a multi-config generator.
  389. set(RunCMake_GENERATOR_IS_MULTI_CONFIG 0)
  390. run_cxx_module_test("${directory}" "${directory}-ninja" ${ARGN})
  391. endfunction ()
  392. # Installation happens within `run_cxx_module_test_ninja`.
  393. set(RunCMake_CXXModules_INSTALL 0)
  394. set(test_set modules-from-ninja)
  395. run_cxx_module_test_ninja("export-${test_set}")
  396. run_cxx_module_test(import-modules "import-${test_set}" "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/examples/export-${test_set}-ninja-install" -DFROM_NINJA=1)