Ninja: Use more efficient data structures to collect outputs
parent
841c1844e1
commit
426f3295f6
|
@ -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()) {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue