Sfoglia il codice sorgente

Merge branch 'cxxmodules-non-compiled-source-release' into cxxmodules-non-compiled-source

* cxxmodules-non-compiled-source-release:
  cxxmodules: detect and message about non-compiled sources
Ben Boeckel 2 anni fa
parent
commit
24a9b00f83

+ 4 - 3
Source/cmDyndepCollation.cxx

@@ -122,10 +122,11 @@ Json::Value CollationInformationCxxModules(
         auto lookup = sf_map.find(file);
         if (lookup == sf_map.end()) {
           gt->Makefile->IssueMessage(
-            MessageType::INTERNAL_ERROR,
-            cmStrCat("Target \"", tgt->GetName(), "\" has source file \"",
+            MessageType::FATAL_ERROR,
+            cmStrCat("Target \"", tgt->GetName(), "\" has source file\n  ",
                      file,
-                     R"(" which is not in any of its "FILE_SET BASE_DIRS".)"));
+                     "\nin a \"FILE_SET TYPE CXX_MODULES\" but it is not "
+                     "scheduled for compilation."));
           continue;
         }
 

+ 20 - 0
Source/cmVisualStudio10TargetGenerator.cxx

@@ -2551,6 +2551,12 @@ void cmVisualStudio10TargetGenerator::WriteAllSources(Elem& e0)
         break;
     }
 
+    std::string config;
+    if (!this->Configurations.empty()) {
+      config = this->Configurations[si.Configs[0]];
+    }
+    auto const* fs =
+      this->GeneratorTarget->GetFileSetForSource(config, si.Source);
     if (tool) {
       // Compute set of configurations to exclude, if any.
       std::vector<size_t> const& include_configs = si.Configs;
@@ -2616,6 +2622,13 @@ void cmVisualStudio10TargetGenerator::WriteAllSources(Elem& e0)
       if (si.Kind == cmGeneratorTarget::SourceKindObjectSource ||
           si.Kind == cmGeneratorTarget::SourceKindUnityBatched) {
         this->OutputSourceSpecificFlags(e2, si.Source);
+      } else if (fs && fs->GetType() == "CXX_MODULES"_s) {
+        this->GeneratorTarget->Makefile->IssueMessage(
+          MessageType::FATAL_ERROR,
+          cmStrCat("Target \"", this->GeneratorTarget->GetName(),
+                   "\" has source file\n  ", si.Source->GetFullPath(),
+                   "\nin a \"FILE_SET TYPE CXX_MODULES\" but it is not "
+                   "scheduled for compilation."));
       }
       if (si.Source->GetPropertyAsBool("SKIP_PRECOMPILE_HEADERS")) {
         e2.Element("PrecompiledHeader", "NotUsing");
@@ -2625,6 +2638,13 @@ void cmVisualStudio10TargetGenerator::WriteAllSources(Elem& e0)
       }
 
       this->FinishWritingSource(e2, toolSettings);
+    } else if (fs && fs->GetType() == "CXX_MODULES"_s) {
+      this->GeneratorTarget->Makefile->IssueMessage(
+        MessageType::FATAL_ERROR,
+        cmStrCat("Target \"", this->GeneratorTarget->GetName(),
+                 "\" has source file\n  ", si.Source->GetFullPath(),
+                 "\nin a \"FILE_SET TYPE CXX_MODULES\" but it is not "
+                 "scheduled for compilation."));
     }
   }
 

+ 5 - 0
Tests/RunCMake/CXXModules/NoCXX-stderr.txt

@@ -15,6 +15,11 @@ CMake Error in CMakeLists.txt:
   language has not been enabled
 |  The target named "nocxx" contains C\+\+ sources that export modules which is
   not supported by the generator
+|  Target "nocxx" has source file
+
+    .*/Tests/RunCMake/CXXModules/sources/module.cxx
+
+  in a "FILE_SET TYPE CXX_MODULES" but it is not scheduled for compilation.
 )
 )*
 CMake Generate step failed.  Build files cannot be regenerated correctly.

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

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

+ 16 - 0
Tests/RunCMake/CXXModules/NotCompiledSourceModules-stderr.txt

@@ -0,0 +1,16 @@
+CMake Warning \(dev\) at NotCompiledSourceModules.cmake:5 \(target_sources\):
+  CMake's C\+\+ module support is experimental.  It is meant only for
+  experimentation and feedback to CMake developers.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:6 \(include\)
+This warning is for project developers.  Use -Wno-dev to suppress it.
+
+(CMake Error in CMakeLists.txt:
+  Target "not-cxx-source" has source file
+
+    .*/Tests/RunCMake/CXXModules/sources/not-compiled.txt
+
+  in a "FILE_SET TYPE CXX_MODULES" but it is not scheduled for compilation.
+
+)+
+CMake Generate step failed.  Build files cannot be regenerated correctly.

+ 13 - 0
Tests/RunCMake/CXXModules/NotCompiledSourceModules.cmake

@@ -0,0 +1,13 @@
+enable_language(CXX)
+set(CMAKE_EXPERIMENTAL_CXX_SCANDEP_SOURCE "")
+
+add_library(not-cxx-source)
+target_sources(not-cxx-source
+  PRIVATE
+    sources/cxx-anchor.cxx
+  PUBLIC
+    FILE_SET fs TYPE CXX_MODULES FILES
+      sources/not-compiled.txt)
+target_compile_features(not-cxx-source
+  PRIVATE
+    cxx_std_20)

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

@@ -71,8 +71,9 @@ foreach (fileset_type IN LISTS fileset_types)
   endforeach ()
   run_cmake("FileSet${fileset_type}InterfaceImported")
 
-  # Test the error message when a non-C++ source file is found in the source
+  # Test the error messages when a non-C++ source file is found in the source
   # list.
+  run_cmake("NotCompiledSource${fileset_type}")
   run_cmake("NotCXXSource${fileset_type}")
 endforeach ()
 

+ 0 - 0
Tests/RunCMake/CXXModules/sources/not-compiled.txt