summaryrefslogtreecommitdiffstats
path: root/Source/cmCustomCommandGenerator.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2020-10-27 15:24:51 (GMT)
committerBrad King <brad.king@kitware.com>2020-10-29 13:37:14 (GMT)
commitc404f64289bbf93bb7212df913a115e8c0c81e9d (patch)
treeea27f045a25646e919195b33f66f43b5c052f541 /Source/cmCustomCommandGenerator.cxx
parent2a640d41998b2b61ed23090cc6edaf6445caf6ed (diff)
downloadCMake-c404f64289bbf93bb7212df913a115e8c0c81e9d.zip
CMake-c404f64289bbf93bb7212df913a115e8c0c81e9d.tar.gz
CMake-c404f64289bbf93bb7212df913a115e8c0c81e9d.tar.bz2
cmCustomCommandGenerator: Collect genex target references in commands
These will become target-level dependencies.
Diffstat (limited to 'Source/cmCustomCommandGenerator.cxx')
-rw-r--r--Source/cmCustomCommandGenerator.cxx26
1 files changed, 22 insertions, 4 deletions
diff --git a/Source/cmCustomCommandGenerator.cxx b/Source/cmCustomCommandGenerator.cxx
index 13d2c37..08a0574 100644
--- a/Source/cmCustomCommandGenerator.cxx
+++ b/Source/cmCustomCommandGenerator.cxx
@@ -62,6 +62,10 @@ cmCustomCommandGenerator::cmCustomCommandGenerator(cmCustomCommand const& cc,
for (std::string const& clarg : cmdline) {
std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(clarg);
std::string parsed_arg = cge->Evaluate(this->LG, this->Config);
+ for (cmGeneratorTarget* gt : cge->GetTargets()) {
+ this->Utilities.emplace(BT<std::pair<std::string, bool>>(
+ { gt->GetName(), true }, cge->GetBacktrace()));
+ }
if (this->CC->GetCommandExpandLists()) {
cm::append(argv, cmExpandedList(parsed_arg));
} else {
@@ -69,10 +73,18 @@ cmCustomCommandGenerator::cmCustomCommandGenerator(cmCustomCommand const& cc,
}
}
- // Later code assumes at least one entry exists, but expanding
- // lists on an empty command may have left this empty.
- // FIXME: Should we define behavior for removing empty commands?
- if (argv.empty()) {
+ if (!argv.empty()) {
+ // If the command references an executable target by name,
+ // collect the target to add a target-level dependency on it.
+ cmGeneratorTarget* gt = this->LG->FindGeneratorTargetToUse(argv.front());
+ if (gt && gt->GetType() == cmStateEnums::EXECUTABLE) {
+ this->Utilities.emplace(BT<std::pair<std::string, bool>>(
+ { gt->GetName(), true }, cc.GetBacktrace()));
+ }
+ } else {
+ // Later code assumes at least one entry exists, but expanding
+ // lists on an empty command may have left this empty.
+ // FIXME: Should we define behavior for removing empty commands?
argv.emplace_back();
}
@@ -326,3 +338,9 @@ std::vector<std::string> const& cmCustomCommandGenerator::GetDepends() const
{
return this->Depends;
}
+
+std::set<BT<std::pair<std::string, bool>>> const&
+cmCustomCommandGenerator::GetUtilities() const
+{
+ return this->Utilities;
+}