|
|
@@ -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;
|