From 0dcbf4ab588fc80a8b51d91de5c5518b13224c76 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 15 Dec 2021 16:26:55 -0500 Subject: cmGeneratorTarget: Record when imported target link iface libs are done `GetImportLinkInterface` populates the link interface from properties of imported targets. Make it more closely match the link interface of in-project targets by recording the `LibrariesDone` field. --- Source/cmGeneratorTarget.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 1493f24..cdaf44c 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -7284,6 +7284,7 @@ const cmLinkInterface* cmGeneratorTarget::GetImportLinkInterface( cmOptionalLinkInterface& iface = hm[headTarget]; if (!iface.AllDone) { iface.AllDone = true; + iface.LibrariesDone = true; iface.Multiplicity = info->Multiplicity; cmExpandList(info->Languages, iface.Languages); this->ExpandLinkItems(info->LibrariesProp, cmMakeRange(info->Libraries), -- cgit v0.12 From a97c92e46eff516eb4642776dcf85bd646e63763 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 16 Dec 2021 12:19:25 -0500 Subject: CMP0028: Report backtrace to link item rather than target creation Now that we have proper backtraces for both `LINK_LIBRARIES` and `INTERFACE_LINK_LIBRARIES` entries, we can report them in error messages. --- Source/cmGeneratorTarget.cxx | 6 +++++- Tests/RunCMake/CMP0028/CMP0028-NEW-iface-stderr.txt | 4 ++-- Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt | 4 ++-- Tests/RunCMake/CMP0028/CMP0028-WARN-iface-stderr.txt | 4 ++-- Tests/RunCMake/CMP0028/CMP0028-WARN-stderr.txt | 4 ++-- .../target_link_libraries/CMP0079-link-NEW-bogus-stderr.txt | 2 +- Tests/RunCMake/target_link_libraries/ConfigCase-stderr.txt | 8 ++++---- 7 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index cdaf44c..0e17839 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -2722,8 +2722,12 @@ public: << "\" but the target was not found. Perhaps a find_package() " "call is missing for an IMPORTED target, or an ALIAS target is " "missing?"; + cmListFileBacktrace backtrace = item.Backtrace; + if (backtrace.Empty()) { + backtrace = this->Target->GetBacktrace(); + } this->Target->GetLocalGenerator()->GetCMakeInstance()->IssueMessage( - messageType, e.str(), this->Target->GetBacktrace()); + messageType, e.str(), backtrace); } } return; diff --git a/Tests/RunCMake/CMP0028/CMP0028-NEW-iface-stderr.txt b/Tests/RunCMake/CMP0028/CMP0028-NEW-iface-stderr.txt index e2108f4..2f264a1 100644 --- a/Tests/RunCMake/CMP0028/CMP0028-NEW-iface-stderr.txt +++ b/Tests/RunCMake/CMP0028/CMP0028-NEW-iface-stderr.txt @@ -1,6 +1,6 @@ -CMake Error at CMP0028-NEW-iface.cmake:6 \(add_library\): +CMake Error at CMP0028-NEW-iface\.cmake:5 \(target_link_libraries\): Target "foo" links to target "External::Library" but the target was not found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or an ALIAS target is missing\? Call Stack \(most recent call first\): - CMakeLists.txt:3 \(include\) + CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt b/Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt index 711ad0e..7abf318 100644 --- a/Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt +++ b/Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt @@ -1,6 +1,6 @@ -CMake Error at CMP0028-NEW.cmake:4 \(add_library\): +CMake Error at CMP0028-NEW\.cmake:5 \(target_link_libraries\): Target "foo" links to target "External::Library" but the target was not found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or an ALIAS target is missing\? Call Stack \(most recent call first\): - CMakeLists.txt:3 \(include\) + CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/CMP0028/CMP0028-WARN-iface-stderr.txt b/Tests/RunCMake/CMP0028/CMP0028-WARN-iface-stderr.txt index 0c5c653..e865d48 100644 --- a/Tests/RunCMake/CMP0028/CMP0028-WARN-iface-stderr.txt +++ b/Tests/RunCMake/CMP0028/CMP0028-WARN-iface-stderr.txt @@ -1,4 +1,4 @@ -CMake Warning \(dev\) at CMP0028-WARN-iface.cmake:4 \(add_library\): +CMake Warning \(dev\) at CMP0028-WARN-iface\.cmake:3 \(target_link_libraries\): Policy CMP0028 is not set: Double colon in target name means ALIAS or IMPORTED target. Run "cmake --help-policy CMP0028" for policy details. Use the cmake_policy command to set the policy and suppress this warning. @@ -7,5 +7,5 @@ CMake Warning \(dev\) at CMP0028-WARN-iface.cmake:4 \(add_library\): found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or an ALIAS target is missing\? Call Stack \(most recent call first\): - CMakeLists.txt:3 \(include\) + CMakeLists\.txt:[0-9]+ \(include\) This warning is for project developers. Use -Wno-dev to suppress it. diff --git a/Tests/RunCMake/CMP0028/CMP0028-WARN-stderr.txt b/Tests/RunCMake/CMP0028/CMP0028-WARN-stderr.txt index 41d7560..533cba3 100644 --- a/Tests/RunCMake/CMP0028/CMP0028-WARN-stderr.txt +++ b/Tests/RunCMake/CMP0028/CMP0028-WARN-stderr.txt @@ -1,4 +1,4 @@ -CMake Warning \(dev\) at CMP0028-WARN.cmake:2 \(add_library\): +CMake Warning \(dev\) at CMP0028-WARN\.cmake:3 \(target_link_libraries\): Policy CMP0028 is not set: Double colon in target name means ALIAS or IMPORTED target. Run "cmake --help-policy CMP0028" for policy details. Use the cmake_policy command to set the policy and suppress this warning. @@ -7,5 +7,5 @@ CMake Warning \(dev\) at CMP0028-WARN.cmake:2 \(add_library\): found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or an ALIAS target is missing\? Call Stack \(most recent call first\): - CMakeLists.txt:3 \(include\) + CMakeLists\.txt:[0-9]+ \(include\) This warning is for project developers. Use -Wno-dev to suppress it. diff --git a/Tests/RunCMake/target_link_libraries/CMP0079-link-NEW-bogus-stderr.txt b/Tests/RunCMake/target_link_libraries/CMP0079-link-NEW-bogus-stderr.txt index 9e38bec..644674f 100644 --- a/Tests/RunCMake/target_link_libraries/CMP0079-link-NEW-bogus-stderr.txt +++ b/Tests/RunCMake/target_link_libraries/CMP0079-link-NEW-bogus-stderr.txt @@ -1,4 +1,4 @@ -^CMake Error at CMP0079-link-NEW-bogus.cmake:[0-9]+ \(add_executable\): +^CMake Error at CMP0079-link-NEW-bogus\.cmake:6 \(set_property\): Target "top" links to target "::@\(0xdeadbeef\)" but the target was not found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or an ALIAS target is missing\? diff --git a/Tests/RunCMake/target_link_libraries/ConfigCase-stderr.txt b/Tests/RunCMake/target_link_libraries/ConfigCase-stderr.txt index 953c972..ea078b5 100644 --- a/Tests/RunCMake/target_link_libraries/ConfigCase-stderr.txt +++ b/Tests/RunCMake/target_link_libraries/ConfigCase-stderr.txt @@ -1,13 +1,13 @@ -^CMake Error at ConfigCase.cmake:[0-9]+ \(add_library\): +^CMake Error at ConfigCase\.cmake:6 \(target_link_libraries\): Target "impl" links to target "config::impl-Debug" but the target was not found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or an ALIAS target is missing\? Call Stack \(most recent call first\): - CMakeLists.txt:[0-9]+ \(include\) + CMakeLists\.txt:[0-9]+ \(include\) + -CMake Error at ConfigCase.cmake:[0-9]+ \(add_library\): +CMake Error at ConfigCase\.cmake:4 \(target_link_libraries\): Target "impl" links to target "config::iface-Debug" but the target was not found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or an ALIAS target is missing\? Call Stack \(most recent call first\): - CMakeLists.txt:[0-9]+ \(include\) + CMakeLists\.txt:[0-9]+ \(include\) -- cgit v0.12 From ea050286e7f4b659518bf5b6c4adbddefa3cc9a6 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 16 Dec 2021 12:42:29 -0500 Subject: CMP0028: Report the target whose link interface has an offending item Previously items linked via the link interface of a dependency were reported in CMP0028 messages as if directly linked by a target. Clarify the messages to indicate that an offending item is actually in the link interface of a given target, regardless of its consumer. Move the check to the end of generation and look through the final set of link implementations and link interfaces that were used for generation. This avoids repeating messages on link interfaces that have multiple consumers. --- Source/cmGeneratorTarget.cxx | 114 ++++++++++++++------- Source/cmGeneratorTarget.h | 11 ++ Source/cmGlobalGenerator.cxx | 15 +++ Source/cmGlobalGenerator.h | 1 + Source/cmLocalGenerator.h | 5 + .../RunCMake/CMP0028/CMP0028-NEW-iface-stderr.txt | 12 ++- Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt | 12 ++- .../RunCMake/CMP0028/CMP0028-WARN-iface-stderr.txt | 12 ++- Tests/RunCMake/CMP0028/CMP0028-WARN-stderr.txt | 12 ++- .../CMP0079-link-NEW-bogus-stderr.txt | 12 ++- .../target_link_libraries/ConfigCase-stderr.txt | 28 +++-- 11 files changed, 175 insertions(+), 59 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 0e17839..e370472 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -2687,7 +2687,6 @@ public: : Config(std::move(config)) , Languages(languages) , HeadTarget(head) - , Target(target) , SecondPass(secondPass) { this->Visited.insert(target); @@ -2696,40 +2695,6 @@ public: void Visit(cmLinkItem const& item) { if (!item.Target) { - if (item.AsStr().find("::") != std::string::npos) { - bool noMessage = false; - MessageType messageType = MessageType::FATAL_ERROR; - std::ostringstream e; - switch (this->Target->GetLocalGenerator()->GetPolicyStatus( - cmPolicies::CMP0028)) { - case cmPolicies::WARN: { - e << cmPolicies::GetPolicyWarning(cmPolicies::CMP0028) << "\n"; - messageType = MessageType::AUTHOR_WARNING; - } break; - case cmPolicies::OLD: - noMessage = true; - break; - case cmPolicies::REQUIRED_IF_USED: - case cmPolicies::REQUIRED_ALWAYS: - case cmPolicies::NEW: - // Issue the fatal message. - break; - } - - if (!noMessage) { - e << "Target \"" << this->Target->GetName() - << "\" links to target \"" << item.AsStr() - << "\" but the target was not found. Perhaps a find_package() " - "call is missing for an IMPORTED target, or an ALIAS target is " - "missing?"; - cmListFileBacktrace backtrace = item.Backtrace; - if (backtrace.Empty()) { - backtrace = this->Target->GetBacktrace(); - } - this->Target->GetLocalGenerator()->GetCMakeInstance()->IssueMessage( - messageType, e.str(), backtrace); - } - } return; } if (!this->Visited.insert(item.Target).second) { @@ -2762,7 +2727,6 @@ private: std::string Config; std::unordered_set& Languages; cmGeneratorTarget const* HeadTarget; - const cmGeneratorTarget* Target; std::set Visited; bool SecondPass; bool HadLinkLanguageSensitiveCondition = false; @@ -6281,6 +6245,84 @@ cmComputeLinkInformation* cmGeneratorTarget::GetLinkInformation( return i->second.get(); } +void cmGeneratorTarget::CheckLinkLibraries() const +{ + // Check link the implementation for each generated configuration. + for (auto const& hmp : this->LinkImplMap) { + HeadToLinkImplementationMap const& hm = hmp.second; + // There could be several entries used when computing the pre-CMP0022 + // default link interface. Check only the entry for our own link impl. + auto const hmi = hm.find(this); + if (hmi == hm.end() || !hmi->second.LibrariesDone) { + continue; + } + for (cmLinkImplItem const& item : hmi->second.Libraries) { + if (!this->VerifyLinkItemColons(LinkItemRole::Implementation, item)) { + return; + } + } + } + + // Check link the interface for each generated combination of + // configuration and consuming head target. We should not need to + // consider LinkInterfaceUsageRequirementsOnlyMap because its entries + // should be a subset of LinkInterfaceMap (with LINK_ONLY left out). + for (auto const& hmp : this->LinkInterfaceMap) { + for (auto const& hmi : hmp.second) { + if (!hmi.second.LibrariesDone) { + continue; + } + for (cmLinkItem const& item : hmi.second.Libraries) { + if (!this->VerifyLinkItemColons(LinkItemRole::Interface, item)) { + return; + } + } + } + } +} + +bool cmGeneratorTarget::VerifyLinkItemColons(LinkItemRole role, + cmLinkItem const& item) const +{ + if (item.Target || item.AsStr().find("::") == std::string::npos) { + return true; + } + MessageType messageType = MessageType::FATAL_ERROR; + std::string e; + switch (this->GetLocalGenerator()->GetPolicyStatus(cmPolicies::CMP0028)) { + case cmPolicies::WARN: { + e = cmStrCat(cmPolicies::GetPolicyWarning(cmPolicies::CMP0028), "\n"); + messageType = MessageType::AUTHOR_WARNING; + } break; + case cmPolicies::OLD: + return true; + case cmPolicies::REQUIRED_IF_USED: + case cmPolicies::REQUIRED_ALWAYS: + case cmPolicies::NEW: + // Issue the fatal message. + break; + } + + if (role == LinkItemRole::Implementation) { + e = cmStrCat(e, "Target \"", this->GetName(), "\" links to"); + } else { + e = cmStrCat(e, "The link interface of target \"", this->GetName(), + "\" contains"); + } + e = cmStrCat(e, ":\n ", item.AsStr(), "\n", + "but the target was not found. Possible reasons include:\n" + " * There is a typo in the target name.\n" + " * A find_package call is missing for an IMPORTED target.\n" + " * An ALIAS target is missing.\n"); + cmListFileBacktrace backtrace = item.Backtrace; + if (backtrace.Empty()) { + backtrace = this->GetBacktrace(); + } + this->GetLocalGenerator()->GetCMakeInstance()->IssueMessage(messageType, 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 110af43..096e2ea 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -84,6 +84,10 @@ public: cmComputeLinkInformation* GetLinkInformation( const std::string& config) const; + // Perform validation checks on memoized link structures. + // Call this after generation is complete. + void CheckLinkLibraries() const; + cmStateEnums::TargetType GetType() const; const std::string& GetName() const; std::string GetExportName() const; @@ -973,6 +977,13 @@ private: cmLinkImplementation const* GetLinkImplementation(const std::string& config, bool secondPass) const; + enum class LinkItemRole + { + Implementation, + Interface, + }; + bool VerifyLinkItemColons(LinkItemRole role, cmLinkItem const& item) const; + // Cache import information from properties for each configuration. struct ImportInfo { diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 0a2e7b5..6433681 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -328,6 +328,18 @@ bool cmGlobalGenerator::CheckTargetsForMissingSources() const return failed; } +void cmGlobalGenerator::CheckTargetLinkLibraries() const +{ + for (const auto& generator : this->LocalGenerators) { + for (const auto& gt : generator->GetGeneratorTargets()) { + gt->CheckLinkLibraries(); + } + for (const auto& gt : generator->GetOwnedImportedGeneratorTargets()) { + gt->CheckLinkLibraries(); + } + } +} + bool cmGlobalGenerator::CheckTargetsForType() const { if (!this->GetLanguageEnabled("Swift")) { @@ -1606,6 +1618,9 @@ void cmGlobalGenerator::Generate() this->ExtraGenerator->Generate(); } + // Perform validation checks on memoized link structures. + this->CheckTargetLinkLibraries(); + if (!this->CMP0042WarnTargets.empty()) { std::ostringstream w; w << cmPolicies::GetPolicyWarning(cmPolicies::CMP0042) << "\n"; diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index 96696aa..2406798 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -684,6 +684,7 @@ private: virtual void ForceLinkerLanguages(); + void CheckTargetLinkLibraries() const; bool CheckTargetsForMissingSources() const; bool CheckTargetsForType() const; bool CheckTargetsForPchCompilePdb() const; diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index c73cd62..115a54a 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -193,6 +193,11 @@ public: return this->GeneratorTargets; } + const GeneratorTargetVector& GetOwnedImportedGeneratorTargets() const + { + return this->OwnedImportedGeneratorTargets; + } + void AddGeneratorTarget(std::unique_ptr gt); void AddImportedGeneratorTarget(cmGeneratorTarget* gt); void AddOwnedImportedGeneratorTarget(std::unique_ptr gt); diff --git a/Tests/RunCMake/CMP0028/CMP0028-NEW-iface-stderr.txt b/Tests/RunCMake/CMP0028/CMP0028-NEW-iface-stderr.txt index 2f264a1..111d1f0 100644 --- a/Tests/RunCMake/CMP0028/CMP0028-NEW-iface-stderr.txt +++ b/Tests/RunCMake/CMP0028/CMP0028-NEW-iface-stderr.txt @@ -1,6 +1,12 @@ CMake Error at CMP0028-NEW-iface\.cmake:5 \(target_link_libraries\): - Target "foo" links to target "External::Library" but the target was not - found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or - an ALIAS target is missing\? + The link interface of target "iface" contains: + + External::Library + + but the target was not found. Possible reasons include: +( + \*[^ +]+)* + Call Stack \(most recent call first\): CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt b/Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt index 7abf318..17b25de 100644 --- a/Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt +++ b/Tests/RunCMake/CMP0028/CMP0028-NEW-stderr.txt @@ -1,6 +1,12 @@ CMake Error at CMP0028-NEW\.cmake:5 \(target_link_libraries\): - Target "foo" links to target "External::Library" but the target was not - found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or - an ALIAS target is missing\? + Target "foo" links to: + + External::Library + + but the target was not found. Possible reasons include: +( + \*[^ +]+)* + Call Stack \(most recent call first\): CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/CMP0028/CMP0028-WARN-iface-stderr.txt b/Tests/RunCMake/CMP0028/CMP0028-WARN-iface-stderr.txt index e865d48..bb6a16e 100644 --- a/Tests/RunCMake/CMP0028/CMP0028-WARN-iface-stderr.txt +++ b/Tests/RunCMake/CMP0028/CMP0028-WARN-iface-stderr.txt @@ -3,9 +3,15 @@ CMake Warning \(dev\) at CMP0028-WARN-iface\.cmake:3 \(target_link_libraries\): IMPORTED target. Run "cmake --help-policy CMP0028" for policy details. Use the cmake_policy command to set the policy and suppress this warning. - Target "foo" links to target "External::Library" but the target was not - found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or - an ALIAS target is missing\? + The link interface of target "iface" contains: + + External::Library + + but the target was not found. Possible reasons include: +( + \*[^ +]+)* + Call Stack \(most recent call first\): CMakeLists\.txt:[0-9]+ \(include\) This warning is for project developers. Use -Wno-dev to suppress it. diff --git a/Tests/RunCMake/CMP0028/CMP0028-WARN-stderr.txt b/Tests/RunCMake/CMP0028/CMP0028-WARN-stderr.txt index 533cba3..c0cb5b0 100644 --- a/Tests/RunCMake/CMP0028/CMP0028-WARN-stderr.txt +++ b/Tests/RunCMake/CMP0028/CMP0028-WARN-stderr.txt @@ -3,9 +3,15 @@ CMake Warning \(dev\) at CMP0028-WARN\.cmake:3 \(target_link_libraries\): IMPORTED target. Run "cmake --help-policy CMP0028" for policy details. Use the cmake_policy command to set the policy and suppress this warning. - Target "foo" links to target "External::Library" but the target was not - found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or - an ALIAS target is missing\? + Target "foo" links to: + + External::Library + + but the target was not found. Possible reasons include: +( + \*[^ +]+)* + Call Stack \(most recent call first\): CMakeLists\.txt:[0-9]+ \(include\) This warning is for project developers. Use -Wno-dev to suppress it. diff --git a/Tests/RunCMake/target_link_libraries/CMP0079-link-NEW-bogus-stderr.txt b/Tests/RunCMake/target_link_libraries/CMP0079-link-NEW-bogus-stderr.txt index 644674f..488ae8d 100644 --- a/Tests/RunCMake/target_link_libraries/CMP0079-link-NEW-bogus-stderr.txt +++ b/Tests/RunCMake/target_link_libraries/CMP0079-link-NEW-bogus-stderr.txt @@ -1,6 +1,12 @@ ^CMake Error at CMP0079-link-NEW-bogus\.cmake:6 \(set_property\): - Target "top" links to target "::@\(0xdeadbeef\)" but the target was not - found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or - an ALIAS target is missing\? + Target "top" links to: + + ::@\(0xdeadbeef\) + + but the target was not found. Possible reasons include: +( + \*[^ +]+)* + Call Stack \(most recent call first\): CMakeLists\.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/target_link_libraries/ConfigCase-stderr.txt b/Tests/RunCMake/target_link_libraries/ConfigCase-stderr.txt index ea078b5..ad48fd0 100644 --- a/Tests/RunCMake/target_link_libraries/ConfigCase-stderr.txt +++ b/Tests/RunCMake/target_link_libraries/ConfigCase-stderr.txt @@ -1,13 +1,25 @@ -^CMake Error at ConfigCase\.cmake:6 \(target_link_libraries\): - Target "impl" links to target "config::impl-Debug" but the target was not - found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or - an ALIAS target is missing\? +^CMake Error at ConfigCase\.cmake:4 \(target_link_libraries\): + The link interface of target "iface" contains: + + config::iface-Debug + + but the target was not found. Possible reasons include: +( + \*[^ +]+)* + Call Stack \(most recent call first\): CMakeLists\.txt:[0-9]+ \(include\) + -CMake Error at ConfigCase\.cmake:4 \(target_link_libraries\): - Target "impl" links to target "config::iface-Debug" but the target was not - found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or - an ALIAS target is missing\? +CMake Error at ConfigCase\.cmake:6 \(target_link_libraries\): + Target "impl" links to: + + config::impl-Debug + + but the target was not found. Possible reasons include: +( + \*[^ +]+)* + Call Stack \(most recent call first\): CMakeLists\.txt:[0-9]+ \(include\) -- cgit v0.12