Forráskód Böngészése

Ninja: Use more efficient data structures to collect outputs

Nicolas van Kempen 2 éve
szülő
commit
426f3295f6

+ 3 - 12
Source/cmGlobalNinjaGenerator.cxx

@@ -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()) {

+ 4 - 8
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;
 

+ 14 - 12
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));
     }
   }
 }

+ 1 - 2
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