summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-03-30 11:18:55 +0000
committerKitware Robot <kwrobot@kitware.com>2023-03-30 07:19:05 -0400
commitdfe32d797e82b48d38648f580a621fe99c2405d4 (patch)
treef4fa3a4eababacf245f0aa6918ec21e63452e380 /Source
parent2f3ba93102d1a3e6f4674b27b95853ea613d4bf6 (diff)
parent426f3295f61eaf2feb58c7e4b9ebe838b21cf453 (diff)
downloadcmake-dfe32d797e82b48d38648f580a621fe99c2405d4.tar.gz
Merge topic 'ninja-performance'
426f3295f6 Ninja: Use more efficient data structures to collect outputs Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: buildbot <buildbot@kitware.com> Merge-request: !8371
Diffstat (limited to 'Source')
-rw-r--r--Source/cmGlobalNinjaGenerator.cxx15
-rw-r--r--Source/cmGlobalNinjaGenerator.h12
-rw-r--r--Source/cmLocalNinjaGenerator.cxx26
-rw-r--r--Source/cmNinjaTypes.h3
4 files changed, 22 insertions, 34 deletions
diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx
index 052f2e9864..0c28776a82 100644
--- a/Source/cmGlobalNinjaGenerator.cxx
+++ b/Source/cmGlobalNinjaGenerator.cxx
@@ -1369,17 +1369,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)
{
@@ -1400,7 +1390,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()) {
diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h
index 55fdbf09e3..bd541685c9 100644
--- a/Source/cmGlobalNinjaGenerator.h
+++ b/Source/cmGlobalNinjaGenerator.h
@@ -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;
diff --git a/Source/cmLocalNinjaGenerator.cxx b/Source/cmLocalNinjaGenerator.cxx
index 305dab32e5..d0bd3758f4 100644
--- a/Source/cmLocalNinjaGenerator.cxx
+++ b/Source/cmLocalNinjaGenerator.cxx
@@ -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));
}
}
}
diff --git a/Source/cmNinjaTypes.h b/Source/cmNinjaTypes.h
index c8a411e1df..b77e0b5285 100644
--- a/Source/cmNinjaTypes.h
+++ b/Source/cmNinjaTypes.h
@@ -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