From 146493363ebcb7618e5da175f89b69fcc4f9bb16 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 29 Oct 2013 09:22:32 +0100 Subject: [PATCH 1/2] Genex: Simplify the preprocessor looper for interface properties. By removing the INTERFACE_ prefix, we can use this in more contexts. --- Source/cmExportTryCompileFileGenerator.cxx | 2 +- Source/cmGeneratorExpressionDAGChecker.h | 8 ++++---- Source/cmGeneratorExpressionEvaluator.cxx | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/cmExportTryCompileFileGenerator.cxx b/Source/cmExportTryCompileFileGenerator.cxx index b70fed6dd..d9bc04c95 100644 --- a/Source/cmExportTryCompileFileGenerator.cxx +++ b/Source/cmExportTryCompileFileGenerator.cxx @@ -32,7 +32,7 @@ bool cmExportTryCompileFileGenerator::GenerateMainFile(std::ostream& os) ImportPropertyMap properties; #define FIND_TARGETS(PROPERTY) \ - this->FindTargets(#PROPERTY, te, emittedDeps); + this->FindTargets("INTERFACE_" #PROPERTY, te, emittedDeps); CM_FOR_EACH_TRANSITIVE_PROPERTY_NAME(FIND_TARGETS) diff --git a/Source/cmGeneratorExpressionDAGChecker.h b/Source/cmGeneratorExpressionDAGChecker.h index 0b7ef025c..c8594e773 100644 --- a/Source/cmGeneratorExpressionDAGChecker.h +++ b/Source/cmGeneratorExpressionDAGChecker.h @@ -23,10 +23,10 @@ F(EvaluatingCompileOptions) #define CM_FOR_EACH_TRANSITIVE_PROPERTY_NAME(F) \ - F(INTERFACE_INCLUDE_DIRECTORIES) \ - F(INTERFACE_SYSTEM_INCLUDE_DIRECTORIES) \ - F(INTERFACE_COMPILE_DEFINITIONS) \ - F(INTERFACE_COMPILE_OPTIONS) + F(INCLUDE_DIRECTORIES) \ + F(SYSTEM_INCLUDE_DIRECTORIES) \ + F(COMPILE_DEFINITIONS) \ + F(COMPILE_OPTIONS) //---------------------------------------------------------------------------- struct cmGeneratorExpressionDAGChecker diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index 107ef737f..2d26053e4 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -652,7 +652,7 @@ static const struct JoinNode : public cmGeneratorExpressionNode } joinNode; #define TRANSITIVE_PROPERTY_NAME(PROPERTY) \ - , #PROPERTY + , "INTERFACE_" #PROPERTY //---------------------------------------------------------------------------- static const char* targetPropertyTransitiveWhitelist[] = { From 77a0fd5135e3f9cdd0a365ab3ce41a9393f41037 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 25 Oct 2013 15:55:40 +0200 Subject: [PATCH 2/2] Genex: Use a preprocessor foreach to follow transitive properties. --- Source/cmGeneratorExpressionEvaluator.cxx | 29 ++++++++++------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index 2d26053e4..2ae5a2238 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -893,26 +893,21 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode std::string interfacePropertyName; - if (propertyName == "INTERFACE_INCLUDE_DIRECTORIES" - || propertyName == "INCLUDE_DIRECTORIES") - { - interfacePropertyName = "INTERFACE_INCLUDE_DIRECTORIES"; - } - else if (propertyName == "INTERFACE_SYSTEM_INCLUDE_DIRECTORIES") - { - interfacePropertyName = "INTERFACE_SYSTEM_INCLUDE_DIRECTORIES"; - } - else if (propertyName == "INTERFACE_COMPILE_DEFINITIONS" - || propertyName == "COMPILE_DEFINITIONS" - || strncmp(propertyName.c_str(), "COMPILE_DEFINITIONS_", 20) == 0) +#define POPULATE_INTERFACE_PROPERTY_NAME(prop) \ + if (propertyName == #prop || propertyName == "INTERFACE_" #prop) \ + { \ + interfacePropertyName = "INTERFACE_" #prop; \ + } \ + else + + CM_FOR_EACH_TRANSITIVE_PROPERTY_NAME(POPULATE_INTERFACE_PROPERTY_NAME) + // Note that the above macro terminates with an else + /* else */ if (strncmp(propertyName.c_str(), + "COMPILE_DEFINITIONS_", 20) == 0) { interfacePropertyName = "INTERFACE_COMPILE_DEFINITIONS"; } - else if (propertyName == "INTERFACE_COMPILE_OPTIONS" - || propertyName == "COMPILE_OPTIONS") - { - interfacePropertyName = "INTERFACE_COMPILE_OPTIONS"; - } +#undef POPULATE_INTERFACE_PROPERTY_NAME cmTarget const* headTarget = context->HeadTarget ? context->HeadTarget : target;