Merge topic 'cxxmodules-pch'

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
This commit is contained in:
Brad King
2023-12-05 14:25:37 +00:00
committed by Kitware Robot
6 changed files with 34 additions and 8 deletions

View File

@@ -2739,6 +2739,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) {

View File

@@ -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(
@@ -1438,13 +1441,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);

View File

@@ -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)

View File

@@ -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)

View File

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

View File

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