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.
This commit is contained in:
Sylvain Joubert 2014-10-02 21:21:05 +02:00 committed by Brad King
parent 99d34f46fa
commit 9f32a2411b
4 changed files with 50 additions and 2 deletions

View File

@ -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,

View File

@ -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;

View File

@ -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);

View File

@ -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);