From e48e5e5506e9d55e3ea634c9cbe9051a35046b2a Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 16 Feb 2024 07:10:24 -0500 Subject: Tests/CXXModules: document `CMake_TEST_MODULE_COMPILATION` items --- Tests/RunCMake/CXXModules/RunCMakeTest.cmake | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake index 421c509..533a99a 100644 --- a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake +++ b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake @@ -168,6 +168,18 @@ function (run_cxx_module_test_rebuild directory) run_cxx_module_test("${directory}" ${ARGN}) endfunction () +# Module compilation features: +# Compiler-based: +# - `named`: basic support for named modules is available +# - `shared`: shared libraries are supported +# - `partitions`: module partitions are supported +# - `internal_partitions`: internal module partitions are supported +# - `bmionly`: the compiler supports BMI-only builds +# +# Generator-based: +# - `compile_commands`: the generator supports `compile_commands.json` +# - `collation`: the generator supports module collation features +# - `export_bmi`: the generator supports exporting BMIs string(REPLACE "," ";" CMake_TEST_MODULE_COMPILATION "${CMake_TEST_MODULE_COMPILATION}") if (RunCMake_GENERATOR MATCHES "Ninja") -- cgit v0.12 From 150d7dbd683c05fb6266b2eb4622381d0d1bf5ea Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 16 Feb 2024 08:41:39 -0500 Subject: Tests/CXXModules: support building a project with `Ninja` This allows testing mixed generator setups. --- Tests/RunCMake/CXXModules/RunCMakeTest.cmake | 29 ++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake index 533a99a..4997c15 100644 --- a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake +++ b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake @@ -180,7 +180,13 @@ endfunction () # - `compile_commands`: the generator supports `compile_commands.json` # - `collation`: the generator supports module collation features # - `export_bmi`: the generator supports exporting BMIs +# - `ninja`: a `ninja` binary is available to perform `Ninja`-only testing +# (assumed if the generator matches `Ninja`). string(REPLACE "," ";" CMake_TEST_MODULE_COMPILATION "${CMake_TEST_MODULE_COMPILATION}") +if (RunCMake_GENERATOR MATCHES "Ninja") + list(APPEND CMake_TEST_MODULE_COMPILATION + "ninja") +endif () if (RunCMake_GENERATOR MATCHES "Ninja") if (RunCMake_GENERATOR_IS_MULTI_CONFIG) @@ -306,3 +312,26 @@ if ("install_bmi" IN_LIST CMake_TEST_MODULE_COMPILATION) endif () endif () endif () + +# All remaining tests require a working `Ninja` generator to set up a test case +# for the current generator. +if (NOT "ninja" IN_LIST CMake_TEST_MODULE_COMPILATION) + return () +endif () +# All remaining tests require `bmionly` in order to consume from the `ninja` +# build. +if (NOT "bmionly" IN_LIST CMake_TEST_MODULE_COMPILATION) + return () +endif () + +function (run_cxx_module_test_ninja directory) + set(RunCMake_GENERATOR "Ninja") + set(RunCMake_CXXModules_NO_TEST 1) + set(RunCMake_CXXModules_INSTALL 1) + # `Ninja` is not a multi-config generator. + set(RunCMake_GENERATOR_IS_MULTI_CONFIG 0) + run_cxx_module_test("${directory}" "${directory}-ninja" ${ARGN}) +endfunction () + +# Installation happens within `run_cxx_module_test_ninja`. +set(RunCMake_CXXModules_INSTALL 0) -- cgit v0.12 From e0633a951727b877e03d47987c264c26070b039a Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 16 Feb 2024 08:42:14 -0500 Subject: Tests/CXXModules: add a test importing from a `Ninja` install This ensures that consuming from a single configuration generator works in all generators. See: #25568 --- Tests/RunCMake/CXXModules/RunCMakeTest.cmake | 4 +++ .../export-modules-from-ninja/CMakeLists.txt | 41 ++++++++++++++++++++++ .../examples/export-modules-from-ninja/forward.cxx | 6 ++++ .../export-modules-from-ninja/importable.cxx | 10 ++++++ .../export-modules-from-ninja/no_modules.cxx | 3 ++ .../examples/export-modules-from-ninja/private.cxx | 6 ++++ .../subdir/importable.cxx | 6 ++++ .../examples/import-modules/CMakeLists.txt | 2 ++ 8 files changed, 78 insertions(+) create mode 100644 Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/CMakeLists.txt create mode 100644 Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/forward.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/importable.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/no_modules.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/private.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/subdir/importable.cxx diff --git a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake index 4997c15..aaf289c 100644 --- a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake +++ b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake @@ -335,3 +335,7 @@ endfunction () # Installation happens within `run_cxx_module_test_ninja`. set(RunCMake_CXXModules_INSTALL 0) + +set(test_set modules-from-ninja) +run_cxx_module_test_ninja("export-${test_set}") +run_cxx_module_test(import-modules "import-${test_set}" "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/examples/export-${test_set}-ninja-install" -DFROM_NINJA=1) diff --git a/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/CMakeLists.txt new file mode 100644 index 0000000..6036fde --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.24...3.28) +project(cxx_modules_export_from_ninja CXX) + +include("${CMAKE_SOURCE_DIR}/../cxx-modules-rules.cmake") + +add_library(export_from_ninja STATIC) +target_sources(export_from_ninja + PRIVATE + forward.cxx + PRIVATE + FILE_SET modules_private TYPE CXX_MODULES + BASE_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}" + FILES + private.cxx + PUBLIC + FILE_SET modules TYPE CXX_MODULES + BASE_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}" + FILES + importable.cxx + subdir/importable.cxx + ) +target_compile_features(export_from_ninja PUBLIC cxx_std_20) + +add_library(no_modules STATIC no_modules.cxx) + +install(TARGETS export_from_ninja no_modules + EXPORT CXXModules + FILE_SET modules DESTINATION "lib/cxx/miu") +install(EXPORT CXXModules + NAMESPACE CXXModules:: + DESTINATION "lib/cmake/export_from_ninja" + FILE "export_from_ninja-targets.cmake" + CXX_MODULES_DIRECTORY "export_from_ninja-cxx-modules") +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_from_ninja-config.cmake" + "include(\"\${CMAKE_CURRENT_LIST_DIR}/export_from_ninja-targets.cmake\") +set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1) +") +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/export_from_ninja-config.cmake" + DESTINATION "lib/cmake/export_from_ninja") diff --git a/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/forward.cxx b/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/forward.cxx new file mode 100644 index 0000000..7f53271 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/forward.cxx @@ -0,0 +1,6 @@ +import priv; + +int forwarding() +{ + return from_private(); +} diff --git a/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/importable.cxx b/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/importable.cxx new file mode 100644 index 0000000..8dfc41b --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/importable.cxx @@ -0,0 +1,10 @@ +export module importable; + +extern "C++" { +int forwarding(); +} + +export int from_import() +{ + return forwarding(); +} diff --git a/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/no_modules.cxx b/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/no_modules.cxx new file mode 100644 index 0000000..eea854f --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/no_modules.cxx @@ -0,0 +1,3 @@ +void no_modules() +{ +} diff --git a/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/private.cxx b/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/private.cxx new file mode 100644 index 0000000..c5b719a --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/private.cxx @@ -0,0 +1,6 @@ +export module priv; + +export int from_private() +{ + return 0; +} diff --git a/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/subdir/importable.cxx b/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/subdir/importable.cxx new file mode 100644 index 0000000..07d6af6 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/export-modules-from-ninja/subdir/importable.cxx @@ -0,0 +1,6 @@ +export module subdir_importable; + +export int from_subdir() +{ + return 0; +} diff --git a/Tests/RunCMake/CXXModules/examples/import-modules/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/import-modules/CMakeLists.txt index 8e1db5d..16bc6d8 100644 --- a/Tests/RunCMake/CXXModules/examples/import-modules/CMakeLists.txt +++ b/Tests/RunCMake/CXXModules/examples/import-modules/CMakeLists.txt @@ -9,6 +9,8 @@ elseif (WITH_BMIS) set(package_name "export_bmi_and_interfaces") elseif (INCLUDE_PROPERTIES) set(package_name "export_include_directories") +elseif (FROM_NINJA) + set(package_name "export_from_ninja") else () set(package_name "export_interfaces") endif () -- cgit v0.12 From 5261af94248153b66d30504bd67e288c25aad7f1 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 16 Feb 2024 08:42:57 -0500 Subject: cmGeneratorTarget: store synthetic targets in its cache The synthetic target cache was never actually updated, so record them in the cache so that reuses can actually be discovered. Fixes: #25568 --- Source/cmGeneratorTarget.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 5b7f526..3cfa5a9 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -8379,6 +8379,7 @@ bool cmGeneratorTarget::DiscoverSyntheticTargets(cmSyntheticTargetCache& cache, // Create the generator target and attach it to the local generator. auto gtp = cm::make_unique(tgt, lg); synthDep = gtp.get(); + cache.CxxModuleTargets[targetName] = synthDep; lg->AddGeneratorTarget(std::move(gtp)); } else { synthDep = cached->second; -- cgit v0.12