cmTarget: Add whitelist of properties on INTERFACE_LIBRARY.
This commit is contained in:
parent
0bfcb450e6
commit
5ee9e6bc11
|
@ -428,6 +428,12 @@ struct cmStrCmp {
|
||||||
return strcmp(input, m_test) == 0;
|
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:
|
private:
|
||||||
const char *m_test;
|
const char *m_test;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1383,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)
|
void cmTarget::SetProperty(const char* prop, const char* value)
|
||||||
{
|
{
|
||||||
|
@ -1390,6 +1431,16 @@ void cmTarget::SetProperty(const char* prop, const char* value)
|
||||||
{
|
{
|
||||||
return;
|
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)
|
if (strcmp(prop, "NAME") == 0)
|
||||||
{
|
{
|
||||||
cmOStringStream e;
|
cmOStringStream e;
|
||||||
|
@ -1459,6 +1510,15 @@ void cmTarget::AppendProperty(const char* prop, const char* value,
|
||||||
{
|
{
|
||||||
return;
|
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)
|
if (strcmp(prop, "NAME") == 0)
|
||||||
{
|
{
|
||||||
cmOStringStream e;
|
cmOStringStream e;
|
||||||
|
@ -2574,6 +2634,16 @@ const char *cmTarget::GetProperty(const char* prop,
|
||||||
return 0;
|
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)
|
if (strcmp(prop, "NAME") == 0)
|
||||||
{
|
{
|
||||||
return this->GetName();
|
return this->GetName();
|
||||||
|
|
|
@ -3,3 +3,4 @@ include(RunCMake)
|
||||||
run_cmake(invalid_name)
|
run_cmake(invalid_name)
|
||||||
run_cmake(target_commands)
|
run_cmake(target_commands)
|
||||||
run_cmake(no_shared_libs)
|
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