diff options
author | Brad King <brad.king@kitware.com> | 2024-04-29 18:25:34 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2024-04-29 21:39:12 (GMT) |
commit | 79a3ae9a0d6b4cf8369b40e5c371617ad3cc9e11 (patch) | |
tree | 83dd913f57a8b29bf1a68e40093de92cd8567b93 /Source/cmGeneratorTarget.cxx | |
parent | e8010b67c7050aca36f5db9a75027606af35b93a (diff) | |
download | CMake-79a3ae9a0d6b4cf8369b40e5c371617ad3cc9e11.zip CMake-79a3ae9a0d6b4cf8369b40e5c371617ad3cc9e11.tar.gz CMake-79a3ae9a0d6b4cf8369b40e5c371617ad3cc9e11.tar.bz2 |
cmGeneratorExpressionDAGChecker: Simplify transitive property table
Refactor the table of builtin transitive properties to avoid
preprocessor-generated cascading-if blocks with duplicate code.
Diffstat (limited to 'Source/cmGeneratorTarget.cxx')
-rw-r--r-- | Source/cmGeneratorTarget.cxx | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 13ac815..d0573da 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -65,6 +65,7 @@ namespace { using LinkInterfaceFor = cmGeneratorTarget::LinkInterfaceFor; +using TransitiveProperty = cmGeneratorTarget::TransitiveProperty; const std::string kINTERFACE_LINK_LIBRARIES = "INTERFACE_LINK_LIBRARIES"; const std::string kINTERFACE_LINK_LIBRARIES_DIRECT = @@ -73,6 +74,23 @@ const std::string kINTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE = "INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE"; } +const std::map<cm::string_view, TransitiveProperty> + cmGeneratorTarget::BuiltinTransitiveProperties = { + { "AUTOMOC_MACRO_NAMES"_s, { "INTERFACE_AUTOMOC_MACRO_NAMES"_s } }, + { "AUTOUIC_OPTIONS"_s, { "INTERFACE_AUTOUIC_OPTIONS"_s } }, + { "COMPILE_DEFINITIONS"_s, { "INTERFACE_COMPILE_DEFINITIONS"_s } }, + { "COMPILE_FEATURES"_s, { "INTERFACE_COMPILE_FEATURES"_s } }, + { "COMPILE_OPTIONS"_s, { "INTERFACE_COMPILE_OPTIONS"_s } }, + { "INCLUDE_DIRECTORIES"_s, { "INTERFACE_INCLUDE_DIRECTORIES"_s } }, + { "LINK_DEPENDS"_s, { "INTERFACE_LINK_DEPENDS"_s } }, + { "LINK_DIRECTORIES"_s, { "INTERFACE_LINK_DIRECTORIES"_s } }, + { "LINK_OPTIONS"_s, { "INTERFACE_LINK_OPTIONS"_s } }, + { "PRECOMPILE_HEADERS"_s, { "INTERFACE_PRECOMPILE_HEADERS"_s } }, + { "SOURCES"_s, { "INTERFACE_SOURCES"_s } }, + { "SYSTEM_INCLUDE_DIRECTORIES"_s, + { "INTERFACE_SYSTEM_INCLUDE_DIRECTORIES"_s } }, + }; + template <> cmValue cmTargetPropertyComputer::GetSources<cmGeneratorTarget>( cmGeneratorTarget const* tgt, cmMakefile const& /* mf */) @@ -1517,6 +1535,28 @@ std::string cmGeneratorTarget::EvaluateInterfaceProperty( return result; } +cm::optional<cmGeneratorTarget::TransitiveProperty> +cmGeneratorTarget::IsTransitiveProperty(cm::string_view prop, + cmLocalGenerator const* lg) const +{ + cm::optional<TransitiveProperty> result; + static const cm::string_view kINTERFACE_ = "INTERFACE_"_s; + if (cmHasPrefix(prop, kINTERFACE_)) { + prop = prop.substr(kINTERFACE_.length()); + } + auto i = BuiltinTransitiveProperties.find(prop); + if (i != BuiltinTransitiveProperties.end()) { + result = i->second; + } else if (cmHasLiteralPrefix(prop, "COMPILE_DEFINITIONS_")) { + cmPolicies::PolicyStatus cmp0043 = + lg->GetPolicyStatus(cmPolicies::CMP0043); + if (cmp0043 == cmPolicies::WARN || cmp0043 == cmPolicies::OLD) { + result = TransitiveProperty{ "INTERFACE_COMPILE_DEFINITIONS"_s }; + } + } + return result; +} + namespace { enum class IncludeDirectoryFallBack |