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:
parent
574fec97fd
commit
3e30d9ed67
|
@ -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. "
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 "
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
#include "cmp0022lib.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return cmp0022().Value;
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
#include "cmp0022ifacelib.h"
|
||||
|
||||
CMP0022Iface cmp0022iface()
|
||||
{
|
||||
CMP0022Iface iface;
|
||||
iface.Value = 0;
|
||||
return iface;
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
#include "cmp0022ifacelib_export.h"
|
||||
|
||||
struct CMP0022Iface
|
||||
{
|
||||
int Value;
|
||||
};
|
||||
|
||||
CMP0022Iface CMP0022IFACELIB_EXPORT cmp0022iface();
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
#include "cmp0022lib.h"
|
||||
|
||||
CMP0022Iface cmp0022()
|
||||
{
|
||||
return cmp0022iface();
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
|
||||
#include "cmp0022lib_export.h"
|
||||
|
||||
#include "cmp0022ifacelib.h"
|
||||
|
||||
CMP0022Iface CMP0022LIB_EXPORT cmp0022();
|
|
@ -0,0 +1 @@
|
|||
^$
|
|
@ -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)
|
|
@ -0,0 +1 @@
|
|||
0
|
|
@ -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.
|
|
@ -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)
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
add_library(dep1 ../empty_vs6_1.cpp)
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
add_library(dep2 ../empty_vs6_2.cpp)
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
link_libraries(dep1)
|
||||
|
||||
add_library(dep3 ../empty_vs6_3.cpp)
|
||||
target_link_libraries(dep3 dep2)
|
Loading…
Reference in New Issue