summaryrefslogtreecommitdiffstats
path: root/Source/cmTarget.cxx
diff options
context:
space:
mode:
authorStephen Kelly <steveire@gmail.com>2013-11-25 15:23:11 (GMT)
committerStephen Kelly <steveire@gmail.com>2013-11-25 15:23:11 (GMT)
commit5ee9e6bc11a01c7450ffeb14d86f0fe0cef540d6 (patch)
tree2b58b308a696450f88b9916da192eb7e74dc0442 /Source/cmTarget.cxx
parent0bfcb450e6cab8d9c2c079e10bf0acea62ffadbe (diff)
downloadCMake-5ee9e6bc11a01c7450ffeb14d86f0fe0cef540d6.zip
CMake-5ee9e6bc11a01c7450ffeb14d86f0fe0cef540d6.tar.gz
CMake-5ee9e6bc11a01c7450ffeb14d86f0fe0cef540d6.tar.bz2
cmTarget: Add whitelist of properties on INTERFACE_LIBRARY.
Diffstat (limited to 'Source/cmTarget.cxx')
-rw-r--r--Source/cmTarget.cxx70
1 files changed, 70 insertions, 0 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 022048c..b0a8fd1 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -1384,12 +1384,63 @@ 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)
{
if (!prop)
{
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;
@@ -1459,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;
@@ -2574,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();