diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index 22fd90dd9e..4fa503236b 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -2763,6 +2763,7 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile( // `cmNinjaTargetGenerator::ExportObjectCompileCommand` to generate the // corresponding file path. cmGeneratedFileStream mmf(cmStrCat(object.PrimaryOutput, ".modmap")); + mmf.SetCopyIfDifferent(true); mmf << mm; } @@ -2852,6 +2853,7 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile( } cmGeneratedFileStream tmf(target_mods_file); + tmf.SetCopyIfDifferent(true); tmf << target_module_info; cmDyndepMetadataCallbacks cb; diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx index 9c75cd68d9..58248fc9cb 100644 --- a/Source/cmNinjaTargetGenerator.cxx +++ b/Source/cmNinjaTargetGenerator.cxx @@ -814,6 +814,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).