Process the INTERFACE_PIC property from linked dependencies
This allows a dependee to inform a target that it should have its POSITION_INDEPENDENT_CODE property set to ON, or OFF. The value of the POSITION_INDEPENDENT_CODE property, if set, must be consistent with any INTERFACE_POSITION_INDEPENDENT_CODE properties on dependees. Add a test covering the consistency checks on platforms where they run.
This commit is contained in:
parent
042ecf0471
commit
3581b96caa
|
@ -1639,14 +1639,16 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
|
|||
if(strcmp(lang, "CXX") == 0)
|
||||
{
|
||||
this->CurrentLocalGenerator->AddLanguageFlags(cflags, "C", configName);
|
||||
this->CurrentLocalGenerator->AddCMP0018Flags(cflags, &target, "C");
|
||||
this->CurrentLocalGenerator->AddCMP0018Flags(cflags, &target,
|
||||
"C", configName);
|
||||
}
|
||||
|
||||
// Add language-specific flags.
|
||||
this->CurrentLocalGenerator->AddLanguageFlags(flags, lang, configName);
|
||||
|
||||
// Add shared-library flags if needed.
|
||||
this->CurrentLocalGenerator->AddCMP0018Flags(flags, &target, lang);
|
||||
this->CurrentLocalGenerator->AddCMP0018Flags(flags, &target,
|
||||
lang, configName);
|
||||
}
|
||||
else if(binary)
|
||||
{
|
||||
|
|
|
@ -1984,7 +1984,8 @@ void cmLocalGenerator::AddSharedFlags(std::string& flags,
|
|||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmLocalGenerator::AddCMP0018Flags(std::string &flags, cmTarget* target,
|
||||
std::string const& lang)
|
||||
std::string const& lang,
|
||||
const char *config)
|
||||
{
|
||||
int targetType = target->GetType();
|
||||
|
||||
|
@ -1997,8 +1998,18 @@ void cmLocalGenerator::AddCMP0018Flags(std::string &flags, cmTarget* target,
|
|||
}
|
||||
else
|
||||
{
|
||||
// Add position independendent flags, if needed.
|
||||
if (target->GetPropertyAsBool("POSITION_INDEPENDENT_CODE"))
|
||||
if (target->GetType() == cmTarget::OBJECT_LIBRARY)
|
||||
{
|
||||
if (target->GetPropertyAsBool("POSITION_INDEPENDENT_CODE"))
|
||||
{
|
||||
this->AddPositionIndependentFlags(flags, lang, targetType);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (target->GetLinkInterfaceDependentBoolProperty(
|
||||
"POSITION_INDEPENDENT_CODE",
|
||||
config))
|
||||
{
|
||||
this->AddPositionIndependentFlags(flags, lang, targetType);
|
||||
}
|
||||
|
|
|
@ -142,7 +142,7 @@ public:
|
|||
void AddLanguageFlags(std::string& flags, const char* lang,
|
||||
const char* config);
|
||||
void AddCMP0018Flags(std::string &flags, cmTarget* target,
|
||||
std::string const& lang);
|
||||
std::string const& lang, const char *config);
|
||||
void AddConfigVariableFlags(std::string& flags, const char* var,
|
||||
const char* config);
|
||||
///! Append flags to a string.
|
||||
|
|
|
@ -268,7 +268,8 @@ std::string cmMakefileTargetGenerator::GetFlags(const std::string &l)
|
|||
this->AddFortranFlags(flags);
|
||||
}
|
||||
|
||||
this->LocalGenerator->AddCMP0018Flags(flags, this->Target, lang);
|
||||
this->LocalGenerator->AddCMP0018Flags(flags, this->Target,
|
||||
lang, this->ConfigName);
|
||||
|
||||
// Add include directory flags.
|
||||
this->AddIncludeFlags(flags, lang);
|
||||
|
|
|
@ -147,7 +147,8 @@ cmNinjaTargetGenerator::ComputeFlagsForObject(cmSourceFile *source,
|
|||
|
||||
// Add shared-library flags if needed.
|
||||
this->LocalGenerator->AddCMP0018Flags(flags, this->Target,
|
||||
language.c_str());
|
||||
language.c_str(),
|
||||
this->GetConfigName());
|
||||
|
||||
// Add include directory flags.
|
||||
{
|
||||
|
|
|
@ -877,6 +877,20 @@ void cmTarget::DefineProperties(cmake *cm)
|
|||
"CMAKE_POSITION_INDEPENDENT_CODE if it is set when a target is "
|
||||
"created.");
|
||||
|
||||
cm->DefineProperty
|
||||
("INTERFACE_POSITION_INDEPENDENT_CODE", cmProperty::TARGET,
|
||||
"Whether consumers need to create a position-independent target",
|
||||
"The INTERFACE_POSITION_INDEPENDENT_CODE property informs consumers of "
|
||||
"this target whether they must set their POSITION_INDEPENDENT_CODE "
|
||||
"property to ON. If this property is set to ON, then the "
|
||||
"POSITION_INDEPENDENT_CODE property on all consumers will be set to "
|
||||
"ON. Similarly, if this property is set to OFF, then the "
|
||||
"POSITION_INDEPENDENT_CODE property on all consumers will be set to "
|
||||
"OFF. If this property is undefined, then consumers will determine "
|
||||
"their POSITION_INDEPENDENT_CODE property by other means. Consumers "
|
||||
"must ensure that the targets that they link to have a consistent "
|
||||
"requirement for their INTERFACE_POSITION_INDEPENDENT_CODE property.");
|
||||
|
||||
cm->DefineProperty
|
||||
("POST_INSTALL_SCRIPT", cmProperty::TARGET,
|
||||
"Deprecated install support.",
|
||||
|
|
|
@ -50,6 +50,9 @@ add_RunCMake_test(GeneratorExpression)
|
|||
add_RunCMake_test(TargetPropertyGeneratorExpressions)
|
||||
add_RunCMake_test(Languages)
|
||||
add_RunCMake_test(ObjectLibrary)
|
||||
if(NOT WIN32)
|
||||
add_RunCMake_test(PositionIndependentCode)
|
||||
endif()
|
||||
|
||||
add_RunCMake_test(build_command)
|
||||
add_RunCMake_test(find_package)
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
project(${RunCMake_TEST} CXX)
|
||||
|
||||
# MSVC creates extra targets which pollute the stderr unless we set this.
|
||||
set(CMAKE_SUPPRESS_REGENERATION TRUE)
|
||||
|
||||
include(${RunCMake_TEST}.cmake)
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,3 @@
|
|||
CMake Error: Property POSITION_INDEPENDENT_CODE on target "conflict" does
|
||||
not match the INTERFACE_POSITION_INDEPENDENT_CODE property requirement
|
||||
of dependency "piciface".
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
add_library(piciface UNKNOWN IMPORTED)
|
||||
set_property(TARGET piciface PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE ON)
|
||||
|
||||
add_executable(conflict "main.cpp")
|
||||
set_property(TARGET conflict PROPERTY POSITION_INDEPENDENT_CODE OFF)
|
||||
target_link_libraries(conflict piciface)
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,3 @@
|
|||
CMake Error: The INTERFACE_POSITION_INDEPENDENT_CODE property of "picoff" does
|
||||
not agree with the value of POSITION_INDEPENDENT_CODE already determined
|
||||
for "conflict".
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
add_library(picon UNKNOWN IMPORTED)
|
||||
set_property(TARGET picon PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE ON)
|
||||
|
||||
add_library(picoff UNKNOWN IMPORTED)
|
||||
set_property(TARGET picoff PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE OFF)
|
||||
|
||||
add_executable(conflict "main.cpp")
|
||||
target_link_libraries(conflict picon picoff)
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,4 @@
|
|||
Property POSITION_INDEPENDENT_CODE on target "conflict" is
|
||||
implied to be FALSE because it was used to determine the link libraries
|
||||
already. The INTERFACE_POSITION_INDEPENDENT_CODE property on
|
||||
dependency "picon" is in conflict.
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
add_library(picoff UNKNOWN IMPORTED)
|
||||
|
||||
add_library(picon UNKNOWN IMPORTED)
|
||||
set_property(TARGET picon PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE ON)
|
||||
|
||||
add_executable(conflict "main.cpp")
|
||||
target_link_libraries(conflict picon)
|
||||
set_property(TARGET conflict APPEND PROPERTY
|
||||
LINK_LIBRARIES
|
||||
$<$<NOT:$<BOOL:$<TARGET_PROPERTY:POSITION_INDEPENDENT_CODE>>>:picoff>
|
||||
)
|
|
@ -0,0 +1,5 @@
|
|||
include(RunCMake)
|
||||
|
||||
run_cmake(Conflict1)
|
||||
run_cmake(Conflict2)
|
||||
run_cmake(Conflict3)
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
int main(int,char**)
|
||||
{
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue