Ninja: Use cmNinjaBuild class for WriteBuild

This commit is contained in:
Sebastian Holtermann
2019-05-30 17:12:15 +02:00
parent 465d6d7f9b
commit 834ec4ebfe

View File

@@ -1342,20 +1342,21 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
WriteRule(*this->RulesFileStream, rule); WriteRule(*this->RulesFileStream, rule);
} }
cmNinjaDeps implicitDeps; cmNinjaBuild reBuild("RERUN_CMAKE");
cmNinjaDeps explicitDeps; reBuild.Comment = "Re-run CMake if any of its inputs changed.";
reBuild.Outputs.push_back(this->NinjaOutputPath(NINJA_BUILD_FILE));
for (cmLocalGenerator* localGen : this->LocalGenerators) { for (cmLocalGenerator* localGen : this->LocalGenerators) {
for (std::string const& fi : localGen->GetMakefile()->GetListFiles()) { for (std::string const& fi : localGen->GetMakefile()->GetListFiles()) {
implicitDeps.push_back(this->ConvertToNinjaPath(fi)); reBuild.ImplicitDeps.push_back(this->ConvertToNinjaPath(fi));
} }
} }
implicitDeps.push_back(this->CMakeCacheFile); reBuild.ImplicitDeps.push_back(this->CMakeCacheFile);
cmNinjaVars variables;
// Use 'console' pool to get non buffered output of the CMake re-run call // Use 'console' pool to get non buffered output of the CMake re-run call
// Available since Ninja 1.5 // Available since Ninja 1.5
if (SupportsConsolePool()) { if (SupportsConsolePool()) {
variables["pool"] = "console"; reBuild.Variables["pool"] = "console";
} }
cmake* cm = this->GetCMakeInstance(); cmake* cm = this->GetCMakeInstance();
@@ -1377,23 +1378,23 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
phonyBuild.Outputs.push_back(cm->GetGlobVerifyScript() + "_force"); phonyBuild.Outputs.push_back(cm->GetGlobVerifyScript() + "_force");
this->WriteBuild(os, phonyBuild); this->WriteBuild(os, phonyBuild);
variables["restat"] = "1"; reBuild.Variables["restat"] = "1";
std::string const verifyScriptFile = std::string const verifyScriptFile =
this->NinjaOutputPath(cm->GetGlobVerifyScript()); this->NinjaOutputPath(cm->GetGlobVerifyScript());
std::string const verifyStampFile = std::string const verifyStampFile =
this->NinjaOutputPath(cm->GetGlobVerifyStamp()); this->NinjaOutputPath(cm->GetGlobVerifyStamp());
this->WriteBuild(os, {
"Re-run CMake to check if globbed directories changed.", cmNinjaBuild vgBuild("VERIFY_GLOBS");
"VERIFY_GLOBS", vgBuild.Comment =
/*outputs=*/cmNinjaDeps(1, verifyStampFile), "Re-run CMake to check if globbed directories changed.";
/*implicitOuts=*/cmNinjaDeps(), vgBuild.Outputs.push_back(verifyStampFile);
/*explicitDeps=*/cmNinjaDeps(), vgBuild.ImplicitDeps = phonyBuild.Outputs;
/*implicitDeps=*/phonyBuild.Outputs, vgBuild.Variables = reBuild.Variables;
/*orderOnlyDeps=*/cmNinjaDeps(), variables); this->WriteBuild(os, vgBuild);
}
variables.erase("restat"); reBuild.Variables.erase("restat");
implicitDeps.push_back(verifyScriptFile); reBuild.ImplicitDeps.push_back(verifyScriptFile);
explicitDeps.push_back(verifyStampFile); reBuild.ExplicitDeps.push_back(verifyStampFile);
} else if (!this->SupportsManifestRestat() && } else if (!this->SupportsManifestRestat() &&
cm->DoWriteGlobVerifyTarget()) { cm->DoWriteGlobVerifyTarget()) {
std::ostringstream msg; std::ostringstream msg;
@@ -1411,22 +1412,18 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
msg.str()); msg.str());
} }
std::sort(implicitDeps.begin(), implicitDeps.end()); std::sort(reBuild.ImplicitDeps.begin(), reBuild.ImplicitDeps.end());
implicitDeps.erase(std::unique(implicitDeps.begin(), implicitDeps.end()), reBuild.ImplicitDeps.erase(
implicitDeps.end()); std::unique(reBuild.ImplicitDeps.begin(), reBuild.ImplicitDeps.end()),
reBuild.ImplicitDeps.end());
std::string const ninjaBuildFile = this->NinjaOutputPath(NINJA_BUILD_FILE); this->WriteBuild(os, reBuild);
this->WriteBuild(os, "Re-run CMake if any of its inputs changed.",
"RERUN_CMAKE",
/*outputs=*/cmNinjaDeps(1, ninjaBuildFile),
/*implicitOuts=*/cmNinjaDeps(), explicitDeps, implicitDeps,
/*orderOnlyDeps=*/cmNinjaDeps(), variables);
{ {
cmNinjaBuild build("phony"); cmNinjaBuild build("phony");
build.Comment = "A missing CMake input file is not an error."; build.Comment = "A missing CMake input file is not an error.";
std::set_difference(std::make_move_iterator(implicitDeps.begin()), std::set_difference(std::make_move_iterator(reBuild.ImplicitDeps.begin()),
std::make_move_iterator(implicitDeps.end()), std::make_move_iterator(reBuild.ImplicitDeps.end()),
CustomCommandOutputs.begin(), CustomCommandOutputs.begin(),
CustomCommandOutputs.end(), CustomCommandOutputs.end(),
std::back_inserter(build.Outputs)); std::back_inserter(build.Outputs));