From a7ba4520c7b15dc9f56d2c4718748b79b12c0c89 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 26 Feb 2013 00:50:49 +0100 Subject: Add the JOIN generator expression. This generator expression joins a list with a separator. The separator may contain arbitrary content, such as commas, which is ordinarily a delimiter in the generator expression syntax. --- Source/cmDocumentGeneratorExpressions.h | 2 ++ Source/cmGeneratorExpressionEvaluator.cxx | 30 ++++++++++++++++++++++ Tests/CompileDefinitions/compiletest.cpp | 20 ++++++++++++--- .../CompileDefinitions/target_prop/CMakeLists.txt | 6 +++++ .../TargetIncludeDirectories/CMakeLists.txt | 5 ++++ .../TargetIncludeDirectories/main.cpp | 1 + 6 files changed, 61 insertions(+), 3 deletions(-) diff --git a/Source/cmDocumentGeneratorExpressions.h b/Source/cmDocumentGeneratorExpressions.h index 6cc3f25..ac52db0 100644 --- a/Source/cmDocumentGeneratorExpressions.h +++ b/Source/cmDocumentGeneratorExpressions.h @@ -28,6 +28,8 @@ "strings which contain a ',' for example.\n" \ " $ = A literal ';'. Used to prevent " \ "list expansion on an argument with ';'.\n" \ + " $ = joins the list with the content of " \ + "\"...\"\n" \ " $ = Marks ... as being the name of a " \ "target. This is required if exporting targets to multiple " \ "dependent export sets. The '...' must be a literal name of a " \ diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index efb8117..6092aa2 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -307,6 +307,34 @@ static const struct ConfigurationTestNode : public cmGeneratorExpressionNode } configurationTestNode; +static const struct JoinNode : public cmGeneratorExpressionNode +{ + JoinNode() {} + + virtual int NumExpectedParameters() const { return 2; } + + virtual bool AcceptsArbitraryContentParameter() const { return true; } + + std::string Evaluate(const std::vector ¶meters, + cmGeneratorExpressionContext *, + const GeneratorExpressionContent *, + cmGeneratorExpressionDAGChecker *) const + { + std::string result; + + std::vector list; + cmSystemTools::ExpandListArgument(parameters.front(), list); + std::string sep; + for(std::vector::const_iterator li = list.begin(); + li != list.end(); ++li) + { + result += sep + *li; + sep = parameters[1]; + } + return result; + } +} joinNode; + //---------------------------------------------------------------------------- static const char* targetPropertyTransitiveWhitelist[] = { "INTERFACE_INCLUDE_DIRECTORIES" @@ -973,6 +1001,8 @@ cmGeneratorExpressionNode* GetNode(const std::string &identifier) return &installInterfaceNode; else if (identifier == "INSTALL_PREFIX") return &installPrefixNode; + else if (identifier == "JOIN") + return &joinNode; return 0; } diff --git a/Tests/CompileDefinitions/compiletest.cpp b/Tests/CompileDefinitions/compiletest.cpp index 14b8eab..7379380 100644 --- a/Tests/CompileDefinitions/compiletest.cpp +++ b/Tests/CompileDefinitions/compiletest.cpp @@ -20,10 +20,16 @@ static const char very_fun_string[] = CMAKE_IS_REALLY; #endif enum { - StringLiteralTest1 = sizeof(CMakeStaticAssert) + StringLiteralTest1 = sizeof(CMakeStaticAssert), #ifndef NO_SPACES_IN_DEFINE_VALUES - , - StringLiteralTest2 = sizeof(CMakeStaticAssert) + StringLiteralTest2 = sizeof(CMakeStaticAssert), +#endif +#ifdef TEST_GENERATOR_EXPRESSIONS + StringLiteralTest3 = sizeof(CMakeStaticAssert), + StringLiteralTest4 = sizeof(CMakeStaticAssert), + StringLiteralTest5 = sizeof(CMakeStaticAssert), + StringLiteralTest6 = sizeof(CMakeStaticAssert), + StringLiteralTest7 = sizeof(CMakeStaticAssert) #endif }; @@ -42,6 +48,14 @@ enum { #error Expected define expanded from list #endif +#ifndef PREFIX_DEF1 +#error Expect PREFIX_DEF1 +#endif + +#ifndef PREFIX_DEF2 +#error Expect PREFIX_DEF2 +#endif + // TEST_GENERATOR_EXPRESSIONS #endif diff --git a/Tests/CompileDefinitions/target_prop/CMakeLists.txt b/Tests/CompileDefinitions/target_prop/CMakeLists.txt index 1ef2d6d..34be917 100644 --- a/Tests/CompileDefinitions/target_prop/CMakeLists.txt +++ b/Tests/CompileDefinitions/target_prop/CMakeLists.txt @@ -13,6 +13,12 @@ set_property(TARGET target_prop_executable APPEND PROPERTY COMPILE_DEFINITIONS "$<1:CMAKE_IS_DECLARATIVE>" "$<0:GE_NOT_DEFINED>" "$<1:ARGUMENT;LIST>" + PREFIX_$ + LETTER_LIST1=\"$\" + LETTER_LIST2=\"$\" + LETTER_LIST3=\"$\" + LETTER_LIST4=\"$\" + LETTER_LIST5=\"$\" ) set_property(TARGET target_prop_executable APPEND PROPERTY COMPILE_DEFINITIONS diff --git a/Tests/IncludeDirectories/TargetIncludeDirectories/CMakeLists.txt b/Tests/IncludeDirectories/TargetIncludeDirectories/CMakeLists.txt index ad6671f..60d4c6a 100644 --- a/Tests/IncludeDirectories/TargetIncludeDirectories/CMakeLists.txt +++ b/Tests/IncludeDirectories/TargetIncludeDirectories/CMakeLists.txt @@ -123,3 +123,8 @@ target_link_libraries(lib5 libbad libgood) target_include_directories(lib5 BEFORE PRIVATE $ ) + +file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/prefix_foo/prefix_bar/prefix_bat") +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/prefix_foo/prefix_bar/prefix_bat/prefix_foo_bar_bat.h" "// prefix_foo_bar_bat.h\n") + +target_include_directories(TargetIncludeDirectories PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/prefix_$") diff --git a/Tests/IncludeDirectories/TargetIncludeDirectories/main.cpp b/Tests/IncludeDirectories/TargetIncludeDirectories/main.cpp index 90909d3..5bb34aa 100644 --- a/Tests/IncludeDirectories/TargetIncludeDirectories/main.cpp +++ b/Tests/IncludeDirectories/TargetIncludeDirectories/main.cpp @@ -10,6 +10,7 @@ #include "arguments.h" #include "list.h" #include "target.h" +#include "prefix_foo_bar_bat.h" int main(int, char**) { -- cgit v0.12