Browse Source

Genex: Add IN_LIST logical operator

Implements #17679
pull/320/head
Marc Chevrier 8 years ago
parent
commit
5089f560e7
  1. 2
      Help/manual/cmake-generator-expressions.7.rst
  2. 5
      Help/release/dev/genex-IN_LIST-logical-operator.rst
  3. 26
      Source/cmGeneratorExpressionNode.cxx
  4. 5
      Tests/GeneratorExpression/CMakeLists.txt
  5. 5
      Tests/GeneratorExpression/check-part1.cmake

2
Help/manual/cmake-generator-expressions.7.rst

@ -57,6 +57,8 @@ Available logical expressions are:
``1`` if ``a`` is STREQUAL ``b``, else ``0``
``$<EQUAL:a,b>``
``1`` if ``a`` is EQUAL ``b`` in a numeric comparison, else ``0``
``$<IN_LIST:a,b>``
``1`` if ``a`` is IN_LIST ``b``, else ``0``
``$<CONFIG:cfg>``
``1`` if config is ``cfg``, else ``0``. This is a case-insensitive comparison.
The mapping in :prop_tgt:`MAP_IMPORTED_CONFIG_<CONFIG>` is also considered by

5
Help/release/dev/genex-IN_LIST-logical-operator.rst

@ -0,0 +1,5 @@
genex-IN_LIST-logical-operator
------------------------------
* A new ``$<IN_LIST:...>`` :manual:`generator expression <cmake-generator-expressions(7)>`
has been added.

26
Source/cmGeneratorExpressionNode.cxx

@ -275,6 +275,31 @@ static const struct EqualNode : public cmGeneratorExpressionNode
}
} equalNode;
static const struct InListNode : public cmGeneratorExpressionNode
{
InListNode() {}
int NumExpectedParameters() const override { return 2; }
std::string Evaluate(
const std::vector<std::string>& parameters,
cmGeneratorExpressionContext* /*context*/,
const GeneratorExpressionContent* /*content*/,
cmGeneratorExpressionDAGChecker* /*dagChecker*/) const override
{
std::vector<std::string> values;
cmSystemTools::ExpandListArgument(parameters[1], values);
if (values.empty()) {
return "0";
}
return std::find(values.cbegin(), values.cend(), parameters.front()) ==
values.cend()
? "0"
: "1";
}
} inListNode;
static const struct LowerCaseNode : public cmGeneratorExpressionNode
{
LowerCaseNode() {}
@ -1827,6 +1852,7 @@ const cmGeneratorExpressionNode* cmGeneratorExpressionNode::GetNode(
nodeMap["TARGET_BUNDLE_CONTENT_DIR"] = &targetBundleContentDirNode;
nodeMap["STREQUAL"] = &strEqualNode;
nodeMap["EQUAL"] = &equalNode;
nodeMap["IN_LIST"] = &inListNode;
nodeMap["LOWER_CASE"] = &lowerCaseNode;
nodeMap["UPPER_CASE"] = &upperCaseNode;
nodeMap["MAKE_C_IDENTIFIER"] = &makeCIdentifierNode;

5
Tests/GeneratorExpression/CMakeLists.txt

@ -57,6 +57,11 @@ add_custom_target(check-part1 ALL
-Dtest_strequal_angle_r_comma=$<STREQUAL:$<ANGLE-R>,$<COMMA>>
-Dtest_strequal_both_empty=$<STREQUAL:,>
-Dtest_strequal_one_empty=$<STREQUAL:something,>
-Dtest_inlist_true=$<IN_LIST:a,a$<SEMICOLON>b>
-Dtest_inlist_false=$<IN_LIST:c,a$<SEMICOLON>b>
-Dtest_inlist_empty_1=$<IN_LIST:a,>
-Dtest_inlist_empty_2=$<IN_LIST:,a>
-Dtest_inlist_empty_3=$<IN_LIST:,>
-Dtest_angle_r=$<ANGLE-R>
-Dtest_comma=$<COMMA>
-Dtest_semicolon=$<SEMICOLON>

5
Tests/GeneratorExpression/check-part1.cmake

@ -49,6 +49,11 @@ 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_inlist_true "1")
check(test_inlist_false "0")
check(test_inlist_empty_1 "0")
check(test_inlist_empty_2 "0")
check(test_inlist_empty_3 "0")
check(test_angle_r ">")
check(test_comma ",")
check(test_semicolon ";")

Loading…
Cancel
Save