cmTargetPropertyComputer: whitelist custom properties

CMake's properties will never begin with an underscore or a lowercase
letter, so allow them to be set by projects.
This commit is contained in:
Ben Boeckel
2017-11-21 11:35:41 -05:00
parent daeadde888
commit fb3c5bfdbe
3 changed files with 24 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
whitelist-more-interface-properties
-----------------------------------
* ``INTERFACE`` libraries may now have custom properties set on them if they
start with either an underscore (``_``) or a lowercase ASCII character. The
original intention was to only allow properties which made sense for
``INTERFACE`` libraries, but it also blocked usage of custom properties.

View File

@@ -3,6 +3,7 @@
#include "cmTargetPropertyComputer.h" #include "cmTargetPropertyComputer.h"
#include <cctype>
#include <sstream> #include <sstream>
#include <unordered_set> #include <unordered_set>
@@ -49,6 +50,12 @@ bool cmTargetPropertyComputer::WhiteListedInterfaceProperty(
if (cmHasLiteralPrefix(prop, "INTERFACE_")) { if (cmHasLiteralPrefix(prop, "INTERFACE_")) {
return true; return true;
} }
if (cmHasLiteralPrefix(prop, "_")) {
return true;
}
if (std::islower(prop[0])) {
return true;
}
static std::unordered_set<std::string> builtIns; static std::unordered_set<std::string> builtIns;
if (builtIns.empty()) { if (builtIns.empty()) {
builtIns.insert("COMPATIBLE_INTERFACE_BOOL"); builtIns.insert("COMPATIBLE_INTERFACE_BOOL");

View File

@@ -4,3 +4,13 @@ add_library(iface INTERFACE)
set_property(TARGET iface PROPERTY OUTPUT_NAME output) set_property(TARGET iface PROPERTY OUTPUT_NAME output)
set_property(TARGET iface APPEND PROPERTY OUTPUT_NAME append) set_property(TARGET iface APPEND PROPERTY OUTPUT_NAME append)
get_target_property(outname iface OUTPUT_NAME) get_target_property(outname iface OUTPUT_NAME)
# Properties starting with `_` are allowed.
set_property(TARGET iface PROPERTY "_custom_property" output)
set_property(TARGET iface APPEND PROPERTY "_custom_property" append)
get_target_property(outname iface "_custom_property")
# Properties starting with a lowercase letter are allowed.
set_property(TARGET iface PROPERTY "custom_property" output)
set_property(TARGET iface APPEND PROPERTY "custom_property" append)
get_target_property(outname iface "custom_property")