summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-12-05 14:25:37 (GMT)
committerKitware Robot <kwrobot@kitware.com>2023-12-05 14:25:50 (GMT)
commitd301276bf5fb1a6336b3a42ab3005332692bf2d0 (patch)
tree76a705ea0dfbb0303654f8e25cf6a3856d1626f4
parent8c1da0b4bf094ab58591fdf14d5169ad4f49c449 (diff)
parent40dc13b24292354d07b9720d636fa48ab3eee219 (diff)
downloadCMake-d301276bf5fb1a6336b3a42ab3005332692bf2d0.zip
CMake-d301276bf5fb1a6336b3a42ab3005332692bf2d0.tar.gz
CMake-d301276bf5fb1a6336b3a42ab3005332692bf2d0.tar.bz2
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 <kwrobot@kitware.com> Tested-by: buildbot <buildbot@kitware.com> Merge-request: !9032
-rw-r--r--Source/cmLocalGenerator.cxx3
-rw-r--r--Source/cmNinjaTargetGenerator.cxx15
-rw-r--r--Tests/RunCMake/CXXModules/RunCMakeTest.cmake2
-rw-r--r--Tests/RunCMake/CXXModules/examples/scan-with-pch/CMakeLists.txt13
-rw-r--r--Tests/RunCMake/CXXModules/examples/scan-with-pch/main.cxx8
-rw-r--r--Tests/RunCMake/CXXModules/examples/scan-with-pch/pch.h1
6 files changed, 34 insertions, 8 deletions
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index fe8d502..caac535 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/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) {
diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index 2283923..4025918 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/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);
diff --git a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake
index 781c708..0c0f1b4 100644
--- a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake
+++ b/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)
diff --git a/Tests/RunCMake/CXXModules/examples/scan-with-pch/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/scan-with-pch/CMakeLists.txt
new file mode 100644
index 0000000..e3e7561
--- /dev/null
+++ b/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)
diff --git a/Tests/RunCMake/CXXModules/examples/scan-with-pch/main.cxx b/Tests/RunCMake/CXXModules/examples/scan-with-pch/main.cxx
new file mode 100644
index 0000000..33bd41e
--- /dev/null
+++ b/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;
+}
diff --git a/Tests/RunCMake/CXXModules/examples/scan-with-pch/pch.h b/Tests/RunCMake/CXXModules/examples/scan-with-pch/pch.h
new file mode 100644
index 0000000..2841ee9
--- /dev/null
+++ b/Tests/RunCMake/CXXModules/examples/scan-with-pch/pch.h
@@ -0,0 +1 @@
+#define from_pch