Merge topic 'INTERFACE_LIBRARY-property-whitelist'
5ee9e6b
cmTarget: Add whitelist of properties on INTERFACE_LIBRARY.0bfcb45
INTERFACE_LIBRARY: Avoid codepaths which set unneeded properties.
This commit is contained in:
commit
779fd10160
|
@ -237,7 +237,15 @@ void cmComputeTargetDepends::CollectTargetDepends(int depender_index)
|
|||
it != configs.end(); ++it)
|
||||
{
|
||||
std::vector<std::string> tlibs;
|
||||
if (depender->GetType() == cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
// For INTERFACE_LIBRARY depend on the interface instead.
|
||||
depender->GetInterfaceLinkLibraries(it->c_str(), tlibs, depender);
|
||||
}
|
||||
else
|
||||
{
|
||||
depender->GetDirectLinkLibraries(it->c_str(), tlibs, depender);
|
||||
}
|
||||
// A target should not depend on itself.
|
||||
emitted.insert(depender->GetName());
|
||||
for(std::vector<std::string>::const_iterator lib = tlibs.begin();
|
||||
|
|
|
@ -387,15 +387,12 @@ void getCompatibleInterfaceProperties(cmTarget *target,
|
|||
cmComputeLinkInformation *info = target->GetLinkInformation(config);
|
||||
|
||||
if (!info)
|
||||
{
|
||||
if (target->GetType() != cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
cmMakefile* mf = target->GetMakefile();
|
||||
cmOStringStream e;
|
||||
e << "Exporting the target \"" << target->GetName() << "\" is not "
|
||||
"allowed since its linker language cannot be determined";
|
||||
mf->IssueMessage(cmake::FATAL_ERROR, e.str());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -447,6 +444,8 @@ void cmExportFileGenerator::PopulateCompatibleInterfaceProperties(
|
|||
getPropertyContents(target, "COMPATIBLE_INTERFACE_NUMBER_MAX",
|
||||
ifaceProperties);
|
||||
|
||||
if (target->GetType() != cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
getCompatibleInterfaceProperties(target, ifaceProperties, 0);
|
||||
|
||||
std::vector<std::string> configNames;
|
||||
|
@ -457,6 +456,7 @@ void cmExportFileGenerator::PopulateCompatibleInterfaceProperties(
|
|||
{
|
||||
getCompatibleInterfaceProperties(target, ifaceProperties, ci->c_str());
|
||||
}
|
||||
}
|
||||
|
||||
for (std::set<std::string>::const_iterator it = ifaceProperties.begin();
|
||||
it != ifaceProperties.end(); ++it)
|
||||
|
|
|
@ -954,7 +954,8 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
|
|||
|
||||
if (!prop)
|
||||
{
|
||||
if (target->IsImported())
|
||||
if (target->IsImported()
|
||||
|| target->GetType() == cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
return linkedTargetsContent;
|
||||
}
|
||||
|
|
|
@ -1309,6 +1309,11 @@ void cmGlobalGenerator::FinalizeTargetCompileInfo()
|
|||
{
|
||||
cmTarget* t = &ti->second;
|
||||
|
||||
if (t->GetType() == cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
t->AppendBuildInterfaceIncludes();
|
||||
|
||||
for (std::vector<cmValueWithOrigin>::const_iterator it
|
||||
|
@ -1461,6 +1466,10 @@ void cmGlobalGenerator::CheckLocalGenerators()
|
|||
for (cmTargets::iterator l = targets.begin();
|
||||
l != targets.end(); l++)
|
||||
{
|
||||
if (l->second.GetType() == cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
const cmTarget::LinkLibraryVectorType& libs =
|
||||
l->second.GetOriginalLinkLibraries();
|
||||
for(cmTarget::LinkLibraryVectorType::const_iterator lib = libs.begin();
|
||||
|
|
|
@ -327,6 +327,10 @@ void cmGlobalVisualStudio7Generator::WriteTargetConfigurations(
|
|||
projectTargets.begin(); tt != projectTargets.end(); ++tt)
|
||||
{
|
||||
cmTarget* target = *tt;
|
||||
if(target->GetType() == cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
const char* expath = target->GetProperty("EXTERNAL_MSPROJECT");
|
||||
if(expath)
|
||||
{
|
||||
|
@ -364,6 +368,10 @@ void cmGlobalVisualStudio7Generator::WriteTargetsToSolution(
|
|||
projectTargets.begin(); tt != projectTargets.end(); ++tt)
|
||||
{
|
||||
cmTarget* target = *tt;
|
||||
if(target->GetType() == cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
bool written = false;
|
||||
|
||||
// handle external vc project files
|
||||
|
|
|
@ -442,7 +442,8 @@ bool cmGlobalVisualStudio8Generator::NeedLinkLibraryDependencies(
|
|||
{
|
||||
if(cmTarget* depTarget = this->FindTarget(0, ui->c_str()))
|
||||
{
|
||||
if(depTarget->GetProperty("EXTERNAL_MSPROJECT"))
|
||||
if(depTarget->GetType() != cmTarget::INTERFACE_LIBRARY
|
||||
&& depTarget->GetProperty("EXTERNAL_MSPROJECT"))
|
||||
{
|
||||
// This utility dependency names an external .vcproj target.
|
||||
// We use LinkLibraryDependencies="true" to link to it without
|
||||
|
|
|
@ -645,7 +645,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
|
|||
// generators for them.
|
||||
bool createInstallGeneratorsForTargetFileSets = true;
|
||||
|
||||
if(target.IsFrameworkOnApple())
|
||||
if(target.IsFrameworkOnApple()
|
||||
|| target.GetType() == cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
createInstallGeneratorsForTargetFileSets = false;
|
||||
}
|
||||
|
|
|
@ -541,6 +541,10 @@ void cmLocalGenerator::GenerateTargetManifest()
|
|||
t != targets.end(); ++t)
|
||||
{
|
||||
cmGeneratorTarget& target = *t->second;
|
||||
if (target.Target->GetType() == cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if(configNames.empty())
|
||||
{
|
||||
target.GenerateTargetManifest(0);
|
||||
|
@ -2829,6 +2833,11 @@ cmLocalGenerator
|
|||
cmTargets& tgts = this->Makefile->GetTargets();
|
||||
for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); ++l)
|
||||
{
|
||||
if (l->second.GetType() == cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Include the user-specified pre-install script for this target.
|
||||
if(const char* preinstall = l->second.GetProperty("PRE_INSTALL_SCRIPT"))
|
||||
{
|
||||
|
|
|
@ -68,7 +68,8 @@ void cmLocalNinjaGenerator::Generate()
|
|||
for(cmGeneratorTargetsType::iterator t = targets.begin();
|
||||
t != targets.end(); ++t)
|
||||
{
|
||||
if (t->second->Target->IsImported())
|
||||
if (t->second->Target->GetType() == cmTarget::INTERFACE_LIBRARY
|
||||
|| t->second->Target->IsImported())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -151,7 +151,8 @@ void cmLocalUnixMakefileGenerator3::Generate()
|
|||
for(cmGeneratorTargetsType::iterator t = targets.begin();
|
||||
t != targets.end(); ++t)
|
||||
{
|
||||
if (t->second->Target->IsImported())
|
||||
if (t->second->Target->GetType() == cmTarget::INTERFACE_LIBRARY
|
||||
|| t->second->Target->IsImported())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -868,6 +868,10 @@ void cmMakefile::ConfigureFinalPass()
|
|||
for (cmTargets::iterator l = this->Targets.begin();
|
||||
l != this->Targets.end(); l++)
|
||||
{
|
||||
if (l->second.GetType() == cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
l->second.FinishConfigure();
|
||||
}
|
||||
}
|
||||
|
@ -2256,6 +2260,10 @@ void cmMakefile::ExpandVariablesCMP0019()
|
|||
l != this->Targets.end(); ++l)
|
||||
{
|
||||
cmTarget &t = l->second;
|
||||
if (t.GetType() == cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
includeDirs = t.GetProperty("INCLUDE_DIRECTORIES");
|
||||
if(mightExpandVariablesCMP0019(includeDirs))
|
||||
{
|
||||
|
|
|
@ -25,9 +25,12 @@ cmMakefileLibraryTargetGenerator
|
|||
cmMakefileTargetGenerator(target->Target)
|
||||
{
|
||||
this->CustomCommandDriver = OnDepends;
|
||||
if (this->Target->GetType() != cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
this->Target->GetLibraryNames(
|
||||
this->TargetNameOut, this->TargetNameSO, this->TargetNameReal,
|
||||
this->TargetNameImport, this->TargetNamePDB, this->ConfigName);
|
||||
}
|
||||
|
||||
this->OSXBundleGenerator = new cmOSXBundleGenerator(target,
|
||||
this->ConfigName);
|
||||
|
|
|
@ -428,6 +428,12 @@ struct cmStrCmp {
|
|||
return strcmp(input, m_test) == 0;
|
||||
}
|
||||
|
||||
// For use with binary_search
|
||||
bool operator()(const char *str1, const char *str2)
|
||||
{
|
||||
return strcmp(str1, str2) < 0;
|
||||
}
|
||||
|
||||
private:
|
||||
const char *m_test;
|
||||
};
|
||||
|
|
|
@ -255,6 +255,8 @@ void cmTarget::SetMakefile(cmMakefile* mf)
|
|||
this->IsApple = this->Makefile->IsOn("APPLE");
|
||||
|
||||
// Setup default property values.
|
||||
if (this->GetType() != INTERFACE_LIBRARY)
|
||||
{
|
||||
this->SetPropertyDefault("INSTALL_NAME_DIR", 0);
|
||||
this->SetPropertyDefault("INSTALL_RPATH", "");
|
||||
this->SetPropertyDefault("INSTALL_RPATH_USE_LINK_PATH", "OFF");
|
||||
|
@ -280,7 +282,7 @@ void cmTarget::SetMakefile(cmMakefile* mf)
|
|||
this->SetPropertyDefault("MACOSX_BUNDLE", 0);
|
||||
this->SetPropertyDefault("MACOSX_RPATH", 0);
|
||||
this->SetPropertyDefault("NO_SYSTEM_FROM_IMPORTED", 0);
|
||||
|
||||
}
|
||||
|
||||
// Collect the set of configuration types.
|
||||
std::vector<std::string> configNames;
|
||||
|
@ -300,6 +302,11 @@ void cmTarget::SetMakefile(cmMakefile* mf)
|
|||
std::string configUpper = cmSystemTools::UpperCase(*ci);
|
||||
for(const char** p = configProps; *p; ++p)
|
||||
{
|
||||
if (this->TargetTypeValue == INTERFACE_LIBRARY
|
||||
&& strcmp(*p, "MAP_IMPORTED_CONFIG_") != 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
std::string property = *p;
|
||||
property += configUpper;
|
||||
this->SetPropertyDefault(property.c_str(), 0);
|
||||
|
@ -311,7 +318,8 @@ void cmTarget::SetMakefile(cmMakefile* mf)
|
|||
// did not support this variable. Projects may still specify the
|
||||
// property directly. TODO: Make this depend on backwards
|
||||
// compatibility setting.
|
||||
if(this->TargetTypeValue != cmTarget::EXECUTABLE)
|
||||
if(this->TargetTypeValue != cmTarget::EXECUTABLE
|
||||
&& this->TargetTypeValue != cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
std::string property = cmSystemTools::UpperCase(*ci);
|
||||
property += "_POSTFIX";
|
||||
|
@ -352,16 +360,22 @@ void cmTarget::SetMakefile(cmMakefile* mf)
|
|||
this->InsertCompileOption(*it);
|
||||
}
|
||||
|
||||
if (this->GetType() != INTERFACE_LIBRARY)
|
||||
{
|
||||
this->SetPropertyDefault("C_VISIBILITY_PRESET", 0);
|
||||
this->SetPropertyDefault("CXX_VISIBILITY_PRESET", 0);
|
||||
this->SetPropertyDefault("VISIBILITY_INLINES_HIDDEN", 0);
|
||||
}
|
||||
|
||||
if(this->TargetTypeValue == cmTarget::SHARED_LIBRARY
|
||||
|| this->TargetTypeValue == cmTarget::MODULE_LIBRARY)
|
||||
{
|
||||
this->SetProperty("POSITION_INDEPENDENT_CODE", "True");
|
||||
}
|
||||
if (this->GetType() != INTERFACE_LIBRARY)
|
||||
{
|
||||
this->SetPropertyDefault("POSITION_INDEPENDENT_CODE", 0);
|
||||
}
|
||||
|
||||
// Record current policies for later use.
|
||||
#define CAPTURE_TARGET_POLICY(POLICY) \
|
||||
|
@ -1369,6 +1383,47 @@ void cmTarget::GatherDependencies( const cmMakefile& mf,
|
|||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
static bool whiteListedInterfaceProperty(const char *prop)
|
||||
{
|
||||
if(cmHasLiteralPrefix(prop, "INTERFACE_"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
static const char* builtIns[] = {
|
||||
// ###: This must remain sorted. It is processed with a binary search.
|
||||
"COMPATIBLE_INTERFACE_BOOL",
|
||||
"COMPATIBLE_INTERFACE_NUMBER_MAX",
|
||||
"COMPATIBLE_INTERFACE_NUMBER_MIN",
|
||||
"COMPATIBLE_INTERFACE_STRING",
|
||||
"EXCLUDE_FROM_ALL",
|
||||
"EXCLUDE_FROM_DEFAULT_BUILD",
|
||||
"EXPORT_NAME",
|
||||
"IMPORTED_LINK_INTERFACE_LANGUAGES",
|
||||
"IMPORTED",
|
||||
"NAME",
|
||||
"TYPE",
|
||||
"VERSION"
|
||||
};
|
||||
|
||||
if (std::binary_search(cmArrayBegin(builtIns),
|
||||
cmArrayEnd(builtIns),
|
||||
prop,
|
||||
cmStrCmp(prop)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (cmHasLiteralPrefix(prop, "EXCLUDE_FROM_DEFAULT_BUILD_")
|
||||
|| cmHasLiteralPrefix(prop, "IMPORTED_LINK_INTERFACE_LANGUAGES_")
|
||||
|| cmHasLiteralPrefix(prop, "MAP_IMPORTED_CONFIG_"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmTarget::SetProperty(const char* prop, const char* value)
|
||||
{
|
||||
|
@ -1376,6 +1431,16 @@ void cmTarget::SetProperty(const char* prop, const char* value)
|
|||
{
|
||||
return;
|
||||
}
|
||||
if (this->GetType() == INTERFACE_LIBRARY
|
||||
&& !whiteListedInterfaceProperty(prop))
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << "INTERFACE_LIBRARY targets may only have whitelisted properties. "
|
||||
"The property \"" << prop << "\" is not allowed.";
|
||||
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str().c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(prop, "NAME") == 0)
|
||||
{
|
||||
cmOStringStream e;
|
||||
|
@ -1445,6 +1510,15 @@ void cmTarget::AppendProperty(const char* prop, const char* value,
|
|||
{
|
||||
return;
|
||||
}
|
||||
if (this->GetType() == INTERFACE_LIBRARY
|
||||
&& !whiteListedInterfaceProperty(prop))
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << "INTERFACE_LIBRARY targets may only have whitelisted properties. "
|
||||
"The property \"" << prop << "\" is not allowed.";
|
||||
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str().c_str());
|
||||
return;
|
||||
}
|
||||
if (strcmp(prop, "NAME") == 0)
|
||||
{
|
||||
cmOStringStream e;
|
||||
|
@ -2560,6 +2634,16 @@ const char *cmTarget::GetProperty(const char* prop,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (this->GetType() == INTERFACE_LIBRARY
|
||||
&& !whiteListedInterfaceProperty(prop))
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << "INTERFACE_LIBRARY targets may only have whitelisted properties. "
|
||||
"The property \"" << prop << "\" is not allowed.";
|
||||
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str().c_str());
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (strcmp(prop, "NAME") == 0)
|
||||
{
|
||||
return this->GetName();
|
||||
|
@ -4433,7 +4517,8 @@ bool isLinkDependentProperty(cmTarget const* tgt, const std::string &p,
|
|||
bool cmTarget::IsLinkInterfaceDependentBoolProperty(const std::string &p,
|
||||
const char *config) const
|
||||
{
|
||||
if (this->TargetTypeValue == OBJECT_LIBRARY)
|
||||
if (this->TargetTypeValue == OBJECT_LIBRARY
|
||||
|| this->TargetTypeValue == INTERFACE_LIBRARY)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -4446,7 +4531,8 @@ bool cmTarget::IsLinkInterfaceDependentBoolProperty(const std::string &p,
|
|||
bool cmTarget::IsLinkInterfaceDependentStringProperty(const std::string &p,
|
||||
const char *config) const
|
||||
{
|
||||
if (this->TargetTypeValue == OBJECT_LIBRARY)
|
||||
if (this->TargetTypeValue == OBJECT_LIBRARY
|
||||
|| this->TargetTypeValue == INTERFACE_LIBRARY)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -4458,7 +4544,8 @@ bool cmTarget::IsLinkInterfaceDependentStringProperty(const std::string &p,
|
|||
bool cmTarget::IsLinkInterfaceDependentNumberMinProperty(const std::string &p,
|
||||
const char *config) const
|
||||
{
|
||||
if (this->TargetTypeValue == OBJECT_LIBRARY)
|
||||
if (this->TargetTypeValue == OBJECT_LIBRARY
|
||||
|| this->TargetTypeValue == INTERFACE_LIBRARY)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -4470,7 +4557,8 @@ bool cmTarget::IsLinkInterfaceDependentNumberMinProperty(const std::string &p,
|
|||
bool cmTarget::IsLinkInterfaceDependentNumberMaxProperty(const std::string &p,
|
||||
const char *config) const
|
||||
{
|
||||
if (this->TargetTypeValue == OBJECT_LIBRARY)
|
||||
if (this->TargetTypeValue == OBJECT_LIBRARY
|
||||
|| this->TargetTypeValue == INTERFACE_LIBRARY)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -5105,6 +5193,8 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface,
|
|||
{
|
||||
emitted.insert(*li);
|
||||
}
|
||||
if (this->GetType() != cmTarget::INTERFACE_LIBRARY)
|
||||
{
|
||||
LinkImplementation const* impl = this->GetLinkImplementation(config,
|
||||
headTarget);
|
||||
for(std::vector<std::string>::const_iterator
|
||||
|
@ -5136,6 +5226,7 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface,
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (this->PolicyStatusCMP0022 == cmPolicies::WARN
|
||||
|| this->PolicyStatusCMP0022 == cmPolicies::OLD)
|
||||
// If CMP0022 is NEW then the plain tll signature sets the
|
||||
|
|
|
@ -184,7 +184,8 @@ void cmVisualStudio10TargetGenerator::WriteString(const char* line,
|
|||
void cmVisualStudio10TargetGenerator::Generate()
|
||||
{
|
||||
// do not generate external ms projects
|
||||
if(this->Target->GetProperty("EXTERNAL_MSPROJECT"))
|
||||
if(this->Target->GetType() == cmTarget::INTERFACE_LIBRARY
|
||||
|| this->Target->GetProperty("EXTERNAL_MSPROJECT"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -3,3 +3,4 @@ include(RunCMake)
|
|||
run_cmake(invalid_name)
|
||||
run_cmake(target_commands)
|
||||
run_cmake(no_shared_libs)
|
||||
run_cmake(whitelist)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,19 @@
|
|||
CMake Error at whitelist.cmake:4 \(set_property\):
|
||||
INTERFACE_LIBRARY targets may only have whitelisted properties. The
|
||||
property "OUTPUT_NAME" is not allowed.
|
||||
Call Stack \(most recent call first\):
|
||||
CMakeLists.txt:3 \(include\)
|
||||
|
||||
|
||||
CMake Error at whitelist.cmake:5 \(set_property\):
|
||||
INTERFACE_LIBRARY targets may only have whitelisted properties. The
|
||||
property "OUTPUT_NAME" is not allowed.
|
||||
Call Stack \(most recent call first\):
|
||||
CMakeLists.txt:3 \(include\)
|
||||
|
||||
|
||||
CMake Error at whitelist.cmake:6 \(get_target_property\):
|
||||
INTERFACE_LIBRARY targets may only have whitelisted properties. The
|
||||
property "OUTPUT_NAME" is not allowed.
|
||||
Call Stack \(most recent call first\):
|
||||
CMakeLists.txt:3 \(include\)
|
|
@ -0,0 +1,6 @@
|
|||
|
||||
add_library(iface INTERFACE)
|
||||
|
||||
set_property(TARGET iface PROPERTY OUTPUT_NAME output)
|
||||
set_property(TARGET iface APPEND PROPERTY OUTPUT_NAME append)
|
||||
get_target_property(outname iface OUTPUT_NAME)
|
Loading…
Reference in New Issue