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);
}
cmNinjaDeps implicitDeps;
cmNinjaDeps explicitDeps;
cmNinjaBuild reBuild("RERUN_CMAKE");
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 (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
// Available since Ninja 1.5
if (SupportsConsolePool()) {
variables["pool"] = "console";
reBuild.Variables["pool"] = "console";
}
cmake* cm = this->GetCMakeInstance();
@@ -1377,23 +1378,23 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
phonyBuild.Outputs.push_back(cm->GetGlobVerifyScript() + "_force");
this->WriteBuild(os, phonyBuild);
variables["restat"] = "1";
reBuild.Variables["restat"] = "1";
std::string const verifyScriptFile =
this->NinjaOutputPath(cm->GetGlobVerifyScript());
std::string const verifyStampFile =
this->NinjaOutputPath(cm->GetGlobVerifyStamp());
this->WriteBuild(os,
"Re-run CMake to check if globbed directories changed.",
"VERIFY_GLOBS",
/*outputs=*/cmNinjaDeps(1, verifyStampFile),
/*implicitOuts=*/cmNinjaDeps(),
/*explicitDeps=*/cmNinjaDeps(),
/*implicitDeps=*/phonyBuild.Outputs,
/*orderOnlyDeps=*/cmNinjaDeps(), variables);
variables.erase("restat");
implicitDeps.push_back(verifyScriptFile);
explicitDeps.push_back(verifyStampFile);
{
cmNinjaBuild vgBuild("VERIFY_GLOBS");
vgBuild.Comment =
"Re-run CMake to check if globbed directories changed.";
vgBuild.Outputs.push_back(verifyStampFile);
vgBuild.ImplicitDeps = phonyBuild.Outputs;
vgBuild.Variables = reBuild.Variables;
this->WriteBuild(os, vgBuild);
}
reBuild.Variables.erase("restat");
reBuild.ImplicitDeps.push_back(verifyScriptFile);
reBuild.ExplicitDeps.push_back(verifyStampFile);
} else if (!this->SupportsManifestRestat() &&
cm->DoWriteGlobVerifyTarget()) {
std::ostringstream msg;
@@ -1411,22 +1412,18 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
msg.str());
}
std::sort(implicitDeps.begin(), implicitDeps.end());
implicitDeps.erase(std::unique(implicitDeps.begin(), implicitDeps.end()),
implicitDeps.end());
std::sort(reBuild.ImplicitDeps.begin(), reBuild.ImplicitDeps.end());
reBuild.ImplicitDeps.erase(
std::unique(reBuild.ImplicitDeps.begin(), reBuild.ImplicitDeps.end()),
reBuild.ImplicitDeps.end());
std::string const ninjaBuildFile = this->NinjaOutputPath(NINJA_BUILD_FILE);
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);
this->WriteBuild(os, reBuild);
{
cmNinjaBuild build("phony");
build.Comment = "A missing CMake input file is not an error.";
std::set_difference(std::make_move_iterator(implicitDeps.begin()),
std::make_move_iterator(implicitDeps.end()),
std::set_difference(std::make_move_iterator(reBuild.ImplicitDeps.begin()),
std::make_move_iterator(reBuild.ImplicitDeps.end()),
CustomCommandOutputs.begin(),
CustomCommandOutputs.end(),
std::back_inserter(build.Outputs));