summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmGeneratorExpressionEvaluator.cxx4
-rw-r--r--Source/cmGeneratorTarget.cxx2
-rw-r--r--Source/cmTarget.cxx23
-rw-r--r--Tests/InterfaceLibrary/CMakeLists.txt12
-rw-r--r--Tests/InterfaceLibrary/definetestexe.cpp4
-rw-r--r--Tests/InterfaceLibrary/ifacedir/CMakeLists.txt8
-rw-r--r--Tests/InterfaceLibrary/ifacedir/sub.cpp1
7 files changed, 36 insertions, 18 deletions
diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx
index 3dee601..f491882 100644
--- a/Source/cmGeneratorExpressionEvaluator.cxx
+++ b/Source/cmGeneratorExpressionEvaluator.cxx
@@ -828,7 +828,7 @@ std::string getLinkedTargetsContent(
sep = ";";
}
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(depString);
- std::string linkedTargetsContent = cge->Evaluate(context->Makefile,
+ std::string linkedTargetsContent = cge->Evaluate(target->GetMakefile(),
context->Config,
context->Quiet,
headTarget,
@@ -853,7 +853,7 @@ std::string getLinkedTargetsContent(const std::vector<std::string> &libraries,
it = libraries.begin();
it != libraries.end(); ++it)
{
- if (cmTarget const *tgt = context->Makefile->FindTargetToUse(*it))
+ if (cmTarget const *tgt = target->FindTargetToLink(*it))
{
tgts.push_back(tgt);
}
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 392b377..36c5648 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -478,7 +478,7 @@ bool cmGeneratorTarget::IsSystemIncludeDirectory(const std::string& dir,
for(std::vector<std::string>::const_iterator li = impl->Libraries.begin();
li != impl->Libraries.end(); ++li)
{
- cmTarget const* tgt = this->Makefile->FindTargetToUse(*li);
+ cmTarget const* tgt = this->Target->FindTargetToLink(*li);
if (!tgt)
{
continue;
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 9a6c93c..e4f26d1 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -3492,9 +3492,9 @@ public:
Makefile(target->GetMakefile()), Target(target)
{ this->Visited.insert(target); }
- void Visit(const std::string& name)
+ void Visit(cmTarget const* from, const std::string& name)
{
- cmTarget *target = this->Makefile->FindTargetToUse(name);
+ cmTarget const *target = from->FindTargetToLink(name);
if(!target)
{
@@ -3553,7 +3553,7 @@ public:
for(std::vector<std::string>::const_iterator
li = iface->Libraries.begin(); li != iface->Libraries.end(); ++li)
{
- this->Visit(*li);
+ this->Visit(target, *li);
}
}
private:
@@ -3659,7 +3659,7 @@ void cmTarget::ComputeLinkClosure(const std::string& config,
for(std::vector<std::string>::const_iterator li = impl->Libraries.begin();
li != impl->Libraries.end(); ++li)
{
- cll.Visit(*li);
+ cll.Visit(this, *li);
}
// Store the transitive closure of languages.
@@ -6149,13 +6149,12 @@ cmTarget::GetImportLinkInterface(const std::string& config,
//----------------------------------------------------------------------------
void processILibs(const std::string& config,
cmTarget const* headTarget,
+ cmTarget const* curTarget,
std::string const& name,
std::vector<cmTarget const*>& tgts,
std::set<cmTarget const*>& emitted)
{
- cmTarget* tgt = headTarget->GetMakefile()
- ->FindTargetToUse(name);
- if (tgt && emitted.insert(tgt).second)
+ if (cmTarget const* tgt = curTarget->FindTargetToLink(name))
{
tgts.push_back(tgt);
if(cmTarget::LinkInterface const* iface =
@@ -6165,7 +6164,7 @@ void processILibs(const std::string& config,
it = iface->Libraries.begin();
it != iface->Libraries.end(); ++it)
{
- processILibs(config, headTarget, *it, tgts, emitted);
+ processILibs(config, headTarget, tgt, *it, tgts, emitted);
}
}
}
@@ -6188,7 +6187,7 @@ cmTarget::GetLinkImplementationClosure(const std::string& config) const
for(std::vector<std::string>::const_iterator it = impl->Libraries.begin();
it != impl->Libraries.end(); ++it)
{
- processILibs(config, this, *it, tgts , emitted);
+ processILibs(config, this, this, *it, tgts , emitted);
}
}
return tgts;
@@ -6212,8 +6211,7 @@ void cmTarget::GetTransitivePropertyTargets(const std::string& config,
for(std::vector<std::string>::const_iterator it = iface->Libraries.begin();
it != iface->Libraries.end(); ++it)
{
- if (cmTarget const* tgt = headTarget->GetMakefile()
- ->FindTargetToUse(*it))
+ if (cmTarget const* tgt = this->FindTargetToLink(*it))
{
tgts.push_back(tgt);
}
@@ -6245,8 +6243,7 @@ void cmTarget::GetTransitivePropertyTargets(const std::string& config,
for(std::vector<std::string>::const_iterator it = libs.begin();
it != libs.end(); ++it)
{
- if (cmTarget* tgt = headTarget->GetMakefile()
- ->FindTargetToUse(*it))
+ if (cmTarget const* tgt = this->FindTargetToLink(*it))
{
tgts.push_back(tgt);
}
diff --git a/Tests/InterfaceLibrary/CMakeLists.txt b/Tests/InterfaceLibrary/CMakeLists.txt
index 81b34e6..d4f49c2 100644
--- a/Tests/InterfaceLibrary/CMakeLists.txt
+++ b/Tests/InterfaceLibrary/CMakeLists.txt
@@ -8,8 +8,18 @@ target_compile_definitions(iface_nodepends INTERFACE IFACE_DEFINE)
add_subdirectory(headerdir)
+# Add an interface target in a subdirectory that uses an imported interface.
+add_subdirectory(ifacedir)
+
+# Poison an imported interface with the same name as that in the subdir
+# to ensure that the transitive lookup occurs in the subdir.
+add_library(imp::iface INTERFACE IMPORTED)
+set_property(TARGET imp::iface APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SOMEPROP)
+set_property(TARGET imp::iface PROPERTY INTERFACE_SOMEPROP OFF)
+set_property(TARGET imp::iface PROPERTY INTERFACE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/does_not_exist.cpp)
+
add_executable(InterfaceLibrary definetestexe.cpp)
-target_link_libraries(InterfaceLibrary iface_nodepends headeriface)
+target_link_libraries(InterfaceLibrary iface_nodepends headeriface subiface)
add_subdirectory(libsdir)
diff --git a/Tests/InterfaceLibrary/definetestexe.cpp b/Tests/InterfaceLibrary/definetestexe.cpp
index e7a10c1..30f2925 100644
--- a/Tests/InterfaceLibrary/definetestexe.cpp
+++ b/Tests/InterfaceLibrary/definetestexe.cpp
@@ -15,7 +15,9 @@
#error Expected IFACE_HEADER_BUILDDIR
#endif
+extern int sub();
+
int main(int,char**)
{
- return 0;
+ return sub();
}
diff --git a/Tests/InterfaceLibrary/ifacedir/CMakeLists.txt b/Tests/InterfaceLibrary/ifacedir/CMakeLists.txt
new file mode 100644
index 0000000..228715e
--- /dev/null
+++ b/Tests/InterfaceLibrary/ifacedir/CMakeLists.txt
@@ -0,0 +1,8 @@
+add_library(imp::iface INTERFACE IMPORTED)
+set_property(TARGET imp::iface APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SOMEPROP)
+set_property(TARGET imp::iface PROPERTY INTERFACE_SOMEPROP ON)
+set_property(TARGET imp::iface PROPERTY INTERFACE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/sub.cpp)
+
+add_library(subiface INTERFACE)
+target_link_libraries(subiface INTERFACE imp::iface)
+set_property(TARGET subiface PROPERTY INTERFACE_SOMEPROP ON)
diff --git a/Tests/InterfaceLibrary/ifacedir/sub.cpp b/Tests/InterfaceLibrary/ifacedir/sub.cpp
new file mode 100644
index 0000000..165a66a
--- /dev/null
+++ b/Tests/InterfaceLibrary/ifacedir/sub.cpp
@@ -0,0 +1 @@
+int sub() { return 0; }