summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2020-10-27 11:24:51 -0400
committerBrad King <brad.king@kitware.com>2020-10-29 09:37:14 -0400
commitc404f64289bbf93bb7212df913a115e8c0c81e9d (patch)
treeea27f045a25646e919195b33f66f43b5c052f541 /Source
parent2a640d41998b2b61ed23090cc6edaf6445caf6ed (diff)
downloadcmake-c404f64289bbf93bb7212df913a115e8c0c81e9d.tar.gz
cmCustomCommandGenerator: Collect genex target references in commands
These will become target-level dependencies.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmCustomCommandGenerator.cxx26
-rw-r--r--Source/cmCustomCommandGenerator.h5
2 files changed, 27 insertions, 4 deletions
diff --git a/Source/cmCustomCommandGenerator.cxx b/Source/cmCustomCommandGenerator.cxx
index 13d2c37cf6..08a0574243 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;
+}
diff --git a/Source/cmCustomCommandGenerator.h b/Source/cmCustomCommandGenerator.h
index c783b65f4d..cb0d7df831 100644
--- a/Source/cmCustomCommandGenerator.h
+++ b/Source/cmCustomCommandGenerator.h
@@ -4,10 +4,13 @@
#include "cmConfigure.h" // IWYU pragma: keep
+#include <set>
#include <string>
+#include <utility>
#include <vector>
#include "cmCustomCommandLines.h"
+#include "cmListFileCache.h"
class cmCustomCommand;
class cmLocalGenerator;
@@ -24,6 +27,7 @@ class cmCustomCommandGenerator
std::vector<std::string> Byproducts;
std::vector<std::string> Depends;
std::string WorkingDirectory;
+ std::set<BT<std::pair<std::string, bool>>> Utilities;
void FillEmulatorsWithArguments();
std::vector<std::string> GetCrossCompilingEmulator(unsigned int c) const;
@@ -46,6 +50,7 @@ public:
std::vector<std::string> const& GetOutputs() const;
std::vector<std::string> const& GetByproducts() const;
std::vector<std::string> const& GetDepends() const;
+ std::set<BT<std::pair<std::string, bool>>> const& GetUtilities() const;
bool HasOnlyEmptyCommandLines() const;
std::string GetFullDepfile() const;
std::string GetInternalDepfile() const;