Merge topic 'ninja-implicit-outputs'

501f9c93 cmGlobalNinjaGenerator: Add API to check for implicit outputs support
144a24dc cmGlobalNinjaGenerator: Teach WriteBuild about implicit outputs
This commit is contained in:
Brad King 2016-09-21 08:47:42 -04:00 committed by CMake Topic Stage
commit 63fbcd6799
4 changed files with 39 additions and 12 deletions

View File

@ -140,10 +140,10 @@ std::string cmGlobalNinjaGenerator::EncodeDepfileSpace(const std::string& path)
void cmGlobalNinjaGenerator::WriteBuild( void cmGlobalNinjaGenerator::WriteBuild(
std::ostream& os, const std::string& comment, const std::string& rule, std::ostream& os, const std::string& comment, const std::string& rule,
const cmNinjaDeps& outputs, const cmNinjaDeps& explicitDeps, const cmNinjaDeps& outputs, const cmNinjaDeps& implicitOuts,
const cmNinjaDeps& implicitDeps, const cmNinjaDeps& orderOnlyDeps, const cmNinjaDeps& explicitDeps, const cmNinjaDeps& implicitDeps,
const cmNinjaVars& variables, const std::string& rspfile, int cmdLineLimit, const cmNinjaDeps& orderOnlyDeps, const cmNinjaVars& variables,
bool* usedResponseFile) const std::string& rspfile, int cmdLineLimit, bool* usedResponseFile)
{ {
// Make sure there is a rule. // Make sure there is a rule.
if (rule.empty()) { if (rule.empty()) {
@ -204,6 +204,13 @@ void cmGlobalNinjaGenerator::WriteBuild(
this->CombinedBuildOutputs.insert(EncodePath(*i)); this->CombinedBuildOutputs.insert(EncodePath(*i));
} }
} }
if (!implicitOuts.empty()) {
build += " |";
for (cmNinjaDeps::const_iterator i = implicitOuts.begin();
i != implicitOuts.end(); ++i) {
build += " " + EncodeIdent(EncodePath(*i), os);
}
}
build += ":"; build += ":";
// Write the rule. // Write the rule.
@ -244,7 +251,8 @@ void cmGlobalNinjaGenerator::WritePhonyBuild(
const cmNinjaDeps& explicitDeps, const cmNinjaDeps& implicitDeps, const cmNinjaDeps& explicitDeps, const cmNinjaDeps& implicitDeps,
const cmNinjaDeps& orderOnlyDeps, const cmNinjaVars& variables) const cmNinjaDeps& orderOnlyDeps, const cmNinjaVars& variables)
{ {
this->WriteBuild(os, comment, "phony", outputs, explicitDeps, implicitDeps, this->WriteBuild(os, comment, "phony", outputs,
/*implicitOuts=*/cmNinjaDeps(), explicitDeps, implicitDeps,
orderOnlyDeps, variables); orderOnlyDeps, variables);
} }
@ -288,7 +296,8 @@ void cmGlobalNinjaGenerator::WriteCustomCommandBuild(
vars["depfile"] = depfile; vars["depfile"] = depfile;
} }
this->WriteBuild(*this->BuildFileStream, comment, "CUSTOM_COMMAND", outputs, this->WriteBuild(*this->BuildFileStream, comment, "CUSTOM_COMMAND", outputs,
deps, cmNinjaDeps(), orderOnly, vars); /*implicitOuts=*/cmNinjaDeps(), deps, cmNinjaDeps(),
orderOnly, vars);
if (this->ComputingUnknownDependencies) { if (this->ComputingUnknownDependencies) {
// we need to track every dependency that comes in, since we are trying // we need to track every dependency that comes in, since we are trying
@ -330,7 +339,8 @@ void cmGlobalNinjaGenerator::WriteMacOSXContentBuild(const std::string& input,
cmNinjaVars vars; cmNinjaVars vars;
this->WriteBuild(*this->BuildFileStream, "", "COPY_OSX_CONTENT", outputs, this->WriteBuild(*this->BuildFileStream, "", "COPY_OSX_CONTENT", outputs,
deps, cmNinjaDeps(), cmNinjaDeps(), cmNinjaVars()); /*implicitOuts=*/cmNinjaDeps(), deps, cmNinjaDeps(),
cmNinjaDeps(), cmNinjaVars());
} }
void cmGlobalNinjaGenerator::WriteRule( void cmGlobalNinjaGenerator::WriteRule(
@ -1271,6 +1281,7 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
this->WriteBuild(os, "Re-run CMake if any of its inputs changed.", this->WriteBuild(os, "Re-run CMake if any of its inputs changed.",
"RERUN_CMAKE", "RERUN_CMAKE",
/*outputs=*/cmNinjaDeps(1, ninjaBuildFile), /*outputs=*/cmNinjaDeps(1, ninjaBuildFile),
/*implicitOuts=*/cmNinjaDeps(),
/*explicitDeps=*/cmNinjaDeps(), implicitDeps, /*explicitDeps=*/cmNinjaDeps(), implicitDeps,
/*orderOnlyDeps=*/cmNinjaDeps(), variables); /*orderOnlyDeps=*/cmNinjaDeps(), variables);
@ -1295,6 +1306,13 @@ bool cmGlobalNinjaGenerator::SupportsConsolePool() const
RequiredNinjaVersionForConsolePool().c_str()); RequiredNinjaVersionForConsolePool().c_str());
} }
bool cmGlobalNinjaGenerator::SupportsImplicitOuts() const
{
return !cmSystemTools::VersionCompare(
cmSystemTools::OP_LESS, this->NinjaVersion.c_str(),
this->RequiredNinjaVersionForImplicitOuts().c_str());
}
void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os) void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
{ {
WriteRule(*this->RulesFileStream, "CLEAN", ninjaCmd() + " -t clean", WriteRule(*this->RulesFileStream, "CLEAN", ninjaCmd() + " -t clean",
@ -1308,6 +1326,7 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
/*generator=*/false); /*generator=*/false);
WriteBuild(os, "Clean all the built files.", "CLEAN", WriteBuild(os, "Clean all the built files.", "CLEAN",
/*outputs=*/cmNinjaDeps(1, this->NinjaOutputPath("clean")), /*outputs=*/cmNinjaDeps(1, this->NinjaOutputPath("clean")),
/*implicitOuts=*/cmNinjaDeps(),
/*explicitDeps=*/cmNinjaDeps(), /*explicitDeps=*/cmNinjaDeps(),
/*implicitDeps=*/cmNinjaDeps(), /*implicitDeps=*/cmNinjaDeps(),
/*orderOnlyDeps=*/cmNinjaDeps(), /*orderOnlyDeps=*/cmNinjaDeps(),
@ -1327,6 +1346,7 @@ void cmGlobalNinjaGenerator::WriteTargetHelp(std::ostream& os)
/*generator=*/false); /*generator=*/false);
WriteBuild(os, "Print all primary targets available.", "HELP", WriteBuild(os, "Print all primary targets available.", "HELP",
/*outputs=*/cmNinjaDeps(1, this->NinjaOutputPath("help")), /*outputs=*/cmNinjaDeps(1, this->NinjaOutputPath("help")),
/*implicitOuts=*/cmNinjaDeps(),
/*explicitDeps=*/cmNinjaDeps(), /*explicitDeps=*/cmNinjaDeps(),
/*implicitDeps=*/cmNinjaDeps(), /*implicitDeps=*/cmNinjaDeps(),
/*orderOnlyDeps=*/cmNinjaDeps(), /*orderOnlyDeps=*/cmNinjaDeps(),

View File

@ -106,6 +106,7 @@ public:
*/ */
void WriteBuild(std::ostream& os, const std::string& comment, void WriteBuild(std::ostream& os, const std::string& comment,
const std::string& rule, const cmNinjaDeps& outputs, const std::string& rule, const cmNinjaDeps& outputs,
const cmNinjaDeps& implicitOuts,
const cmNinjaDeps& explicitDeps, const cmNinjaDeps& explicitDeps,
const cmNinjaDeps& implicitDeps, const cmNinjaDeps& implicitDeps,
const cmNinjaDeps& orderOnlyDeps, const cmNinjaDeps& orderOnlyDeps,
@ -338,7 +339,9 @@ public:
// Ninja generator uses 'deps' and 'msvc_deps_prefix' introduced in 1.3 // Ninja generator uses 'deps' and 'msvc_deps_prefix' introduced in 1.3
static std::string RequiredNinjaVersion() { return "1.3"; } static std::string RequiredNinjaVersion() { return "1.3"; }
static std::string RequiredNinjaVersionForConsolePool() { return "1.5"; } static std::string RequiredNinjaVersionForConsolePool() { return "1.5"; }
static std::string RequiredNinjaVersionForImplicitOuts() { return "1.7"; }
bool SupportsConsolePool() const; bool SupportsConsolePool() const;
bool SupportsImplicitOuts() const;
std::string NinjaOutputPath(std::string const& path); std::string NinjaOutputPath(std::string const& path);
bool HasOutputPathPrefix() const { return !this->OutputPathPrefix.empty(); } bool HasOutputPathPrefix() const { return !this->OutputPathPrefix.empty(); }

View File

@ -691,7 +691,8 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
// Write the build statement for this target. // Write the build statement for this target.
bool usedResponseFile = false; bool usedResponseFile = false;
globalGen.WriteBuild(this->GetBuildFileStream(), comment.str(), globalGen.WriteBuild(this->GetBuildFileStream(), comment.str(),
this->LanguageLinkerRule(), outputs, explicitDeps, this->LanguageLinkerRule(), outputs,
/*implicitOuts=*/cmNinjaDeps(), explicitDeps,
implicitDeps, orderOnlyDeps, vars, rspfile, implicitDeps, orderOnlyDeps, vars, rspfile,
commandLineLengthLimit, &usedResponseFile); commandLineLengthLimit, &usedResponseFile);
this->WriteLinkRule(usedResponseFile); this->WriteLinkRule(usedResponseFile);
@ -702,7 +703,8 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
this->GetBuildFileStream(), this->GetBuildFileStream(),
"Create executable symlink " + targetOutput, "Create executable symlink " + targetOutput,
"CMAKE_SYMLINK_EXECUTABLE", cmNinjaDeps(1, targetOutput), "CMAKE_SYMLINK_EXECUTABLE", cmNinjaDeps(1, targetOutput),
cmNinjaDeps(1, targetOutputReal), emptyDeps, emptyDeps, symlinkVars); /*implicitOuts=*/cmNinjaDeps(), cmNinjaDeps(1, targetOutputReal),
emptyDeps, emptyDeps, symlinkVars);
} else { } else {
cmNinjaDeps symlinks; cmNinjaDeps symlinks;
std::string const soName = std::string const soName =
@ -717,7 +719,8 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
symlinks.push_back(targetOutput); symlinks.push_back(targetOutput);
globalGen.WriteBuild( globalGen.WriteBuild(
this->GetBuildFileStream(), "Create library symlink " + targetOutput, this->GetBuildFileStream(), "Create library symlink " + targetOutput,
"CMAKE_SYMLINK_LIBRARY", symlinks, cmNinjaDeps(1, targetOutputReal), "CMAKE_SYMLINK_LIBRARY", symlinks,
/*implicitOuts=*/cmNinjaDeps(), cmNinjaDeps(1, targetOutputReal),
emptyDeps, emptyDeps, symlinkVars); emptyDeps, emptyDeps, symlinkVars);
} }
} }

View File

@ -607,8 +607,9 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
std::string const rspfile = objectFileName + ".rsp"; std::string const rspfile = objectFileName + ".rsp";
this->GetGlobalGenerator()->WriteBuild( this->GetGlobalGenerator()->WriteBuild(
this->GetBuildFileStream(), comment, rule, outputs, explicitDeps, this->GetBuildFileStream(), comment, rule, outputs,
implicitDeps, orderOnlyDeps, vars, rspfile, commandLineLengthLimit); /*implicitOuts=*/cmNinjaDeps(), explicitDeps, implicitDeps, orderOnlyDeps,
vars, rspfile, commandLineLengthLimit);
if (const char* objectOutputs = source->GetProperty("OBJECT_OUTPUTS")) { if (const char* objectOutputs = source->GetProperty("OBJECT_OUTPUTS")) {
std::vector<std::string> outputList; std::vector<std::string> outputList;