Bläddra i källkod

Ninja: Use 'console' pool for CMake re-run if possible (#14915)

The pre-defined 'console' pool is a non-buffered pool that runs with a
depth of 1.  CMake re-run cannot be run concurrently and it will
eventually output something.  A non-buffered pool allows to get it as
soon as possible

Also, generate the minimal required version of Ninja in the build file.
Sylvain Joubert 11 år sedan
förälder
incheckning
9f32a2411b

+ 22 - 1
Source/cmGlobalNinjaGenerator.cxx

@@ -1128,6 +1128,16 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
   implicitDeps.erase(std::unique(implicitDeps.begin(), implicitDeps.end()),
                      implicitDeps.end());
 
+  cmNinjaVars variables;
+  // Use 'console' pool to get non buffered output of the CMake re-run call
+  // Available since Ninja 1.5
+  if(cmSystemTools::VersionCompare(cmSystemTools::OP_LESS,
+                                   ninjaVersion().c_str(),
+                                   "1.5") == false)
+    {
+    variables["pool"] = "console";
+    }
+
   this->WriteBuild(os,
                    "Re-run CMake if any of its inputs changed.",
                    "RERUN_CMAKE",
@@ -1135,7 +1145,7 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
                    /*explicitDeps=*/ cmNinjaDeps(),
                    implicitDeps,
                    /*orderOnlyDeps=*/ cmNinjaDeps(),
-                   /*variables=*/ cmNinjaVars());
+                   variables);
 
   this->WritePhonyBuild(os,
                         "A missing CMake input file is not an error.",
@@ -1154,6 +1164,17 @@ std::string cmGlobalNinjaGenerator::ninjaCmd() const
   return "ninja";
 }
 
+std::string cmGlobalNinjaGenerator::ninjaVersion() const
+{
+  std::string version;
+  std::string command = ninjaCmd() + " --version";
+  cmSystemTools::RunSingleCommand(command.c_str(),
+                                  &version, 0, 0,
+                                  cmSystemTools::OUTPUT_NONE);
+
+  return version;
+}
+
 void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
 {
   WriteRule(*this->RulesFileStream,

+ 2 - 1
Source/cmGlobalNinjaGenerator.h

@@ -297,6 +297,8 @@ public:
   void AddTargetAlias(const std::string& alias, cmTarget* target);
 
   virtual void ComputeTargetObjectDirectory(cmGeneratorTarget* gt) const;
+
+  std::string ninjaVersion() const;
 protected:
 
   /// Overloaded methods. @see cmGlobalGenerator::Generate()
@@ -335,7 +337,6 @@ private:
 
   std::string ninjaCmd() const;
 
-
   /// The file containing the build statement. (the relation ship of the
   /// compilation DAG).
   cmGeneratedFileStream* BuildFileStream;

+ 25 - 0
Source/cmLocalNinjaGenerator.cxx

@@ -189,6 +189,7 @@ void cmLocalNinjaGenerator::WriteBuildFileTop()
 {
   // For the build file.
   this->WriteProjectHeader(this->GetBuildFileStream());
+  this->WriteNinjaRequiredVersion(this->GetBuildFileStream());
   this->WriteNinjaFilesInclusion(this->GetBuildFileStream());
 
   // For the rule file.
@@ -205,6 +206,30 @@ void cmLocalNinjaGenerator::WriteProjectHeader(std::ostream& os)
   cmGlobalNinjaGenerator::WriteDivider(os);
 }
 
+void cmLocalNinjaGenerator::WriteNinjaRequiredVersion(std::ostream& os)
+{
+  // Default required version
+  // Ninja generator uses 'deps' and 'msvc_deps_prefix' introduced in 1.3
+  std::string requiredVersion = "1.3";
+
+  // Ninja generator uses the 'console' pool if available (>= 1.5)
+  std::string usedVersion = this->GetGlobalNinjaGenerator()->ninjaVersion();
+  if(cmSystemTools::VersionCompare(cmSystemTools::OP_LESS,
+                                   usedVersion.c_str(),
+                                   "1.5") ==  false)
+    {
+      requiredVersion = "1.5";
+    }
+
+  cmGlobalNinjaGenerator::WriteComment(os,
+                          "Minimal version of Ninja required by this file");
+  os
+    << "ninja_required_version = "
+    << requiredVersion
+    << std::endl << std::endl
+    ;
+}
+
 void cmLocalNinjaGenerator::WritePools(std::ostream& os)
 {
   cmGlobalNinjaGenerator::WriteDivider(os);

+ 1 - 0
Source/cmLocalNinjaGenerator.h

@@ -117,6 +117,7 @@ private:
 
   void WriteBuildFileTop();
   void WriteProjectHeader(std::ostream& os);
+  void WriteNinjaRequiredVersion(std::ostream& os);
   void WriteNinjaFilesInclusion(std::ostream& os);
   void WriteProcessedMakefile(std::ostream& os);
   void WritePools(std::ostream& os);