diff options
author | Brad King <brad.king@kitware.com> | 2021-06-29 19:57:16 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2021-06-29 20:52:12 (GMT) |
commit | e27a76f1311ab4ad1be07df018ac748d4b725cea (patch) | |
tree | d52fc751827893cd9468f86460d2dc8994c94b5d | |
parent | fb02657b6a4f66cfb1b1673c170136f07945eda2 (diff) | |
download | CMake-e27a76f1311ab4ad1be07df018ac748d4b725cea.zip CMake-e27a76f1311ab4ad1be07df018ac748d4b725cea.tar.gz CMake-e27a76f1311ab4ad1be07df018ac748d4b725cea.tar.bz2 |
target_link_libraries: Restore transitive out-of-dir linking
Refactoring in commit 7f506b95a7 (cmGeneratorTarget: Refactor link item
lookup, 2021-05-26, v3.21.0-rc1~103^2~4) accidentally dropped the
persistent lookup scope tracking across multiple items that was added by
commit f0e67da061 (target_link_libraries: Fix out-of-dir linking of a
list of targets, 2020-01-14, v3.17.0-rc1~149^2). This broke a
transitive out-of-dir linking case not covered by our test suite.
Restore the scope tracking and add a test case.
Fixes: #22363
-rw-r--r-- | Source/cmGeneratorTarget.cxx | 14 | ||||
-rw-r--r-- | Source/cmGeneratorTarget.h | 7 | ||||
-rw-r--r-- | Tests/CMakeCommands/target_link_libraries/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Tests/CMakeCommands/target_link_libraries/SubDirA/CMakeLists.txt | 4 | ||||
-rw-r--r-- | Tests/CMakeCommands/target_link_libraries/SubDirB/CMakeLists.txt | 4 | ||||
-rw-r--r-- | Tests/CMakeCommands/target_link_libraries/TopDir.c | 6 |
6 files changed, 30 insertions, 7 deletions
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index f268c6c..f1ef130 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -6346,11 +6346,11 @@ bool cmGeneratorTarget::IsLinkLookupScope(std::string const& n, } cm::optional<cmLinkItem> cmGeneratorTarget::LookupLinkItem( - std::string const& n, cmListFileBacktrace const& bt) const + std::string const& n, cmListFileBacktrace const& bt, + LookupLinkItemScope* scope) const { cm::optional<cmLinkItem> maybeItem; - cmLocalGenerator const* lg = this->LocalGenerator; - if (this->IsLinkLookupScope(n, lg)) { + if (this->IsLinkLookupScope(n, scope->LG)) { return maybeItem; } @@ -6358,7 +6358,7 @@ cm::optional<cmLinkItem> cmGeneratorTarget::LookupLinkItem( if (name == this->GetName() || name.empty()) { return maybeItem; } - maybeItem = this->ResolveLinkItem(name, bt, lg); + maybeItem = this->ResolveLinkItem(name, bt, scope->LG); return maybeItem; } @@ -6385,9 +6385,10 @@ void cmGeneratorTarget::ExpandLinkItems( &dagChecker, this, headTarget->LinkerLanguage), libs); cmMakefile const* mf = this->LocalGenerator->GetMakefile(); + LookupLinkItemScope scope{ this->LocalGenerator }; for (std::string const& lib : libs) { if (cm::optional<cmLinkItem> maybeItem = - this->LookupLinkItem(lib, cge->GetBacktrace())) { + this->LookupLinkItem(lib, cge->GetBacktrace(), &scope)) { if (!maybeItem->Target) { // Report explicitly linked object files separately. std::string const& maybeObj = maybeItem->AsStr(); @@ -7089,9 +7090,10 @@ const cmLinkInterface* cmGeneratorTarget::GetImportLinkInterface( iface.HadContextSensitiveCondition, iface.HadLinkLanguageSensitiveCondition); std::vector<std::string> deps = cmExpandedList(info->SharedDeps); + LookupLinkItemScope scope{ this->LocalGenerator }; for (std::string const& dep : deps) { if (cm::optional<cmLinkItem> maybeItem = - this->LookupLinkItem(dep, cmListFileBacktrace())) { + this->LookupLinkItem(dep, cmListFileBacktrace(), &scope)) { iface.SharedDeps.emplace_back(std::move(*maybeItem)); } } diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index ed66fb1..6d2aa85 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -1042,8 +1042,13 @@ private: bool& hadHeadSensitiveCondition, bool& hadContextSensitiveCondition, bool& hadLinkLanguageSensitiveCondition) const; + struct LookupLinkItemScope + { + cmLocalGenerator const* LG; + }; cm::optional<cmLinkItem> LookupLinkItem(std::string const& n, - cmListFileBacktrace const& bt) const; + cmListFileBacktrace const& bt, + LookupLinkItemScope* scope) const; std::vector<BT<std::string>> GetSourceFilePaths( std::string const& config) const; diff --git a/Tests/CMakeCommands/target_link_libraries/CMakeLists.txt b/Tests/CMakeCommands/target_link_libraries/CMakeLists.txt index aa8e21a..07ec4e3 100644 --- a/Tests/CMakeCommands/target_link_libraries/CMakeLists.txt +++ b/Tests/CMakeCommands/target_link_libraries/CMakeLists.txt @@ -140,6 +140,8 @@ cmake_policy(PUSH) cmake_policy(SET CMP0022 NEW) cmake_policy(SET CMP0079 NEW) add_executable(TopDir TopDir.c) +add_library(TopDirInterface INTERFACE) +target_link_libraries(TopDir PRIVATE TopDirInterface) add_subdirectory(SubDirA) add_subdirectory(SubDirB) target_link_libraries(SubDirB TopDirImported) diff --git a/Tests/CMakeCommands/target_link_libraries/SubDirA/CMakeLists.txt b/Tests/CMakeCommands/target_link_libraries/SubDirA/CMakeLists.txt index 4dae103..df7c483 100644 --- a/Tests/CMakeCommands/target_link_libraries/SubDirA/CMakeLists.txt +++ b/Tests/CMakeCommands/target_link_libraries/SubDirA/CMakeLists.txt @@ -3,6 +3,8 @@ add_executable(SubDirA SubDirA.c) # Link to a target imported in this directory that would not normally # be visible to the directory in which TopDir is defined. target_link_libraries(TopDir PUBLIC SameNameImported) +# Do the same through an interface library in the top. +target_link_libraries(TopDirInterface INTERFACE SameNameImported2) # Link SubDirA to a target imported in this directory that has the same # name as a target imported in SubDirB's directory. SubDirB will also @@ -13,3 +15,5 @@ target_link_libraries(SubDirA PRIVATE SameNameImported) # Distinguish this copy by having a unique usage requirement. add_library(SameNameImported IMPORTED INTERFACE) target_compile_definitions(SameNameImported INTERFACE DEF_SameNameImportedSubDirA) +add_library(SameNameImported2 INTERFACE IMPORTED) +target_compile_definitions(SameNameImported2 INTERFACE DEF_SameNameImported2SubDirA) diff --git a/Tests/CMakeCommands/target_link_libraries/SubDirB/CMakeLists.txt b/Tests/CMakeCommands/target_link_libraries/SubDirB/CMakeLists.txt index 06d1111..9af577c 100644 --- a/Tests/CMakeCommands/target_link_libraries/SubDirB/CMakeLists.txt +++ b/Tests/CMakeCommands/target_link_libraries/SubDirB/CMakeLists.txt @@ -3,6 +3,8 @@ add_executable(SubDirB SubDirB.c) # Link to a target imported in this directory that would not normally # be visible to the directory in which TopDir is defined. target_link_libraries(TopDir PUBLIC debug SameNameImported optimized SameNameImported) +# Do the same through an interface library in the top. +target_link_libraries(TopDirInterface INTERFACE debug SameNameImported2 optimized SameNameImported2) # Link to a list of targets imported in this directory that would not # normally be visible to the directory in which TopDir is defined. @@ -17,3 +19,5 @@ target_link_libraries(SubDirA PRIVATE SameNameImported) # Distinguish this copy by having a unique usage requirement. add_library(SameNameImported IMPORTED INTERFACE) target_compile_definitions(SameNameImported INTERFACE DEF_SameNameImportedSubDirB) +add_library(SameNameImported2 INTERFACE IMPORTED) +target_compile_definitions(SameNameImported2 INTERFACE DEF_SameNameImported2SubDirB) diff --git a/Tests/CMakeCommands/target_link_libraries/TopDir.c b/Tests/CMakeCommands/target_link_libraries/TopDir.c index d8066e5..708b5c1 100644 --- a/Tests/CMakeCommands/target_link_libraries/TopDir.c +++ b/Tests/CMakeCommands/target_link_libraries/TopDir.c @@ -4,6 +4,12 @@ #ifndef DEF_SameNameImportedSubDirB # error "DEF_SameNameImportedSubDirB is not defined but should be!" #endif +#ifndef DEF_SameNameImported2SubDirA +# error "DEF_SameNameImported2SubDirA is not defined but should be!" +#endif +#ifndef DEF_SameNameImported2SubDirB +# error "DEF_SameNameImported2SubDirB is not defined but should be!" +#endif #ifdef DEF_TopDirImported # error "DEF_TopDirImported is defined but should not be!" #endif |