TLL: Don't populate old link interface if CMP0022 is NEW.

Always populate the INTERFACE_LINK_LIBRARIES for interface
entries. Don't populate the old interface properties
matching (IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)?
if CMP0022 is NEW.

Because the INTERFACE_LINK_LIBRARIES property is now populated by
the target_link_libraries when operating on a static library,
make an equivalent change which populates the property with
the same value when the old link_libraries() command is used. This
silences the policy warning in that case.
This commit is contained in:
Stephen Kelly 2013-06-04 16:21:33 +02:00
parent 574fec97fd
commit 3e30d9ed67
20 changed files with 152 additions and 10 deletions

View File

@ -563,7 +563,11 @@ cmPolicies::cmPolicies()
"INTERFACE_LINK_LIBRARIES property will be processed and generated for "
"the IMPORTED target by default. A new option to the install(EXPORT) "
"and export commands allows export of the old-style properties for "
"compatibility with downstream users of CMake versions older than 2.8.12."
"compatibility with downstream users of CMake versions older than "
"2.8.12. "
"The target_link_libraries command will no longer populate the "
"properties matching LINK_INTERFACE_LIBRARIES(_<CONFIG>)? if this policy "
"is NEW."
"\n"
"The OLD behavior for this policy is to ignore the "
"INTERFACE_LINK_LIBRARIES property for in-build targets. "

View File

@ -2321,6 +2321,14 @@ void cmTarget::MergeLinkLibraries( cmMakefile& mf,
{
// We call this so that the dependencies get written to the cache
this->AddLinkLibrary( mf, selfname, i->first.c_str(), i->second );
if (this->GetType() == cmTarget::STATIC_LIBRARY)
{
this->AppendProperty("INTERFACE_LINK_LIBRARIES",
("$<LINK_ONLY:" +
this->GetDebugGeneratorExpressions(i->first.c_str(), i->second) +
">").c_str());
}
}
this->PrevLinkedLibraries = libs;
}

View File

@ -224,12 +224,17 @@ bool cmTargetLinkLibrariesCommand
cmSystemTools::SetFatalErrorOccured();
}
const cmPolicies::PolicyStatus policy22Status
= this->Target->GetPolicyStatusCMP0022();
// If any of the LINK_ options were given, make sure the
// LINK_INTERFACE_LIBRARIES target property exists.
// Use of any of the new keywords implies awareness of
// this property. And if no libraries are named, it should
// result in an empty link interface.
if(this->CurrentProcessingState != ProcessingLinkLibraries &&
if((policy22Status == cmPolicies::OLD ||
policy22Status == cmPolicies::WARN) &&
this->CurrentProcessingState != ProcessingLinkLibraries &&
!this->Target->GetProperty("LINK_INTERFACE_LIBRARIES"))
{
this->Target->SetProperty("LINK_INTERFACE_LIBRARIES", "");
@ -263,11 +268,30 @@ cmTargetLinkLibrariesCommand::HandleLibrary(const char* lib,
->AddLinkLibraryForTarget(this->Target->GetName(), lib, llt);
if (this->CurrentProcessingState != ProcessingPublicInterface)
{
if (this->Target->GetType() == cmTarget::STATIC_LIBRARY)
{
this->Target->AppendProperty("INTERFACE_LINK_LIBRARIES",
("$<LINK_ONLY:" +
this->Target->GetDebugGeneratorExpressions(lib, llt) +
">").c_str());
}
// Not LINK_INTERFACE_LIBRARIES or LINK_PUBLIC, do not add to interface.
return;
}
}
this->Target->AppendProperty("INTERFACE_LINK_LIBRARIES",
this->Target->GetDebugGeneratorExpressions(lib, llt).c_str());
const cmPolicies::PolicyStatus policy22Status
= this->Target->GetPolicyStatusCMP0022();
if (policy22Status != cmPolicies::OLD
&& policy22Status != cmPolicies::WARN)
{
return;
}
// Get the list of configurations considered to be DEBUG.
std::vector<std::string> const& debugConfigs =
this->Makefile->GetCMakeInstance()->GetDebugConfigs();

View File

@ -92,7 +92,7 @@ public:
"When this target is linked into another target then the libraries "
"linked to this target will appear on the link line for the other "
"target too. "
"See the LINK_INTERFACE_LIBRARIES target property to override the "
"See the INTERFACE_LINK_LIBRARIES target property to override the "
"set of transitive link dependencies for a target. "
"Calls to other signatures of this command may set the property "
"making any libraries linked exclusively by this signature private."
@ -112,14 +112,19 @@ public:
" target_link_libraries(<target> LINK_INTERFACE_LIBRARIES\n"
" [[debug|optimized|general] <lib>] ...)\n"
"The LINK_INTERFACE_LIBRARIES mode appends the libraries "
"to the LINK_INTERFACE_LIBRARIES and its per-configuration equivalent "
"target properties instead of using them for linking. "
"Libraries specified as \"debug\" are appended to the "
"to the INTERFACE_LINK_LIBRARIES target property instead of using them "
"for linking. If policy CMP0022 is not NEW, then this mode also "
"appends libraries to the LINK_INTERFACE_LIBRARIES and its "
"per-configuration equivalent. "
"Libraries specified as \"debug\" are wrapped in a generator "
"expression to correspond to debug builds. If policy CMP0022 is not "
"NEW, the libraries are also appended to the "
"LINK_INTERFACE_LIBRARIES_DEBUG property (or to the properties "
"corresponding to configurations listed in the DEBUG_CONFIGURATIONS "
"global property if it is set). "
"Libraries specified as \"optimized\" are appended to the "
"LINK_INTERFACE_LIBRARIES property. "
"INTERFACE_LINK_LIBRARIES property. If policy CMP0022 is not NEW, "
"they are also appended to the LINK_INTERFACE_LIBRARIES property. "
"Libraries specified as \"general\" (or without any keyword) are "
"treated as if specified for both \"debug\" and \"optimized\"."
"\n"
@ -131,9 +136,11 @@ public:
"The LINK_PUBLIC and LINK_PRIVATE modes can be used to specify both "
"the link dependencies and the link interface in one command. "
"Libraries and targets following LINK_PUBLIC are linked to, and are "
"made part of the LINK_INTERFACE_LIBRARIES. Libraries and targets "
"following LINK_PRIVATE are linked to, but are not made part of the "
"LINK_INTERFACE_LIBRARIES. "
"made part of the INTERFACE_LINK_LIBRARIES. If policy CMP0022 is not "
"NEW, they are also made part of the LINK_INTERFACE_LIBRARIES. "
"Libraries and targets following LINK_PRIVATE are linked to, but are "
"not made part of the INTERFACE_LINK_LIBRARIES (or "
"LINK_INTERFACE_LIBRARIES)."
"\n"
"The library dependency graph is normally acyclic (a DAG), but in the "
"case of mutually-dependent STATIC libraries CMake allows the graph "

View File

@ -122,3 +122,5 @@ add_library(libConsumer empty.cpp)
# evaluates to the empty string in non-Debug cases, ensure that that causes
# no problems.
target_link_libraries(libConsumer debug depA)
add_subdirectory(cmp0022)

View File

@ -0,0 +1,18 @@
include(GenerateExportHeader)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
cmake_policy(SET CMP0022 NEW)
add_library(cmp0022lib SHARED cmp0022lib.cpp)
generate_export_header(cmp0022lib)
add_library(cmp0022ifacelib SHARED cmp0022ifacelib.cpp)
generate_export_header(cmp0022ifacelib)
target_link_libraries(cmp0022lib LINK_PUBLIC cmp0022ifacelib)
assert_property(cmp0022lib LINK_INTERFACE_LIBRARIES "")
assert_property(cmp0022ifacelib LINK_INTERFACE_LIBRARIES "")
assert_property(cmp0022lib INTERFACE_LINK_LIBRARIES "cmp0022ifacelib")
assert_property(cmp0022ifacelib INTERFACE_LINK_LIBRARIES "")
add_executable(cmp0022exe cmp0022exe.cpp)
target_link_libraries(cmp0022exe cmp0022lib)

View File

@ -0,0 +1,7 @@
#include "cmp0022lib.h"
int main(void)
{
return cmp0022().Value;
}

View File

@ -0,0 +1,9 @@
#include "cmp0022ifacelib.h"
CMP0022Iface cmp0022iface()
{
CMP0022Iface iface;
iface.Value = 0;
return iface;
}

View File

@ -0,0 +1,9 @@
#include "cmp0022ifacelib_export.h"
struct CMP0022Iface
{
int Value;
};
CMP0022Iface CMP0022IFACELIB_EXPORT cmp0022iface();

View File

@ -0,0 +1,7 @@
#include "cmp0022lib.h"
CMP0022Iface cmp0022()
{
return cmp0022iface();
}

View File

@ -0,0 +1,6 @@
#include "cmp0022lib_export.h"
#include "cmp0022ifacelib.h"
CMP0022Iface CMP0022LIB_EXPORT cmp0022();

View File

@ -0,0 +1,9 @@
enable_language(CXX)
add_subdirectory(dep1)
add_subdirectory(dep2)
add_subdirectory(dep3)
add_library(somelib empty.cpp)
target_link_libraries(somelib dep3)

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1,8 @@
CMake Warning \(dev\) in CMakeLists.txt:
Policy CMP0022 is not set: INTERFACE_LINK_LIBRARIES defines the link
interface. Run "cmake --help-policy CMP0022" for policy details. Use the
cmake_policy command to set the policy and suppress this warning.
Target "bar" has a INTERFACE_LINK_LIBRARIES property which differs from its
LINK_INTERFACE_LIBRARIES properties.
This warning is for project developers. Use -Wno-dev to suppress it.

View File

@ -0,0 +1,11 @@
project(CMP0022-WARN-tll)
add_library(foo SHARED empty_vs6_1.cpp)
add_library(bar SHARED empty_vs6_2.cpp)
add_library(bat SHARED empty_vs6_3.cpp)
target_link_libraries(bar LINK_PUBLIC foo)
set_property(TARGET bar PROPERTY LINK_INTERFACE_LIBRARIES bat)
add_library(user SHARED empty.cpp)
target_link_libraries(user bar)

View File

@ -1,7 +1,9 @@
include(RunCMake)
run_cmake(CMP0022-WARN)
run_cmake(CMP0022-WARN-tll)
run_cmake(CMP0022-WARN-static)
run_cmake(CMP0022-NOWARN-static)
run_cmake(CMP0022-NOWARN-static-link_libraries)
run_cmake(CMP0022-export)
run_cmake(CMP0022-install-export)

View File

@ -0,0 +1,2 @@
add_library(dep1 ../empty_vs6_1.cpp)

View File

@ -0,0 +1,2 @@
add_library(dep2 ../empty_vs6_2.cpp)

View File

@ -0,0 +1,5 @@
link_libraries(dep1)
add_library(dep3 ../empty_vs6_3.cpp)
target_link_libraries(dep3 dep2)