diff options
author | Sebastian Lipponer <mail@sebastianlipponer.de> | 2019-04-01 19:47:12 (GMT) |
---|---|---|
committer | Sebastian Lipponer <mail@sebastianlipponer.de> | 2019-04-01 19:52:17 (GMT) |
commit | abbb8a7b1d40b98fb1841a76efb676eea7771cf0 (patch) | |
tree | a7e7b657af68eb9783f955d3c3695f2258685824 /Source/cmGeneratorExpressionNode.cxx | |
parent | 11338389e5f89a58b18d63e29e21c099cfbf407e (diff) | |
download | CMake-abbb8a7b1d40b98fb1841a76efb676eea7771cf0.zip CMake-abbb8a7b1d40b98fb1841a76efb676eea7771cf0.tar.gz CMake-abbb8a7b1d40b98fb1841a76efb676eea7771cf0.tar.bz2 |
Genex: Add $<REMOVE_DUPLICATES:list>
Diffstat (limited to 'Source/cmGeneratorExpressionNode.cxx')
-rw-r--r-- | Source/cmGeneratorExpressionNode.cxx | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/Source/cmGeneratorExpressionNode.cxx b/Source/cmGeneratorExpressionNode.cxx index 50413c8..19d2b3a 100644 --- a/Source/cmGeneratorExpressionNode.cxx +++ b/Source/cmGeneratorExpressionNode.cxx @@ -15,6 +15,7 @@ #include "cmMessageType.h" #include "cmOutputConverter.h" #include "cmPolicies.h" +#include "cmRange.h" #include "cmState.h" #include "cmStateSnapshot.h" #include "cmStateTypes.h" @@ -326,6 +327,34 @@ static const struct InListNode : public cmGeneratorExpressionNode } } inListNode; +static const struct RemoveDuplicatesNode : public cmGeneratorExpressionNode +{ + RemoveDuplicatesNode() {} // NOLINT(modernize-use-equals-default) + + int NumExpectedParameters() const override { return 1; } + + std::string Evaluate( + const std::vector<std::string>& parameters, + cmGeneratorExpressionContext* context, + const GeneratorExpressionContent* content, + cmGeneratorExpressionDAGChecker* /*dagChecker*/) const override + { + if (parameters.size() != 1) { + reportError( + context, content->GetOriginalExpression(), + "$<REMOVE_DUPLICATES:...> expression requires one parameter"); + } + + std::vector<std::string> values; + cmSystemTools::ExpandListArgument(parameters.front(), values, true); + + auto valuesEnd = cmRemoveDuplicates(values); + auto valuesBegin = values.cbegin(); + return cmJoin(cmMakeRange(valuesBegin, valuesEnd), ";"); + } + +} removeDuplicatesNode; + static const struct TargetExistsNode : public cmGeneratorExpressionNode { TargetExistsNode() {} // NOLINT(modernize-use-equals-default) @@ -2158,6 +2187,7 @@ const cmGeneratorExpressionNode* cmGeneratorExpressionNode::GetNode( { "STREQUAL", &strEqualNode }, { "EQUAL", &equalNode }, { "IN_LIST", &inListNode }, + { "REMOVE_DUPLICATES", &removeDuplicatesNode }, { "LOWER_CASE", &lowerCaseNode }, { "UPPER_CASE", &upperCaseNode }, { "MAKE_C_IDENTIFIER", &makeCIdentifierNode }, |