mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-01 11:50:11 -05:00
Merge topic 'add-extra-boolean-comparisons'
02d177c9 Add additional <= and >= comparison operators
This commit is contained in:
+2
-5
@@ -366,11 +366,8 @@ bool cmCTest::ShouldCompressTestOutput()
|
||||
if (!this->ComputedCompressTestOutput) {
|
||||
std::string cdashVersion = this->GetCDashVersion();
|
||||
// version >= 1.6?
|
||||
bool cdashSupportsGzip =
|
||||
cmSystemTools::VersionCompare(cmSystemTools::OP_GREATER,
|
||||
cdashVersion.c_str(), "1.6") ||
|
||||
cmSystemTools::VersionCompare(cmSystemTools::OP_EQUAL,
|
||||
cdashVersion.c_str(), "1.6");
|
||||
bool cdashSupportsGzip = cmSystemTools::VersionCompare(
|
||||
cmSystemTools::OP_GREATER_EQUAL, cdashVersion.c_str(), "1.6");
|
||||
this->CompressTestOutput &= cdashSupportsGzip;
|
||||
this->ComputedCompressTestOutput = true;
|
||||
}
|
||||
|
||||
@@ -21,12 +21,14 @@ static std::string const keyDEFINED = "DEFINED";
|
||||
static std::string const keyEQUAL = "EQUAL";
|
||||
static std::string const keyEXISTS = "EXISTS";
|
||||
static std::string const keyGREATER = "GREATER";
|
||||
static std::string const keyGREATER_EQUAL = "GREATER_EQUAL";
|
||||
static std::string const keyIN_LIST = "IN_LIST";
|
||||
static std::string const keyIS_ABSOLUTE = "IS_ABSOLUTE";
|
||||
static std::string const keyIS_DIRECTORY = "IS_DIRECTORY";
|
||||
static std::string const keyIS_NEWER_THAN = "IS_NEWER_THAN";
|
||||
static std::string const keyIS_SYMLINK = "IS_SYMLINK";
|
||||
static std::string const keyLESS = "LESS";
|
||||
static std::string const keyLESS_EQUAL = "LESS_EQUAL";
|
||||
static std::string const keyMATCHES = "MATCHES";
|
||||
static std::string const keyNOT = "NOT";
|
||||
static std::string const keyOR = "OR";
|
||||
@@ -35,12 +37,16 @@ static std::string const keyParenR = ")";
|
||||
static std::string const keyPOLICY = "POLICY";
|
||||
static std::string const keySTREQUAL = "STREQUAL";
|
||||
static std::string const keySTRGREATER = "STRGREATER";
|
||||
static std::string const keySTRGREATER_EQUAL = "STRGREATER_EQUAL";
|
||||
static std::string const keySTRLESS = "STRLESS";
|
||||
static std::string const keySTRLESS_EQUAL = "STRLESS_EQUAL";
|
||||
static std::string const keyTARGET = "TARGET";
|
||||
static std::string const keyTEST = "TEST";
|
||||
static std::string const keyVERSION_EQUAL = "VERSION_EQUAL";
|
||||
static std::string const keyVERSION_GREATER = "VERSION_GREATER";
|
||||
static std::string const keyVERSION_GREATER_EQUAL = "VERSION_GREATER_EQUAL";
|
||||
static std::string const keyVERSION_LESS = "VERSION_LESS";
|
||||
static std::string const keyVERSION_LESS_EQUAL = "VERSION_LESS_EQUAL";
|
||||
|
||||
cmConditionEvaluator::cmConditionEvaluator(cmMakefile& makefile,
|
||||
const cmListFileContext& context,
|
||||
@@ -559,7 +565,9 @@ bool cmConditionEvaluator::HandleLevel2(cmArgumentList& newArgs,
|
||||
|
||||
if (argP1 != newArgs.end() && argP2 != newArgs.end() &&
|
||||
(this->IsKeyword(keyLESS, *argP1) ||
|
||||
this->IsKeyword(keyLESS_EQUAL, *argP1) ||
|
||||
this->IsKeyword(keyGREATER, *argP1) ||
|
||||
this->IsKeyword(keyGREATER_EQUAL, *argP1) ||
|
||||
this->IsKeyword(keyEQUAL, *argP1))) {
|
||||
def = this->GetVariableOrString(*arg);
|
||||
def2 = this->GetVariableOrString(*argP2);
|
||||
@@ -570,8 +578,12 @@ bool cmConditionEvaluator::HandleLevel2(cmArgumentList& newArgs,
|
||||
result = false;
|
||||
} else if (*(argP1) == keyLESS) {
|
||||
result = (lhs < rhs);
|
||||
} else if (*(argP1) == keyLESS_EQUAL) {
|
||||
result = (lhs <= rhs);
|
||||
} else if (*(argP1) == keyGREATER) {
|
||||
result = (lhs > rhs);
|
||||
} else if (*(argP1) == keyGREATER_EQUAL) {
|
||||
result = (lhs >= rhs);
|
||||
} else {
|
||||
result = (lhs == rhs);
|
||||
}
|
||||
@@ -580,16 +592,22 @@ bool cmConditionEvaluator::HandleLevel2(cmArgumentList& newArgs,
|
||||
|
||||
if (argP1 != newArgs.end() && argP2 != newArgs.end() &&
|
||||
(this->IsKeyword(keySTRLESS, *argP1) ||
|
||||
this->IsKeyword(keySTREQUAL, *argP1) ||
|
||||
this->IsKeyword(keySTRGREATER, *argP1))) {
|
||||
this->IsKeyword(keySTRLESS_EQUAL, *argP1) ||
|
||||
this->IsKeyword(keySTRGREATER, *argP1) ||
|
||||
this->IsKeyword(keySTRGREATER_EQUAL, *argP1) ||
|
||||
this->IsKeyword(keySTREQUAL, *argP1))) {
|
||||
def = this->GetVariableOrString(*arg);
|
||||
def2 = this->GetVariableOrString(*argP2);
|
||||
int val = strcmp(def, def2);
|
||||
bool result;
|
||||
if (*(argP1) == keySTRLESS) {
|
||||
result = (val < 0);
|
||||
} else if (*(argP1) == keySTRLESS_EQUAL) {
|
||||
result = (val <= 0);
|
||||
} else if (*(argP1) == keySTRGREATER) {
|
||||
result = (val > 0);
|
||||
} else if (*(argP1) == keySTRGREATER_EQUAL) {
|
||||
result = (val >= 0);
|
||||
} else // strequal
|
||||
{
|
||||
result = (val == 0);
|
||||
@@ -599,15 +617,23 @@ bool cmConditionEvaluator::HandleLevel2(cmArgumentList& newArgs,
|
||||
|
||||
if (argP1 != newArgs.end() && argP2 != newArgs.end() &&
|
||||
(this->IsKeyword(keyVERSION_LESS, *argP1) ||
|
||||
this->IsKeyword(keyVERSION_LESS_EQUAL, *argP1) ||
|
||||
this->IsKeyword(keyVERSION_GREATER, *argP1) ||
|
||||
this->IsKeyword(keyVERSION_GREATER_EQUAL, *argP1) ||
|
||||
this->IsKeyword(keyVERSION_EQUAL, *argP1))) {
|
||||
def = this->GetVariableOrString(*arg);
|
||||
def2 = this->GetVariableOrString(*argP2);
|
||||
cmSystemTools::CompareOp op = cmSystemTools::OP_EQUAL;
|
||||
cmSystemTools::CompareOp op;
|
||||
if (*argP1 == keyVERSION_LESS) {
|
||||
op = cmSystemTools::OP_LESS;
|
||||
} else if (*argP1 == keyVERSION_LESS_EQUAL) {
|
||||
op = cmSystemTools::OP_LESS_EQUAL;
|
||||
} else if (*argP1 == keyVERSION_GREATER) {
|
||||
op = cmSystemTools::OP_GREATER;
|
||||
} else if (*argP1 == keyVERSION_GREATER_EQUAL) {
|
||||
op = cmSystemTools::OP_GREATER_EQUAL;
|
||||
} else { // version_equal
|
||||
op = cmSystemTools::OP_EQUAL;
|
||||
}
|
||||
bool result = cmSystemTools::VersionCompare(op, def, def2);
|
||||
this->HandleBinaryOp(result, reducible, arg, newArgs, argP1, argP2);
|
||||
|
||||
@@ -545,6 +545,25 @@ static const struct VersionGreaterNode : public cmGeneratorExpressionNode
|
||||
}
|
||||
} versionGreaterNode;
|
||||
|
||||
static const struct VersionGreaterEqNode : public cmGeneratorExpressionNode
|
||||
{
|
||||
VersionGreaterEqNode() {}
|
||||
|
||||
int NumExpectedParameters() const CM_OVERRIDE { return 2; }
|
||||
|
||||
std::string Evaluate(const std::vector<std::string>& parameters,
|
||||
cmGeneratorExpressionContext*,
|
||||
const GeneratorExpressionContent*,
|
||||
cmGeneratorExpressionDAGChecker*) const CM_OVERRIDE
|
||||
{
|
||||
return cmSystemTools::VersionCompare(cmSystemTools::OP_GREATER_EQUAL,
|
||||
parameters.front().c_str(),
|
||||
parameters[1].c_str())
|
||||
? "1"
|
||||
: "0";
|
||||
}
|
||||
} versionGreaterEqNode;
|
||||
|
||||
static const struct VersionLessNode : public cmGeneratorExpressionNode
|
||||
{
|
||||
VersionLessNode() {}
|
||||
@@ -564,6 +583,25 @@ static const struct VersionLessNode : public cmGeneratorExpressionNode
|
||||
}
|
||||
} versionLessNode;
|
||||
|
||||
static const struct VersionLessEqNode : public cmGeneratorExpressionNode
|
||||
{
|
||||
VersionLessEqNode() {}
|
||||
|
||||
int NumExpectedParameters() const CM_OVERRIDE { return 2; }
|
||||
|
||||
std::string Evaluate(const std::vector<std::string>& parameters,
|
||||
cmGeneratorExpressionContext*,
|
||||
const GeneratorExpressionContent*,
|
||||
cmGeneratorExpressionDAGChecker*) const CM_OVERRIDE
|
||||
{
|
||||
return cmSystemTools::VersionCompare(cmSystemTools::OP_LESS_EQUAL,
|
||||
parameters.front().c_str(),
|
||||
parameters[1].c_str())
|
||||
? "1"
|
||||
: "0";
|
||||
}
|
||||
} versionLessEqNode;
|
||||
|
||||
static const struct VersionEqualNode : public cmGeneratorExpressionNode
|
||||
{
|
||||
VersionEqualNode() {}
|
||||
@@ -1641,7 +1679,9 @@ const cmGeneratorExpressionNode* cmGeneratorExpressionNode::GetNode(
|
||||
nodeMap["C_COMPILER_ID"] = &cCompilerIdNode;
|
||||
nodeMap["CXX_COMPILER_ID"] = &cxxCompilerIdNode;
|
||||
nodeMap["VERSION_GREATER"] = &versionGreaterNode;
|
||||
nodeMap["VERSION_GREATER_EQUAL"] = &versionGreaterEqNode;
|
||||
nodeMap["VERSION_LESS"] = &versionLessNode;
|
||||
nodeMap["VERSION_LESS_EQUAL"] = &versionLessEqNode;
|
||||
nodeMap["VERSION_EQUAL"] = &versionEqualNode;
|
||||
nodeMap["C_COMPILER_VERSION"] = &cCompilerVersionNode;
|
||||
nodeMap["CXX_COMPILER_VERSION"] = &cxxCompilerVersionNode;
|
||||
|
||||
@@ -485,7 +485,8 @@ bool cmStringCommand::HandleCompareCommand(
|
||||
}
|
||||
std::string mode = args[1];
|
||||
if ((mode == "EQUAL") || (mode == "NOTEQUAL") || (mode == "LESS") ||
|
||||
(mode == "GREATER")) {
|
||||
(mode == "LESS_EQUAL") || (mode == "GREATER") ||
|
||||
(mode == "GREATER_EQUAL")) {
|
||||
if (args.size() < 5) {
|
||||
std::string e = "sub-command COMPARE, mode ";
|
||||
e += mode;
|
||||
@@ -500,8 +501,12 @@ bool cmStringCommand::HandleCompareCommand(
|
||||
bool result;
|
||||
if (mode == "LESS") {
|
||||
result = (left < right);
|
||||
} else if (mode == "LESS_EQUAL") {
|
||||
result = (left <= right);
|
||||
} else if (mode == "GREATER") {
|
||||
result = (left > right);
|
||||
} else if (mode == "GREATER_EQUAL") {
|
||||
result = (left >= right);
|
||||
} else if (mode == "EQUAL") {
|
||||
result = (left == right);
|
||||
} else // if(mode == "NOTEQUAL")
|
||||
|
||||
@@ -2380,10 +2380,10 @@ bool cmSystemTools::VersionCompare(cmSystemTools::CompareOp op,
|
||||
|
||||
if (lhs < rhs) {
|
||||
// lhs < rhs, so true if operation is LESS
|
||||
return op == cmSystemTools::OP_LESS;
|
||||
return (op & cmSystemTools::OP_LESS) != 0;
|
||||
} else if (lhs > rhs) {
|
||||
// lhs > rhs, so true if operation is GREATER
|
||||
return op == cmSystemTools::OP_GREATER;
|
||||
return (op & cmSystemTools::OP_GREATER) != 0;
|
||||
}
|
||||
|
||||
if (*endr == '.') {
|
||||
@@ -2395,7 +2395,7 @@ bool cmSystemTools::VersionCompare(cmSystemTools::CompareOp op,
|
||||
}
|
||||
}
|
||||
// lhs == rhs, so true if operation is EQUAL
|
||||
return op == cmSystemTools::OP_EQUAL;
|
||||
return (op & cmSystemTools::OP_EQUAL) != 0;
|
||||
}
|
||||
|
||||
bool cmSystemTools::VersionCompareEqual(std::string const& lhs,
|
||||
@@ -2412,6 +2412,13 @@ bool cmSystemTools::VersionCompareGreater(std::string const& lhs,
|
||||
rhs.c_str());
|
||||
}
|
||||
|
||||
bool cmSystemTools::VersionCompareGreaterEq(std::string const& lhs,
|
||||
std::string const& rhs)
|
||||
{
|
||||
return cmSystemTools::VersionCompare(cmSystemTools::OP_GREATER_EQUAL,
|
||||
lhs.c_str(), rhs.c_str());
|
||||
}
|
||||
|
||||
bool cmSystemTools::RemoveRPath(std::string const& file, std::string* emsg,
|
||||
bool* removed)
|
||||
{
|
||||
|
||||
@@ -284,9 +284,11 @@ public:
|
||||
|
||||
enum CompareOp
|
||||
{
|
||||
OP_LESS,
|
||||
OP_GREATER,
|
||||
OP_EQUAL
|
||||
OP_EQUAL = 1,
|
||||
OP_LESS = 2,
|
||||
OP_GREATER = 4,
|
||||
OP_LESS_EQUAL = OP_LESS | OP_EQUAL,
|
||||
OP_GREATER_EQUAL = OP_GREATER | OP_EQUAL
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -297,6 +299,8 @@ public:
|
||||
std::string const& rhs);
|
||||
static bool VersionCompareGreater(std::string const& lhs,
|
||||
std::string const& rhs);
|
||||
static bool VersionCompareGreaterEq(std::string const& lhs,
|
||||
std::string const& rhs);
|
||||
|
||||
/**
|
||||
* Determine the file type based on the extension
|
||||
|
||||
Reference in New Issue
Block a user