Răsfoiți Sursa

Merge topic 'cxxmodules-pch' into release-3.28

40dc13b242 cmNinjaTargetGenerator: PCH files do not need dyndep
f61c64cd1c cmLocalGenerator: prevent scanning of PCH source files
ea8c37b759 Tests/CXXModules: add a test which scans a PCH-using source

Acked-by: Kitware Robot <[email protected]>
Tested-by: buildbot <[email protected]>
Merge-request: !9032
Brad King 2 ani în urmă
părinte
comite
d301276bf5

+ 3 - 0
Source/cmLocalGenerator.cxx

@@ -2706,6 +2706,9 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target)
 
         auto* pch_sf = this->Makefile->GetOrCreateSource(
           pchSource, false, cmSourceFileLocationKind::Known);
+        // PCH sources should never be scanned as they cannot contain C++
+        // module references.
+        pch_sf->SetProperty("CXX_SCAN_FOR_MODULES", "0");
 
         if (!this->GetGlobalGenerator()->IsXcode()) {
           if (!ReuseFrom) {

+ 7 - 8
Source/cmNinjaTargetGenerator.cxx

@@ -1367,7 +1367,10 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
     !(language == "RC" || (language == "CUDA" && !flag));
   int const commandLineLengthLimit =
     ((lang_supports_response && this->ForceResponseFile())) ? -1 : 0;
-  bool const needDyndep =
+  cmValue pchExtension =
+    this->GetMakefile()->GetDefinition("CMAKE_PCH_EXTENSION");
+  bool const isPch = cmHasSuffix(objectFileName, pchExtension);
+  bool const needDyndep = !isPch &&
     this->GeneratorTarget->NeedDyndepForSource(language, config, source);
 
   cmNinjaBuild objBuild(this->LanguageCompilerRule(
@@ -1435,13 +1438,9 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
   }
 
   objBuild.Outputs.push_back(objectFileName);
-  if (firstForConfig) {
-    cmValue pchExtension =
-      this->GetMakefile()->GetDefinition("CMAKE_PCH_EXTENSION");
-    if (!cmHasSuffix(objectFileName, pchExtension)) {
-      // Add this object to the list of object files.
-      this->Configs[config].Objects.push_back(objectFileName);
-    }
+  if (firstForConfig && !isPch) {
+    // Add this object to the list of object files.
+    this->Configs[config].Objects.push_back(objectFileName);
   }
 
   objBuild.ExplicitDeps.push_back(sourceFilePath);

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

@@ -165,6 +165,8 @@ if (RunCMake_GENERATOR MATCHES "Ninja")
   run_cxx_module_test_target(ninja-cmp0154 "${ninja_cmp0154_target}")
 endif ()
 
+run_cxx_module_test(scan-with-pch)
+
 # Tests which use named modules.
 if ("named" IN_LIST CMake_TEST_MODULE_COMPILATION)
   run_cxx_module_test(simple)

+ 13 - 0
Tests/RunCMake/CXXModules/examples/scan-with-pch/CMakeLists.txt

@@ -0,0 +1,13 @@
+cmake_minimum_required(VERSION 3.28)
+project(cxx_modules_scan_with_pch CXX)
+
+include("${CMAKE_SOURCE_DIR}/../cxx-modules-rules.cmake")
+
+add_executable(simple)
+target_sources(simple
+  PRIVATE
+    main.cxx)
+target_compile_features(simple PUBLIC cxx_std_20)
+target_precompile_headers(simple PRIVATE pch.h)
+
+add_test(NAME simple COMMAND simple)

+ 8 - 0
Tests/RunCMake/CXXModules/examples/scan-with-pch/main.cxx

@@ -0,0 +1,8 @@
+#ifndef from_pch
+#  error "pch not present"
+#endif
+
+int main(int argc, char* argv[])
+{
+  return 0;
+}

+ 1 - 0
Tests/RunCMake/CXXModules/examples/scan-with-pch/pch.h

@@ -0,0 +1 @@
+#define from_pch