diff options
author | Brad King <brad.king@kitware.com> | 2021-12-20 15:03:17 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2021-12-20 17:14:07 (GMT) |
commit | 37af6c33116af75a9538861268edab0ddc202d79 (patch) | |
tree | 8d1ec64b38370df7abf070af5cebb34638cf6ae4 /Source | |
parent | 5134f099a32e2eb0d557ad86dabd8b811709c94d (diff) | |
download | CMake-37af6c33116af75a9538861268edab0ddc202d79.zip CMake-37af6c33116af75a9538861268edab0ddc202d79.tar.gz CMake-37af6c33116af75a9538861268edab0ddc202d79.tar.bz2 |
target_link_libraries: Optionally require only target names
Optionally verify that items in `LINK_LIBRARIES` and
`INTERFACE_LINK_LIBRARIES` that can be target names are actually target
names. Add a `LINK_LIBRARIES_ONLY_TARGETS` target property and
corresponding `CMAKE_LINK_LIBRARIES_ONLY_TARGETS` variable to enable
this new check.
Fixes: #22858
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmGeneratorTarget.cxx | 49 | ||||
-rw-r--r-- | Source/cmGeneratorTarget.h | 1 | ||||
-rw-r--r-- | Source/cmTarget.cxx | 3 |
3 files changed, 53 insertions, 0 deletions
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 0036e69..b651104 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -6247,6 +6247,18 @@ cmComputeLinkInformation* cmGeneratorTarget::GetLinkInformation( void cmGeneratorTarget::CheckLinkLibraries() const { + bool linkLibrariesOnlyTargets = + this->GetPropertyAsBool("LINK_LIBRARIES_ONLY_TARGETS"); + + // Evaluate the link interface of this target if needed for extra checks. + if (linkLibrariesOnlyTargets) { + std::vector<std::string> const& configs = + this->Makefile->GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig); + for (std::string const& config : configs) { + this->GetLinkInterfaceLibraries(config, this, LinkInterfaceFor::Link); + } + } + // Check link the implementation for each generated configuration. for (auto const& hmp : this->LinkImplMap) { HeadToLinkImplementationMap const& hm = hmp.second; @@ -6260,6 +6272,10 @@ void cmGeneratorTarget::CheckLinkLibraries() const if (!this->VerifyLinkItemColons(LinkItemRole::Implementation, item)) { return; } + if (linkLibrariesOnlyTargets && + !this->VerifyLinkItemIsTarget(LinkItemRole::Implementation, item)) { + return; + } } } @@ -6276,6 +6292,10 @@ void cmGeneratorTarget::CheckLinkLibraries() const if (!this->VerifyLinkItemColons(LinkItemRole::Interface, item)) { return; } + if (linkLibrariesOnlyTargets && + !this->VerifyLinkItemIsTarget(LinkItemRole::Interface, item)) { + return; + } } } } @@ -6329,6 +6349,35 @@ bool cmGeneratorTarget::VerifyLinkItemColons(LinkItemRole role, return false; } +bool cmGeneratorTarget::VerifyLinkItemIsTarget(LinkItemRole role, + cmLinkItem const& item) const +{ + if (item.Target) { + return true; + } + std::string const& str = item.AsStr(); + if (!str.empty() && + (str[0] == '-' || str[0] == '$' || str[0] == '`' || + str.find_first_of("/\\") != std::string::npos)) { + return true; + } + + std::string e = cmStrCat("Target \"", this->GetName(), + "\" has LINK_LIBRARIES_ONLY_TARGETS enabled, but ", + role == LinkItemRole::Implementation + ? "it links to" + : "its link interface contains", + ":\n ", item.AsStr(), "\nwhich is not a target. ", + missingTargetPossibleReasons); + cmListFileBacktrace backtrace = item.Backtrace; + if (backtrace.Empty()) { + backtrace = this->GetBacktrace(); + } + this->LocalGenerator->GetCMakeInstance()->IssueMessage( + MessageType::FATAL_ERROR, e, backtrace); + return false; +} + void cmGeneratorTarget::GetTargetVersion(int& major, int& minor) const { int patch; diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index 096e2ea..5f317c4 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -982,6 +982,7 @@ private: Implementation, Interface, }; + bool VerifyLinkItemIsTarget(LinkItemRole role, cmLinkItem const& item) const; bool VerifyLinkItemColons(LinkItemRole role, cmLinkItem const& item) const; // Cache import information from properties for each configuration. diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 38361cc..c03a252 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -471,6 +471,9 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type, initProp(property); } } + if (!this->IsImported()) { + initProp("LINK_LIBRARIES_ONLY_TARGETS"); + } } // Save the backtrace of target construction. |