From eb2da206d94dcfcb579036969145a8bdb52e7e72 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 20 Jan 2020 10:42:23 -0500 Subject: cmGlobalNinjaGenerator: only restat build.ninja This reduces the work that ninja needs to do on a CMake reconfigure. --- Source/cmGlobalNinjaGenerator.cxx | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index 0487ad1..1f83ec5 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -531,11 +531,13 @@ void cmGlobalNinjaGenerator::Generate() return; } - auto run_ninja_tool = [this](char const* tool) { + auto run_ninja_tool = [this](std::vector const& args) { std::vector command; command.push_back(this->NinjaCommand); command.emplace_back("-t"); - command.emplace_back(tool); + for (auto const& arg : args) { + command.emplace_back(arg); + } std::string error; if (!cmSystemTools::RunSingleCommand(command, nullptr, &error, nullptr, nullptr, @@ -551,13 +553,25 @@ void cmGlobalNinjaGenerator::Generate() }; if (this->NinjaSupportsCleanDeadTool) { - run_ninja_tool("cleandead"); + run_ninja_tool({ "cleandead" }); } if (this->NinjaSupportsUnconditionalRecompactTool) { - run_ninja_tool("recompact"); + run_ninja_tool({ "recompact" }); } if (this->NinjaSupportsRestatTool) { - run_ninja_tool("restat"); + // XXX(ninja): We only list `build.ninja` entry files here because CMake + // *always* rewrites these files on a reconfigure. If CMake ever gets + // smarter about this, all CMake-time created/edited files listed as + // outputs for the reconfigure build statement will need to be listed here. + cmNinjaDeps outputs; + this->AddRebuildManifestOutputs(outputs); + std::vector args; + args.reserve(outputs.size() + 1); + args.push_back("restat"); + for (auto const& output : outputs) { + args.push_back(output.c_str()); + } + run_ninja_tool(args); } } -- cgit v0.12