Hi, Since Ninja 1.5, a pre-defined pool 'console' can be used for non buffered output. See http://martine.github.io/ninja/manual.html#_the_literal_console_literal_pool
This patch specifies that special pool for the "build.ninja" build block if the Ninja version used is at least 1.5 This is useful for projects that have a long and verbose CMake run step. The idea is to get the output as soon as possible. It also adds the generation of the minimal required version of Ninja in the build.ninja file. The default version is 1.3 since the generator uses features from that version. If the Ninja version is 1.5 or greater, then the generator will use the 'console' pool and the build.ninja file requires at least Ninja 1.5 Regards, Sylvain
>From 5735b36d3c8780da06c9a91b461946a814d4592b Mon Sep 17 00:00:00 2001 From: Sylvain Joubert <joubert...@gmail.com> Date: Thu, 2 Oct 2014 21:21:05 +0200 Subject: [PATCH] Ninja: Use 'console' pool for CMake re-run if possible 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 --- Source/cmGlobalNinjaGenerator.cxx | 23 ++++++++++++++++++++++- Source/cmGlobalNinjaGenerator.h | 3 ++- Source/cmLocalNinjaGenerator.cxx | 25 +++++++++++++++++++++++++ Source/cmLocalNinjaGenerator.h | 1 + 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index 50e1abb..543ecdb 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/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, diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h index 4cbbeea..a192eee 100644 --- a/Source/cmGlobalNinjaGenerator.h +++ b/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; diff --git a/Source/cmLocalNinjaGenerator.cxx b/Source/cmLocalNinjaGenerator.cxx index 2ac8363..5522e0d 100644 --- a/Source/cmLocalNinjaGenerator.cxx +++ b/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); diff --git a/Source/cmLocalNinjaGenerator.h b/Source/cmLocalNinjaGenerator.h index 11321b8..c787ac6 100644 --- a/Source/cmLocalNinjaGenerator.h +++ b/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); -- 2.1.1
-- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/cmake-developers