diff options
author | Brad King <brad.king@kitware.com> | 2020-10-27 15:24:51 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2020-10-29 13:37:14 (GMT) |
commit | c404f64289bbf93bb7212df913a115e8c0c81e9d (patch) | |
tree | ea27f045a25646e919195b33f66f43b5c052f541 /Source/cmCustomCommandGenerator.cxx | |
parent | 2a640d41998b2b61ed23090cc6edaf6445caf6ed (diff) | |
download | CMake-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.cxx | 26 |
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; +} |