Browse Source

Merge topic 'ninja-postgen-commands'

fb18215904 Ninja: clean ninja metadata once generated

Acked-by: Kitware Robot <[email protected]>
Acked-by: Jan Niklas Hasse <[email protected]>
Merge-request: !3316
Brad King 5 years ago
parent
commit
2ee6baef4f

+ 5 - 0
Help/release/dev/ninja-postgen-commands.rst

@@ -0,0 +1,5 @@
+ninja-postgen-commands
+----------------------
+
+* The :generator:`Ninja` generator learned to perform some post-processing on
+  the generated files for more consistent builds.

+ 39 - 0
Source/cmGlobalNinjaGenerator.cxx

@@ -530,6 +530,35 @@ void cmGlobalNinjaGenerator::Generate()
   if (!this->WriteDefaultBuildFile()) {
     return;
   }
+
+  auto run_ninja_tool = [this](char const* tool) {
+    std::vector<std::string> command;
+    command.push_back(this->NinjaCommand);
+    command.emplace_back("-t");
+    command.emplace_back(tool);
+    std::string error;
+    if (!cmSystemTools::RunSingleCommand(command, nullptr, &error, nullptr,
+                                         nullptr,
+                                         cmSystemTools::OUTPUT_NONE)) {
+      this->GetCMakeInstance()->IssueMessage(MessageType::FATAL_ERROR,
+                                             "Running\n '" +
+                                               cmJoin(command, "' '") +
+                                               "'\n"
+                                               "failed with:\n " +
+                                               error);
+      cmSystemTools::SetFatalErrorOccured();
+    }
+  };
+
+  if (this->NinjaSupportsCleanDeadTool) {
+    run_ninja_tool("cleandead");
+  }
+  if (this->NinjaSupportsUnconditionalRecompactTool) {
+    run_ninja_tool("recompact");
+  }
+  if (this->NinjaSupportsRestatTool) {
+    run_ninja_tool("restat");
+  }
 }
 
 bool cmGlobalNinjaGenerator::FindMakeProgram(cmMakefile* mf)
@@ -593,6 +622,16 @@ void cmGlobalNinjaGenerator::CheckNinjaFeatures()
       }
     }
   }
+  this->NinjaSupportsCleanDeadTool = !cmSystemTools::VersionCompare(
+    cmSystemTools::OP_LESS, this->NinjaVersion.c_str(),
+    RequiredNinjaVersionForCleanDeadTool().c_str());
+  this->NinjaSupportsUnconditionalRecompactTool =
+    !cmSystemTools::VersionCompare(
+      cmSystemTools::OP_LESS, this->NinjaVersion.c_str(),
+      RequiredNinjaVersionForUnconditionalRecompactTool().c_str());
+  this->NinjaSupportsRestatTool = !cmSystemTools::VersionCompare(
+    cmSystemTools::OP_LESS, this->NinjaVersion.c_str(),
+    RequiredNinjaVersionForRestatTool().c_str());
 }
 
 bool cmGlobalNinjaGenerator::CheckLanguages(

+ 9 - 0
Source/cmGlobalNinjaGenerator.h

@@ -349,6 +349,12 @@ public:
     return "1.9";
   }
   static std::string RequiredNinjaVersionForDyndeps() { return "1.10"; }
+  static std::string RequiredNinjaVersionForRestatTool() { return "1.10"; }
+  static std::string RequiredNinjaVersionForUnconditionalRecompactTool()
+  {
+    return "1.10";
+  }
+  static std::string RequiredNinjaVersionForCleanDeadTool() { return "1.10"; }
   bool SupportsConsolePool() const;
   bool SupportsImplicitOuts() const;
   bool SupportsManifestRestat() const;
@@ -489,6 +495,9 @@ private:
   bool NinjaSupportsManifestRestat = false;
   bool NinjaSupportsMultilineDepfile = false;
   bool NinjaSupportsDyndeps = false;
+  bool NinjaSupportsRestatTool = false;
+  bool NinjaSupportsUnconditionalRecompactTool = false;
+  bool NinjaSupportsCleanDeadTool = false;
 
 private:
   void InitOutputPathPrefix();