Преглед изворни кода

Add $<SEMICOLON> generator expression.

This expression is useful to put a ';' in a command line argument
without dividing the argument during CMake list expansion.
Jean-Christophe Fillion-Robin пре 13 година
родитељ
комит
7f3bb8b392

+ 2 - 0
Source/cmDocumentGeneratorExpressions.h

@@ -26,6 +26,8 @@
   "strings which contain a '>' for example.\n"                          \
   "  $<COMMA>                  = A literal ','. Used to compare "       \
   "strings which contain a ',' for example.\n"                          \
+  "  $<SEMICOLON>              = A literal ';'. Used to prevent "       \
+  "list expansion on an argument with ';'.\n"                           \
   "  $<TARGET_NAME:...>        = 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 "      \

+ 18 - 0
Source/cmGeneratorExpressionEvaluator.cxx

@@ -226,6 +226,22 @@ static const struct CommaNode : public cmGeneratorExpressionNode
   }
 } commaNode;
 
+//----------------------------------------------------------------------------
+static const struct SemicolonNode : public cmGeneratorExpressionNode
+{
+  SemicolonNode() {}
+
+  virtual int NumExpectedParameters() const { return 0; }
+
+  std::string Evaluate(const std::vector<std::string> &,
+                       cmGeneratorExpressionContext *,
+                       const GeneratorExpressionContent *,
+                       cmGeneratorExpressionDAGChecker *) const
+  {
+    return ";";
+  }
+} semicolonNode;
+
 //----------------------------------------------------------------------------
 static const struct ConfigurationNode : public cmGeneratorExpressionNode
 {
@@ -943,6 +959,8 @@ cmGeneratorExpressionNode* GetNode(const std::string &identifier)
     return &angle_rNode;
   else if (identifier == "COMMA")
     return &commaNode;
+  else if (identifier == "SEMICOLON")
+    return &semicolonNode;
   else if (identifier == "TARGET_PROPERTY")
     return &targetPropertyNode;
   else if (identifier == "TARGET_NAME")

+ 2 - 0
Tests/GeneratorExpression/CMakeLists.txt

@@ -47,11 +47,13 @@ add_custom_target(check-part1 ALL
     -Dtest_strequal_no_yes=$<STREQUAL:No,Yes>
     -Dtest_strequal_angle_r=$<STREQUAL:$<ANGLE-R>,$<ANGLE-R>>
     -Dtest_strequal_comma=$<STREQUAL:$<COMMA>,$<COMMA>>
+    -Dtest_strequal_semicolon=$<STREQUAL:$<SEMICOLON>,$<SEMICOLON>>
     -Dtest_strequal_angle_r_comma=$<STREQUAL:$<ANGLE-R>,$<COMMA>>
     -Dtest_strequal_both_empty=$<STREQUAL:,>
     -Dtest_strequal_one_empty=$<STREQUAL:something,>
     -Dtest_angle_r=$<ANGLE-R>
     -Dtest_comma=$<COMMA>
+    -Dtest_semicolon=$<SEMICOLON>
     -Dtest_colons_1=$<1::>
     -Dtest_colons_2=$<1:::>
     -Dtest_colons_3=$<1:Qt5::Core>

+ 2 - 0
Tests/GeneratorExpression/check-part1.cmake

@@ -44,11 +44,13 @@ check(test_strequal_yes_no "0")
 check(test_strequal_no_yes "0")
 check(test_strequal_angle_r "1")
 check(test_strequal_comma "1")
+check(test_strequal_semicolon "1")
 check(test_strequal_angle_r_comma "0")
 check(test_strequal_both_empty "1")
 check(test_strequal_one_empty "0")
 check(test_angle_r ">")
 check(test_comma ",")
+check(test_semicolon ";")
 check(test_colons_1 ":")
 check(test_colons_2 "::")
 check(test_colons_3 "Qt5::Core")