瀏覽代碼

Merge topic 'cxxmodules-vs-no-synthetic-targets'

17fd7fe2ae Tests/CXXModules: test Visual Studio synthetic target error
badb6ab120 VS: Explicitly disallow C++ modules provided by imported targets

Acked-by: Kitware Robot <[email protected]>
Merge-request: !8895
Brad King 2 年之前
父節點
當前提交
aff7870172

+ 1 - 0
Help/manual/cmake-cxxmodules.7.rst

@@ -68,5 +68,6 @@ For the :ref:`Visual Studio Generators`:
 - Only Visual Studio 2022 and MSVC toolsets 14.34 (Visual Studio
   17.4) and newer.
 - No support for exporting or installing BMI or module information.
+- No support for compiling BMIs from ``IMPORTED`` targets with C++ modules.
 - No diagnosis of using modules provided by ``PRIVATE`` sources from
   ``PUBLIC`` module sources.

+ 9 - 0
Source/cmVisualStudio10TargetGenerator.cxx

@@ -358,6 +358,15 @@ std::ostream& cmVisualStudio10TargetGenerator::Elem::WriteString(
 
 void cmVisualStudio10TargetGenerator::Generate()
 {
+  if (this->GeneratorTarget->IsSynthetic()) {
+    this->GeneratorTarget->Makefile->IssueMessage(
+      MessageType::FATAL_ERROR,
+      cmStrCat("Target \"", this->GeneratorTarget->GetName(),
+               "\" contains C++ modules intended for BMI-only compilation. "
+               "This is not yet supported by the Visual Studio generator."));
+    return;
+  }
+
   for (std::string const& config : this->Configurations) {
     this->GeneratorTarget->CheckCxxModuleStatus(config);
   }

+ 1 - 1
Tests/RunCMake/CXXModules/RunCMakeTest.cmake

@@ -95,7 +95,7 @@ if (RunCMake_GENERATOR MATCHES "Ninja")
   run_cmake(NinjaDependInfoExport)
   run_cmake(NinjaDependInfoBMIInstall)
 elseif (RunCMake_GENERATOR MATCHES "Visual Studio")
-  # Not supported yet.
+  run_cmake(VisualStudioNoSyntheticTargets)
 else ()
   message(FATAL_ERROR
     "Please add 'DependInfo' tests for the '${RunCMake_GENERATOR}' generator.")

+ 1 - 0
Tests/RunCMake/CXXModules/VisualStudioNoSyntheticTargets-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/CXXModules/VisualStudioNoSyntheticTargets-stderr.txt

@@ -0,0 +1,6 @@
+^(CMake Error in CMakeLists.txt:
+  Target "imported-cxx-modules@synth_[0-9a-f]+" contains C\+\+ modules
+  intended for BMI-only compilation.  This is not yet supported by the Visual
+  Studio generator.
+*
+)+CMake Generate step failed.  Build files cannot be regenerated correctly.

+ 27 - 0
Tests/RunCMake/CXXModules/VisualStudioNoSyntheticTargets.cmake

@@ -0,0 +1,27 @@
+enable_language(CXX)
+
+if (NOT CMAKE_GENERATOR MATCHES "Visual Studio")
+  message(FATAL_ERROR
+    "This test requires a 'Visual Studio' generator to be used.")
+endif ()
+
+add_library(imported-cxx-modules IMPORTED INTERFACE)
+target_sources(imported-cxx-modules
+  INTERFACE
+    FILE_SET modules TYPE CXX_MODULES
+    BASE_DIRS
+      "${CMAKE_CURRENT_SOURCE_DIR}/sources"
+    FILES
+      sources/module-simple.cxx)
+set_target_properties(imported-cxx-modules PROPERTIES
+  IMPORTED_CONFIGURATIONS DEBUG
+  IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX"
+  IMPORTED_CXX_MODULES_COMPILE_FEATURES "cxx_std_20"
+  INTERFACE_COMPILE_FEATURES "cxx_std_20"
+  IMPORTED_CXX_MODULES_DEBUG "simple=${CMAKE_CURRENT_SOURCE_DIR}/sources/module-simple.cxx")
+
+add_executable(vs-use-imported-cxx-modules
+  sources/module-simple-use.cxx)
+target_link_libraries(vs-use-imported-cxx-modules
+  PRIVATE
+    imported-cxx-modules)

+ 6 - 0
Tests/RunCMake/CXXModules/sources/module-simple-use.cxx

@@ -0,0 +1,6 @@
+import simple;
+
+int main(int argc, char* argv[])
+{
+  return g();
+}

+ 6 - 0
Tests/RunCMake/CXXModules/sources/module-simple.cxx

@@ -0,0 +1,6 @@
+export module simple;
+
+int g()
+{
+  return 0;
+}