Ninja: Use more efficient data structures to collect outputs

stage/master/nightly/2023/03/30
Nicolas van Kempen 2023-03-23 04:02:50 -04:00
parent 841c1844e1
commit 426f3295f6
4 changed files with 22 additions and 34 deletions

View File

@ -1368,17 +1368,7 @@ void cmGlobalNinjaGenerator::AppendTargetDepends(
}
void cmGlobalNinjaGenerator::AppendTargetDependsClosure(
cmGeneratorTarget const* target, cmNinjaDeps& outputs,
const std::string& config, const std::string& fileConfig, bool genexOutput)
{
cmNinjaOuts outs;
this->AppendTargetDependsClosure(target, outs, config, fileConfig,
genexOutput, true);
cm::append(outputs, outs);
}
void cmGlobalNinjaGenerator::AppendTargetDependsClosure(
cmGeneratorTarget const* target, cmNinjaOuts& outputs,
cmGeneratorTarget const* target, std::unordered_set<std::string>& outputs,
const std::string& config, const std::string& fileConfig, bool genexOutput,
bool omit_self)
{
@ -1399,7 +1389,8 @@ void cmGlobalNinjaGenerator::AppendTargetDependsClosure(
// relevant for filling the cache entries properly isolated and a global
// result set that is relevant for the result of the top level call to
// AppendTargetDependsClosure.
cmNinjaOuts this_outs; // this will be the new cache entry
std::unordered_set<std::string>
this_outs; // this will be the new cache entry
for (auto const& dep_target : this->GetTargetDirectDepends(target)) {
if (!dep_target->IsInBuildSystem()) {

View File

@ -351,15 +351,10 @@ public:
const std::string& fileConfig,
cmNinjaTargetDepends depends);
void AppendTargetDependsClosure(cmGeneratorTarget const* target,
cmNinjaDeps& outputs,
std::unordered_set<std::string>& outputs,
const std::string& config,
const std::string& fileConfig,
bool genexOutput);
void AppendTargetDependsClosure(cmGeneratorTarget const* target,
cmNinjaOuts& outputs,
const std::string& config,
const std::string& fileConfig,
bool genexOutput, bool omit_self);
bool genexOutput, bool omit_self = true);
void AppendDirectoryForConfig(const std::string& prefix,
const std::string& config,
@ -617,7 +612,8 @@ private:
bool GenexOutput;
};
std::map<TargetDependsClosureKey, cmNinjaOuts> TargetDependsClosures;
std::map<TargetDependsClosureKey, std::unordered_set<std::string>>
TargetDependsClosures;
TargetAliasMap TargetAliases;

View File

@ -5,11 +5,11 @@
#include <algorithm>
#include <cassert>
#include <cstdio>
#include <iterator>
#include <memory>
#include <sstream>
#include <utility>
#include <cm/unordered_set>
#include <cmext/string_view>
#include "cmsys/FStream.hxx"
@ -26,6 +26,7 @@
#include "cmMakefile.h"
#include "cmMessageType.h"
#include "cmNinjaTargetGenerator.h"
#include "cmNinjaTypes.h"
#include "cmPolicies.h"
#include "cmRulePlaceholderExpander.h"
#include "cmSourceFile.h"
@ -601,7 +602,7 @@ void cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
continue;
}
cmNinjaDeps orderOnlyDeps;
std::unordered_set<std::string> orderOnlyDeps;
if (!cc->GetDependsExplicitOnly()) {
// A custom command may appear on multiple targets. However, some build
@ -617,19 +618,15 @@ void cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
assert(j != targets.end());
this->GetGlobalNinjaGenerator()->AppendTargetDependsClosure(
*j, orderOnlyDeps, ccg.GetOutputConfig(), fileConfig, ccgs.size() > 1);
std::sort(orderOnlyDeps.begin(), orderOnlyDeps.end());
++j;
for (; j != targets.end(); ++j) {
std::vector<std::string> jDeps;
std::vector<std::string> depsIntersection;
std::unordered_set<std::string> jDeps;
this->GetGlobalNinjaGenerator()->AppendTargetDependsClosure(
*j, jDeps, ccg.GetOutputConfig(), fileConfig, ccgs.size() > 1);
std::sort(jDeps.begin(), jDeps.end());
std::set_intersection(orderOnlyDeps.begin(), orderOnlyDeps.end(),
jDeps.begin(), jDeps.end(),
std::back_inserter(depsIntersection));
orderOnlyDeps = depsIntersection;
cm::erase_if(orderOnlyDeps, [&jDeps](std::string const& dep) {
return jDeps.find(dep) == jDeps.end();
});
}
}
@ -658,13 +655,17 @@ void cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
std::vector<std::string> cmdLines;
this->AppendCustomCommandLines(ccg, cmdLines);
cmNinjaDeps sortedOrderOnlyDeps(orderOnlyDeps.begin(),
orderOnlyDeps.end());
std::sort(sortedOrderOnlyDeps.begin(), sortedOrderOnlyDeps.end());
if (cmdLines.empty()) {
cmNinjaBuild build("phony");
build.Comment = cmStrCat("Phony custom command for ", mainOutput);
build.Outputs = std::move(ccOutputs.ExplicitOuts);
build.WorkDirOuts = std::move(ccOutputs.WorkDirOuts);
build.ExplicitDeps = std::move(ninjaDeps);
build.OrderOnlyDeps = orderOnlyDeps;
build.OrderOnlyDeps = std::move(sortedOrderOnlyDeps);
gg->WriteBuild(this->GetImplFileStream(fileConfig), build);
} else {
std::string customStep = cmSystemTools::GetFilenameName(mainOutput);
@ -710,7 +711,8 @@ void cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
this->ConstructComment(ccg), comment, depfile, cc->GetJobPool(),
cc->GetUsesTerminal(),
/*restat*/ !symbolic || !byproducts.empty(), fileConfig,
std::move(ccOutputs), std::move(ninjaDeps), std::move(orderOnlyDeps));
std::move(ccOutputs), std::move(ninjaDeps),
std::move(sortedOrderOnlyDeps));
}
}
}

View File

@ -5,8 +5,8 @@
#include "cmConfigure.h" // IWYU pragma: keep
#include <map>
#include <set>
#include <string>
#include <unordered_set>
#include <utility>
#include <vector>
@ -17,7 +17,6 @@ enum cmNinjaTargetDepends
};
using cmNinjaDeps = std::vector<std::string>;
using cmNinjaOuts = std::set<std::string>;
using cmNinjaVars = std::map<std::string, std::string>;
class cmNinjaRule