Ninja: clean ninja metadata once generated

Fixes: #15830
This commit is contained in:
Ben Boeckel 2019-05-13 10:52:05 -04:00
parent b67c53dddf
commit fb18215904
3 changed files with 53 additions and 0 deletions

View File

@ -0,0 +1,5 @@
ninja-postgen-commands
----------------------
* The :generator:`Ninja` generator learned to perform some post-processing on
the generated files for more consistent builds.

View File

@ -530,6 +530,35 @@ void cmGlobalNinjaGenerator::Generate()
if (!this->WriteDefaultBuildFile()) {
return;
}
auto run_ninja_tool = [this](char const* tool) {
std::vector<std::string> command;
command.push_back(this->NinjaCommand);
command.emplace_back("-t");
command.emplace_back(tool);
std::string error;
if (!cmSystemTools::RunSingleCommand(command, nullptr, &error, nullptr,
nullptr,
cmSystemTools::OUTPUT_NONE)) {
this->GetCMakeInstance()->IssueMessage(MessageType::FATAL_ERROR,
"Running\n '" +
cmJoin(command, "' '") +
"'\n"
"failed with:\n " +
error);
cmSystemTools::SetFatalErrorOccured();
}
};
if (this->NinjaSupportsCleanDeadTool) {
run_ninja_tool("cleandead");
}
if (this->NinjaSupportsUnconditionalRecompactTool) {
run_ninja_tool("recompact");
}
if (this->NinjaSupportsRestatTool) {
run_ninja_tool("restat");
}
}
bool cmGlobalNinjaGenerator::FindMakeProgram(cmMakefile* mf)
@ -593,6 +622,16 @@ void cmGlobalNinjaGenerator::CheckNinjaFeatures()
}
}
}
this->NinjaSupportsCleanDeadTool = !cmSystemTools::VersionCompare(
cmSystemTools::OP_LESS, this->NinjaVersion.c_str(),
RequiredNinjaVersionForCleanDeadTool().c_str());
this->NinjaSupportsUnconditionalRecompactTool =
!cmSystemTools::VersionCompare(
cmSystemTools::OP_LESS, this->NinjaVersion.c_str(),
RequiredNinjaVersionForUnconditionalRecompactTool().c_str());
this->NinjaSupportsRestatTool = !cmSystemTools::VersionCompare(
cmSystemTools::OP_LESS, this->NinjaVersion.c_str(),
RequiredNinjaVersionForRestatTool().c_str());
}
bool cmGlobalNinjaGenerator::CheckLanguages(

View File

@ -348,6 +348,12 @@ public:
return "1.9";
}
static std::string RequiredNinjaVersionForDyndeps() { return "1.10"; }
static std::string RequiredNinjaVersionForRestatTool() { return "1.10"; }
static std::string RequiredNinjaVersionForUnconditionalRecompactTool()
{
return "1.10";
}
static std::string RequiredNinjaVersionForCleanDeadTool() { return "1.10"; }
bool SupportsConsolePool() const;
bool SupportsImplicitOuts() const;
bool SupportsManifestRestat() const;
@ -488,6 +494,9 @@ private:
bool NinjaSupportsManifestRestat = false;
bool NinjaSupportsMultilineDepfile = false;
bool NinjaSupportsDyndeps = false;
bool NinjaSupportsRestatTool = false;
bool NinjaSupportsUnconditionalRecompactTool = false;
bool NinjaSupportsCleanDeadTool = false;
private:
void InitOutputPathPrefix();