From e6055284b347775ae1396725704778af0bfb56c7 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 11 Jun 2013 09:53:10 +0200 Subject: Add generator expressions for version comparision. --- Source/cmDocumentGeneratorExpressions.h | 6 +++ Source/cmGeneratorExpressionEvaluator.cxx | 60 +++++++++++++++++++++++++++++ Tests/GeneratorExpression/CMakeLists.txt | 6 +++ Tests/GeneratorExpression/check-part2.cmake | 6 +++ 4 files changed, 78 insertions(+) diff --git a/Source/cmDocumentGeneratorExpressions.h b/Source/cmDocumentGeneratorExpressions.h index a8b3847..84f4af5 100644 --- a/Source/cmDocumentGeneratorExpressions.h +++ b/Source/cmDocumentGeneratorExpressions.h @@ -48,6 +48,12 @@ "used.\n" \ " $ = '1' if the CMake-id of the CXX " \ "compiler matches comp, otherwise '0'.\n" \ + " $ = '1' if v1 is a version greater than " \ + "v2, else '0'.\n" \ + " $ = '1' if v1 is a version less than v2, " \ + "else '0'.\n" \ + " $ = '1' if v1 is the same version as v2, " \ + "else '0'.\n" \ " $ = main file (.exe, .so.1.2, .a)\n" \ " $ = file used to link (.a, .lib, .so)\n" \ " $ = file with soname (.so.3)\n" \ diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index 28f749d..1804691 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -345,6 +345,60 @@ static const struct CXXCompilerIdNode : public CompilerIdNode } cxxCompilerIdNode; //---------------------------------------------------------------------------- +static const struct VersionGreaterNode : public cmGeneratorExpressionNode +{ + VersionGreaterNode() {} + + virtual int NumExpectedParameters() const { return 2; } + + std::string Evaluate(const std::vector ¶meters, + cmGeneratorExpressionContext *, + const GeneratorExpressionContent *, + cmGeneratorExpressionDAGChecker *) const + { + return cmSystemTools::VersionCompare(cmSystemTools::OP_GREATER, + parameters.front().c_str(), + parameters[1].c_str()) ? "1" : "0"; + } +} versionGreaterNode; + +//---------------------------------------------------------------------------- +static const struct VersionLessNode : public cmGeneratorExpressionNode +{ + VersionLessNode() {} + + virtual int NumExpectedParameters() const { return 2; } + + std::string Evaluate(const std::vector ¶meters, + cmGeneratorExpressionContext *, + const GeneratorExpressionContent *, + cmGeneratorExpressionDAGChecker *) const + { + return cmSystemTools::VersionCompare(cmSystemTools::OP_LESS, + parameters.front().c_str(), + parameters[1].c_str()) ? "1" : "0"; + } +} versionLessNode; + +//---------------------------------------------------------------------------- +static const struct VersionEqualNode : public cmGeneratorExpressionNode +{ + VersionEqualNode() {} + + virtual int NumExpectedParameters() const { return 2; } + + std::string Evaluate(const std::vector ¶meters, + cmGeneratorExpressionContext *, + const GeneratorExpressionContent *, + cmGeneratorExpressionDAGChecker *) const + { + return cmSystemTools::VersionCompare(cmSystemTools::OP_EQUAL, + parameters.front().c_str(), + parameters[1].c_str()) ? "1" : "0"; + } +} versionEqualNode; + +//---------------------------------------------------------------------------- static const struct ConfigurationNode : public cmGeneratorExpressionNode { ConfigurationNode() {} @@ -1169,6 +1223,12 @@ cmGeneratorExpressionNode* GetNode(const std::string &identifier) return &cCompilerIdNode; else if (identifier == "CXX_COMPILER_ID") return &cxxCompilerIdNode; + else if (identifier == "VERSION_GREATER") + return &versionGreaterNode; + else if (identifier == "VERSION_LESS") + return &versionLessNode; + else if (identifier == "VERSION_EQUAL") + return &versionEqualNode; else if (identifier == "CONFIGURATION") return &configurationNode; else if (identifier == "CONFIG") diff --git a/Tests/GeneratorExpression/CMakeLists.txt b/Tests/GeneratorExpression/CMakeLists.txt index 9cd8a7f..e2fc353 100644 --- a/Tests/GeneratorExpression/CMakeLists.txt +++ b/Tests/GeneratorExpression/CMakeLists.txt @@ -130,6 +130,12 @@ add_custom_target(check-part2 ALL -Dtest_arbitrary_content_comma_8=$<1:a,,b> -Dtest_arbitrary_content_comma_9=$<1:a,,b,,> -Dtest_arbitrary_content_comma_10=$<1:,,a,,b,,> + -Dtest_version_greater_1=$ + -Dtest_version_greater_2=$ + -Dtest_version_less_1=$ + -Dtest_version_less_2=$ + -Dtest_version_equal_1=$ + -Dtest_version_equal_2=$ -P ${CMAKE_CURRENT_SOURCE_DIR}/check-part2.cmake COMMAND ${CMAKE_COMMAND} -E echo "check done (part 2 of 2)" VERBATIM diff --git a/Tests/GeneratorExpression/check-part2.cmake b/Tests/GeneratorExpression/check-part2.cmake index a1db5f6..f9b33b3 100644 --- a/Tests/GeneratorExpression/check-part2.cmake +++ b/Tests/GeneratorExpression/check-part2.cmake @@ -44,3 +44,9 @@ check(test_arbitrary_content_comma_7 ",,a") check(test_arbitrary_content_comma_8 "a,,b") check(test_arbitrary_content_comma_9 "a,,b,,") check(test_arbitrary_content_comma_10 ",,a,,b,,") +check(test_version_greater_1 "0") +check(test_version_greater_2 "1") +check(test_version_less_1 "0") +check(test_version_less_2 "1") +check(test_version_equal_1 "0") +check(test_version_equal_2 "1") -- cgit v0.12