mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-11 16:32:14 -06:00
AutoGen: Fix needless compilation of mocs_compilation.cpp
For an AUTOMOC'ed target foo, when depfiles are used, there are the following dependencies: foo_autogen -> foo_autogen/timestamp foo_autogen/mocs_compilation.cpp -> foo_autogen/timestamp The first is used to trigger AUTOGEN. The second erroneously triggers a recompilation of mocs_compilation.cpp when any source file of target foo is touched. Remove the latter dependency and replace it with an order-only dependency from foo_autogen/mocs_compilation.cpp to foo_autogen_timestamp_deps. That is achieved by making mocs_compilation.cpp or its per-configuration variants byproduct(s) of the timestamp file. Fixes: #22338
This commit is contained in:
committed by
Alexey Edelev
parent
41e9953143
commit
4bda03370d
@@ -1111,11 +1111,30 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
|
||||
// Register info file as generated by CMake
|
||||
this->Makefile->AddCMakeOutputFile(this->AutogenTarget.InfoFile);
|
||||
|
||||
// Determine whether to use a depfile for the AUTOGEN target.
|
||||
const bool useNinjaDepfile = this->QtVersion >= IntegerVersion(5, 15) &&
|
||||
this->GlobalGen->GetName().find("Ninja") != std::string::npos;
|
||||
|
||||
// Files provided by the autogen target
|
||||
std::vector<std::string> autogenByproducts;
|
||||
std::vector<std::string> timestampByproducts;
|
||||
if (this->Moc.Enabled) {
|
||||
this->AddGeneratedSource(this->Moc.CompilationFile, this->Moc, true);
|
||||
autogenByproducts.push_back(this->Moc.CompilationFileGenex);
|
||||
if (useNinjaDepfile) {
|
||||
if (this->MultiConfig) {
|
||||
// Make all mocs_compilation_<CONFIG>.cpp files byproducts of the
|
||||
// ${target}_autogen/timestamp custom command.
|
||||
// We cannot just use Moc.CompilationFileGenex here, because that
|
||||
// custom command runs cmake_autogen for each configuration.
|
||||
for (const auto& p : this->Moc.CompilationFile.Config) {
|
||||
timestampByproducts.push_back(p.second);
|
||||
}
|
||||
} else {
|
||||
timestampByproducts.push_back(this->Moc.CompilationFileGenex);
|
||||
}
|
||||
} else {
|
||||
autogenByproducts.push_back(this->Moc.CompilationFileGenex);
|
||||
}
|
||||
}
|
||||
|
||||
if (this->Uic.Enabled) {
|
||||
@@ -1265,8 +1284,6 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
|
||||
this->AutogenTarget.DependFiles.begin(),
|
||||
this->AutogenTarget.DependFiles.end());
|
||||
|
||||
const bool useNinjaDepfile = this->QtVersion >= IntegerVersion(5, 15) &&
|
||||
this->GlobalGen->GetName().find("Ninja") != std::string::npos;
|
||||
if (useNinjaDepfile) {
|
||||
// Create a custom command that generates a timestamp file and
|
||||
// has a depfile assigned. The depfile is created by JobDepFilesMergeT.
|
||||
@@ -1327,8 +1344,9 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
|
||||
this->AddGeneratedSource(outputFile, this->Moc);
|
||||
const std::string no_main_dependency;
|
||||
this->LocalGen->AddCustomCommandToOutput(
|
||||
outputFile, dependencies, no_main_dependency, commandLines,
|
||||
autogenComment.c_str(), this->Dir.Work.c_str(),
|
||||
{ outputFile }, timestampByproducts, dependencies, no_main_dependency,
|
||||
/*implicit_depends=*/{}, commandLines, autogenComment.c_str(),
|
||||
this->Dir.Work.c_str(),
|
||||
/*cmp0116=*/cmPolicies::NEW, /*replace=*/false,
|
||||
/*escapeOldStyle=*/false,
|
||||
/*uses_terminal=*/false,
|
||||
|
||||
Reference in New Issue
Block a user