Commit 7b64b0cd authored by Brad King's avatar Brad King
Browse files

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.
parent d29da8ed
......@@ -3079,8 +3079,8 @@ void cmTargetTraceDependencies::CheckCustomCommand(cmCustomCommand const& cc)
std::set<std::string> depends;
for (std::string const& config :
this->Makefile->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig)) {
cmCustomCommandGenerator ccg(cc, config, this->LocalGenerator);
for (cmCustomCommandGenerator const& ccg :
this->LocalGenerator->MakeCustomCommandGenerators(cc, config)) {
// Collect target-level dependencies referenced in command lines.
for (auto const& util : ccg.GetUtilities()) {
this->GeneratorTarget->Target->AddUtility(util);
......@@ -3089,6 +3089,7 @@ void cmTargetTraceDependencies::CheckCustomCommand(cmCustomCommand const& cc)
// Collect file-level dependencies referenced in DEPENDS.
depends.insert(ccg.GetDepends().begin(), ccg.GetDepends().end());
}
}
// Queue file-level dependencies.
for (std::string const& dep : depends) {
......
......@@ -4232,6 +4232,15 @@ cmSourceFile* cmLocalGenerator::GetSourceFileWithOutput(
return nullptr;
}
std::vector<cmCustomCommandGenerator>
cmLocalGenerator::MakeCustomCommandGenerators(cmCustomCommand const& cc,
std::string const& config)
{
std::vector<cmCustomCommandGenerator> ccgs;
ccgs.emplace_back(cc, config, this);
return ccgs;
}
std::vector<std::string> cmLocalGenerator::ExpandCustomCommandOutputPaths(
cmCompiledGeneratorExpression const& cge, std::string const& config)
{
......
......@@ -24,6 +24,7 @@
class cmCompiledGeneratorExpression;
class cmComputeLinkInformation;
class cmCustomCommand;
class cmCustomCommandGenerator;
class cmCustomCommandLines;
class cmGeneratorTarget;
......@@ -363,6 +364,9 @@ public:
bool command_expand_lists = false, const std::string& job_pool = "",
bool stdPipesUTF8 = false);
virtual std::vector<cmCustomCommandGenerator> MakeCustomCommandGenerators(
cmCustomCommand const& cc, std::string const& config);
std::vector<std::string> ExpandCustomCommandOutputPaths(
cmCompiledGeneratorExpression const& cge, std::string const& config);
std::vector<std::string> ExpandCustomCommandOutputGenex(
......
......@@ -575,20 +575,8 @@ 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;
}
cmCustomCommandGenerator ccg(*cc, config, this, transformDepfile);
for (cmCustomCommandGenerator const& ccg :
this->MakeCustomCommandGenerators(*cc, config)) {
const std::vector<std::string>& outputs = ccg.GetOutputs();
const std::vector<std::string>& byproducts = ccg.GetByproducts();
......@@ -607,7 +595,8 @@ void cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
std::transform(outputs.begin(), outputs.end(), ninjaOutputs.begin(),
gg->MapToNinjaPath());
std::transform(byproducts.begin(), byproducts.end(),
ninjaOutputs.begin() + outputs.size(), gg->MapToNinjaPath());
ninjaOutputs.begin() + outputs.size(),
gg->MapToNinjaPath());
for (std::string const& ninjaOutput : ninjaOutputs) {
gg->SeenCustomCommandOutput(ninjaOutput);
......@@ -635,7 +624,7 @@ void cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
std::string depfile = cc->GetDepfile();
if (!depfile.empty()) {
switch (cmp0116) {
switch (this->GetPolicyStatus(cmPolicies::CMP0116)) {
case cmPolicies::WARN:
if (this->GetCurrentBinaryDirectory() !=
this->GetBinaryDirectory() ||
......@@ -666,6 +655,28 @@ void cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
/*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,
......
......@@ -70,6 +70,9 @@ public:
const std::string& fileConfig,
cmNinjaTargetDepends depends);
std::vector<cmCustomCommandGenerator> MakeCustomCommandGenerators(
cmCustomCommand const& cc, std::string const& config) override;
void AddCustomCommandTarget(cmCustomCommand const* cc,
cmGeneratorTarget* target);
void AppendCustomCommandLines(cmCustomCommandGenerator const& ccg,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment