summaryrefslogtreecommitdiff
path: root/Source/cmLocalNinjaGenerator.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2020-10-22 13:57:54 -0400
committerBrad King <brad.king@kitware.com>2020-12-15 07:00:52 -0500
commit7b64b0cd5a4046bf8743c3e2d3c57cb470bfa95f (patch)
treee054475a078a46be0c4c76e01c83409db0034481 /Source/cmLocalNinjaGenerator.cxx
parentd29da8ed3eb757d10643039aa738bad0727c1b6a (diff)
downloadcmake-7b64b0cd5a4046bf8743c3e2d3c57cb470bfa95f.tar.gz
cmLocalGenerator: Refactor custom command generator construction
Add support for constructing and using multiple generators for one custom command. cmGeneratorTarget contains a code path that needs this behavior when used with Ninja but not other generators, so use virtual dispatch through cmLocalGenerator.
Diffstat (limited to 'Source/cmLocalNinjaGenerator.cxx')
-rw-r--r--Source/cmLocalNinjaGenerator.cxx167
1 files changed, 89 insertions, 78 deletions
diff --git a/Source/cmLocalNinjaGenerator.cxx b/Source/cmLocalNinjaGenerator.cxx
index d90a37bde3..a36c4791ff 100644
--- a/Source/cmLocalNinjaGenerator.cxx
+++ b/Source/cmLocalNinjaGenerator.cxx
@@ -575,97 +575,108 @@ void cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
return;
}
- bool transformDepfile = false;
- auto cmp0116 = this->GetPolicyStatus(cmPolicies::CMP0116);
- switch (cmp0116) {
- case cmPolicies::OLD:
- case cmPolicies::WARN:
- break;
- case cmPolicies::REQUIRED_IF_USED:
- case cmPolicies::REQUIRED_ALWAYS:
- case cmPolicies::NEW:
- transformDepfile = true;
- break;
- }
+ for (cmCustomCommandGenerator const& ccg :
+ this->MakeCustomCommandGenerators(*cc, config)) {
- cmCustomCommandGenerator ccg(*cc, config, this, transformDepfile);
+ const std::vector<std::string>& outputs = ccg.GetOutputs();
+ const std::vector<std::string>& byproducts = ccg.GetByproducts();
- const std::vector<std::string>& outputs = ccg.GetOutputs();
- const std::vector<std::string>& byproducts = ccg.GetByproducts();
-
- bool symbolic = false;
- for (std::string const& output : outputs) {
- if (cmSourceFile* sf = this->Makefile->GetSource(output)) {
- if (sf->GetPropertyAsBool("SYMBOLIC")) {
- symbolic = true;
- break;
+ bool symbolic = false;
+ for (std::string const& output : outputs) {
+ if (cmSourceFile* sf = this->Makefile->GetSource(output)) {
+ if (sf->GetPropertyAsBool("SYMBOLIC")) {
+ symbolic = true;
+ break;
+ }
}
}
- }
- cmNinjaDeps ninjaOutputs(outputs.size() + byproducts.size());
- std::transform(outputs.begin(), outputs.end(), ninjaOutputs.begin(),
- gg->MapToNinjaPath());
- std::transform(byproducts.begin(), byproducts.end(),
- ninjaOutputs.begin() + outputs.size(), gg->MapToNinjaPath());
+ cmNinjaDeps ninjaOutputs(outputs.size() + byproducts.size());
+ std::transform(outputs.begin(), outputs.end(), ninjaOutputs.begin(),
+ gg->MapToNinjaPath());
+ std::transform(byproducts.begin(), byproducts.end(),
+ ninjaOutputs.begin() + outputs.size(),
+ gg->MapToNinjaPath());
- for (std::string const& ninjaOutput : ninjaOutputs) {
- gg->SeenCustomCommandOutput(ninjaOutput);
- }
+ for (std::string const& ninjaOutput : ninjaOutputs) {
+ gg->SeenCustomCommandOutput(ninjaOutput);
+ }
- cmNinjaDeps ninjaDeps;
- this->AppendCustomCommandDeps(ccg, ninjaDeps, config);
+ cmNinjaDeps ninjaDeps;
+ this->AppendCustomCommandDeps(ccg, ninjaDeps, config);
- std::vector<std::string> cmdLines;
- this->AppendCustomCommandLines(ccg, cmdLines);
+ std::vector<std::string> cmdLines;
+ this->AppendCustomCommandLines(ccg, cmdLines);
- if (cmdLines.empty()) {
- cmNinjaBuild build("phony");
- build.Comment = "Phony custom command for " + ninjaOutputs[0];
- build.Outputs = std::move(ninjaOutputs);
- build.ExplicitDeps = std::move(ninjaDeps);
- build.OrderOnlyDeps = orderOnlyDeps;
- gg->WriteBuild(this->GetImplFileStream(config), build);
- } else {
- std::string customStep = cmSystemTools::GetFilenameName(ninjaOutputs[0]);
- // Hash full path to make unique.
- customStep += '-';
- cmCryptoHash hash(cmCryptoHash::AlgoSHA256);
- customStep += hash.HashString(ninjaOutputs[0]).substr(0, 7);
-
- std::string depfile = cc->GetDepfile();
- if (!depfile.empty()) {
- switch (cmp0116) {
- case cmPolicies::WARN:
- if (this->GetCurrentBinaryDirectory() !=
- this->GetBinaryDirectory() ||
- this->Makefile->PolicyOptionalWarningEnabled(
- "CMAKE_POLICY_WARNING_CMP0116")) {
- this->GetCMakeInstance()->IssueMessage(
- MessageType::AUTHOR_WARNING,
- cmPolicies::GetPolicyWarning(cmPolicies::CMP0116),
- cc->GetBacktrace());
- }
- CM_FALLTHROUGH;
- case cmPolicies::OLD:
- break;
- case cmPolicies::REQUIRED_IF_USED:
- case cmPolicies::REQUIRED_ALWAYS:
- case cmPolicies::NEW:
- cmSystemTools::MakeDirectory(
- cmStrCat(this->GetBinaryDirectory(), "/CMakeFiles/d"));
- depfile = ccg.GetInternalDepfile();
- break;
+ if (cmdLines.empty()) {
+ cmNinjaBuild build("phony");
+ build.Comment = "Phony custom command for " + ninjaOutputs[0];
+ build.Outputs = std::move(ninjaOutputs);
+ build.ExplicitDeps = std::move(ninjaDeps);
+ build.OrderOnlyDeps = orderOnlyDeps;
+ gg->WriteBuild(this->GetImplFileStream(config), build);
+ } else {
+ std::string customStep = cmSystemTools::GetFilenameName(ninjaOutputs[0]);
+ // Hash full path to make unique.
+ customStep += '-';
+ cmCryptoHash hash(cmCryptoHash::AlgoSHA256);
+ customStep += hash.HashString(ninjaOutputs[0]).substr(0, 7);
+
+ std::string depfile = cc->GetDepfile();
+ if (!depfile.empty()) {
+ switch (this->GetPolicyStatus(cmPolicies::CMP0116)) {
+ case cmPolicies::WARN:
+ if (this->GetCurrentBinaryDirectory() !=
+ this->GetBinaryDirectory() ||
+ this->Makefile->PolicyOptionalWarningEnabled(
+ "CMAKE_POLICY_WARNING_CMP0116")) {
+ this->GetCMakeInstance()->IssueMessage(
+ MessageType::AUTHOR_WARNING,
+ cmPolicies::GetPolicyWarning(cmPolicies::CMP0116),
+ cc->GetBacktrace());
+ }
+ CM_FALLTHROUGH;
+ case cmPolicies::OLD:
+ break;
+ case cmPolicies::REQUIRED_IF_USED:
+ case cmPolicies::REQUIRED_ALWAYS:
+ case cmPolicies::NEW:
+ cmSystemTools::MakeDirectory(
+ cmStrCat(this->GetBinaryDirectory(), "/CMakeFiles/d"));
+ depfile = ccg.GetInternalDepfile();
+ break;
+ }
}
+
+ gg->WriteCustomCommandBuild(
+ this->BuildCommandLine(cmdLines, customStep),
+ this->ConstructComment(ccg), "Custom command for " + ninjaOutputs[0],
+ depfile, cc->GetJobPool(), cc->GetUsesTerminal(),
+ /*restat*/ !symbolic || !byproducts.empty(), ninjaOutputs, config,
+ ninjaDeps, orderOnlyDeps);
}
+ }
+}
- gg->WriteCustomCommandBuild(
- this->BuildCommandLine(cmdLines, customStep),
- this->ConstructComment(ccg), "Custom command for " + ninjaOutputs[0],
- depfile, cc->GetJobPool(), cc->GetUsesTerminal(),
- /*restat*/ !symbolic || !byproducts.empty(), ninjaOutputs, config,
- ninjaDeps, orderOnlyDeps);
+std::vector<cmCustomCommandGenerator>
+cmLocalNinjaGenerator::MakeCustomCommandGenerators(cmCustomCommand const& cc,
+ std::string const& config)
+{
+ bool transformDepfile = false;
+ switch (this->GetPolicyStatus(cmPolicies::CMP0116)) {
+ case cmPolicies::OLD:
+ case cmPolicies::WARN:
+ break;
+ case cmPolicies::REQUIRED_IF_USED:
+ case cmPolicies::REQUIRED_ALWAYS:
+ case cmPolicies::NEW:
+ transformDepfile = true;
+ break;
}
+
+ std::vector<cmCustomCommandGenerator> ccgs;
+ ccgs.emplace_back(cc, config, this, transformDepfile);
+ return ccgs;
}
void cmLocalNinjaGenerator::AddCustomCommandTarget(cmCustomCommand const* cc,