summaryrefslogtreecommitdiffstats
path: root/Source/cmNinjaTargetGenerator.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmNinjaTargetGenerator.cxx')
-rw-r--r--Source/cmNinjaTargetGenerator.cxx17
1 files changed, 13 insertions, 4 deletions
diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index 45ed0ab..a465b08 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -815,6 +815,11 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
// dyndep rules
rule.RspFile = "$out.rsp";
rule.RspContent = "$in";
+ // Ninja's collator writes all outputs using `cmGeneratedFileStream`, so
+ // they are only updated if contents actually change. Avoid running
+ // dependent jobs if the contents don't change by telling `ninja` to check
+ // the timestamp again.
+ rule.Restat = "1";
// Run CMake dependency scanner on the source file (using the preprocessed
// source if that was performed).
@@ -1222,11 +1227,13 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements(
cmNinjaBuild build(this->LanguageDyndepRule(language, config));
build.Outputs.push_back(this->GetDyndepFilePath(language, config));
- build.ImplicitOuts.push_back(
+ build.ImplicitOuts.emplace_back(
cmStrCat(this->Makefile->GetCurrentBinaryDirectory(), '/',
this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget),
this->GetGlobalGenerator()->ConfigDirectory(config), '/',
language, "Modules.json"));
+ build.ImplicitDeps.emplace_back(
+ this->GetTargetDependInfoPath(language, config));
for (auto const& scanFiles : scanningFiles) {
if (!scanFiles.ScanningOutput.empty()) {
build.ExplicitDeps.push_back(scanFiles.ScanningOutput);
@@ -1241,10 +1248,12 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements(
auto const linked_directories =
this->GetLinkedTargetDirectories(language, config);
for (std::string const& l : linked_directories.Direct) {
- build.ImplicitDeps.push_back(cmStrCat(l, '/', language, "Modules.json"));
+ build.ImplicitDeps.emplace_back(
+ cmStrCat(l, '/', language, "Modules.json"));
}
for (std::string const& l : linked_directories.Forward) {
- build.ImplicitDeps.push_back(cmStrCat(l, '/', language, "Modules.json"));
+ build.ImplicitDeps.emplace_back(
+ cmStrCat(l, '/', language, "Modules.json"));
}
this->GetGlobalGenerator()->WriteBuild(this->GetImplFileStream(fileConfig),
@@ -1639,7 +1648,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
// corresponding file path.
std::string ddModmapFile = cmStrCat(objectFileName, ".modmap");
vars["DYNDEP_MODULE_MAP_FILE"] = ddModmapFile;
- objBuild.OrderOnlyDeps.push_back(ddModmapFile);
+ objBuild.ImplicitDeps.push_back(ddModmapFile);
scanningFiles.ModuleMapFile = std::move(ddModmapFile);
}