mirror of
https://github.com/Kitware/CMake.git
synced 2025-12-31 19:00:54 -06:00
Merge topic 'tll-out-of-dir'
e27a76f131 target_link_libraries: Restore transitive out-of-dir linking
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !6285
This commit is contained in:
@@ -6349,11 +6349,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;
|
||||
}
|
||||
|
||||
@@ -6361,7 +6361,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;
|
||||
}
|
||||
|
||||
@@ -6388,9 +6388,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();
|
||||
@@ -7092,9 +7093,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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1043,8 +1043,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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user