diff options
Diffstat (limited to 'qmake/library')
-rw-r--r-- | qmake/library/proitems.h | 1 | ||||
-rw-r--r-- | qmake/library/qmakebuiltins.cpp | 63 | ||||
-rw-r--r-- | qmake/library/qmakeevaluator.cpp | 6 |
3 files changed, 44 insertions, 26 deletions
diff --git a/qmake/library/proitems.h b/qmake/library/proitems.h index 8f88883683..1d7ebed3aa 100644 --- a/qmake/library/proitems.h +++ b/qmake/library/proitems.h @@ -141,6 +141,7 @@ public: static uint hash(const QChar *p, int n); ALWAYS_INLINE QStringRef toQStringRef() const { return QStringRef(&m_string, m_offset, m_length); } + ALWAYS_INLINE QStringView toQStringView() const { return QStringView(m_string).mid(m_offset, m_length); } ALWAYS_INLINE ProKey &toKey() { return *(ProKey *)this; } ALWAYS_INLINE const ProKey &toKey() const { return *(const ProKey *)this; } diff --git a/qmake/library/qmakebuiltins.cpp b/qmake/library/qmakebuiltins.cpp index 1b98cbd909..759bff314e 100644 --- a/qmake/library/qmakebuiltins.cpp +++ b/qmake/library/qmakebuiltins.cpp @@ -51,6 +51,7 @@ #ifdef PROEVALUATOR_THREAD_SAFE # include <qthreadpool.h> #endif +#include <qversionnumber.h> #include <algorithm> @@ -97,6 +98,7 @@ enum ExpandFunc { enum TestFunc { T_INVALID = 0, T_REQUIRES, T_GREATERTHAN, T_LESSTHAN, T_EQUALS, + T_VERSION_AT_LEAST, T_VERSION_AT_MOST, T_EXISTS, T_EXPORT, T_CLEAR, T_UNSET, T_EVAL, T_CONFIG, T_SYSTEM, T_DEFINED, T_DISCARD_FROM, T_CONTAINS, T_INFILE, T_COUNT, T_ISEMPTY, T_PARSE_JSON, T_INCLUDE, T_LOAD, T_DEBUG, T_LOG, T_MESSAGE, T_WARNING, T_ERROR, T_IF, @@ -170,6 +172,8 @@ void QMakeEvaluator::initFunctionStatics() { "lessThan", T_LESSTHAN }, { "equals", T_EQUALS }, { "isEqual", T_EQUALS }, + { "versionAtLeast", T_VERSION_AT_LEAST }, + { "versionAtMost", T_VERSION_AT_MOST }, { "exists", T_EXISTS }, { "export", T_EXPORT }, { "clear", T_CLEAR }, @@ -569,7 +573,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( } } else { if (args.count() != 1) { - evalError(fL1S("%1(var) requires one argument.").arg(func.toQString(m_tmp1))); + evalError(fL1S("%1(var) requires one argument.").arg(func.toQStringView())); } else { var = args[0]; regexp = true; @@ -603,7 +607,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( } else { QString tmp = args.at(0).toQString(m_tmp1); for (int i = 1; i < args.count(); ++i) - tmp = tmp.arg(args.at(i).toQString(m_tmp2)); + tmp = tmp.arg(args.at(i).toQStringView()); ret << (tmp.isSharedWith(m_tmp1) ? args.at(0) : ProString(tmp).setSource(args.at(0))); } break; @@ -636,7 +640,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( leftalign = true; } else { evalError(fL1S("format_number(): invalid format option %1.") - .arg(opt.toQString(m_tmp3))); + .arg(opt.toQStringView())); goto formfail; } } @@ -649,7 +653,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( qlonglong num = args.at(0).toLongLong(&ok, ibase); if (!ok) { evalError(fL1S("format_number(): malformed number %2 for base %1.") - .arg(ibase).arg(args.at(0).toQString(m_tmp3))); + .arg(ibase).arg(args.at(0).toQStringView())); break; } QString outstr; @@ -691,7 +695,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( qlonglong num = arg.toLongLong(&ok); if (!ok) { evalError(fL1S("num_add(): malformed number %1.") - .arg(arg.toQString(m_tmp3))); + .arg(arg.toQStringView())); goto nafail; } sum += num; @@ -778,7 +782,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( case E_FIRST: case E_LAST: if (args.count() != 1) { - evalError(fL1S("%1(var) requires one argument.").arg(func.toQString(m_tmp1))); + evalError(fL1S("%1(var) requires one argument.").arg(func.toQStringView())); } else { const ProStringList &var = values(map(args.at(0))); if (!var.isEmpty()) { @@ -792,7 +796,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( case E_TAKE_FIRST: case E_TAKE_LAST: if (args.count() != 1) { - evalError(fL1S("%1(var) requires one argument.").arg(func.toQString(m_tmp1))); + evalError(fL1S("%1(var) requires one argument.").arg(func.toQStringView())); } else { ProStringList &var = valuesRef(map(args.at(0))); if (!var.isEmpty()) { @@ -1123,7 +1127,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( case E_RESOLVE_DEPENDS: if (args.count() < 1 || args.count() > 4) { evalError(fL1S("%1(var, [prefix, [suffixes, [prio-suffix]]]) requires one to four arguments.") - .arg(func.toQString(m_tmp1))); + .arg(func.toQStringView())); } else { QHash<ProKey, QSet<ProKey> > dependencies; ProValueMap dependees; @@ -1264,7 +1268,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( } break; default: - evalError(fL1S("Function '%1' is not implemented.").arg(func.toQString(m_tmp1))); + evalError(fL1S("Function '%1' is not implemented.").arg(func.toQStringView())); break; } @@ -1294,7 +1298,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( return returnBool(findValues(var, &it)); } evalError(fL1S("defined(function, type): unexpected type [%1].") - .arg(args.at(1).toQString(m_tmp1))); + .arg(args.at(1).toQStringView())); return ReturnFalse; } return returnBool(m_functionDefs.replaceFunctions.contains(var) @@ -1432,12 +1436,12 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( } if (args.count() == 1) return returnBool(isActiveConfig(args.at(0).toQStringRef())); - const auto &mutuals = args.at(1).toQStringRef().split(QLatin1Char('|')); + const auto mutuals = args.at(1).toQStringRef().split(QLatin1Char('|')); const ProStringList &configs = values(statics.strCONFIG); for (int i = configs.size() - 1; i >= 0; i--) { for (int mut = 0; mut < mutuals.count(); mut++) { - if (configs[i] == mutuals[mut].trimmed()) + if (configs[i].toQStringRef() == mutuals[mut].trimmed()) return returnBool(configs[i] == args[0]); } } @@ -1464,11 +1468,11 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( return ReturnTrue; } } else { - const auto &mutuals = args.at(2).toQStringRef().split(QLatin1Char('|')); + const auto mutuals = args.at(2).toQStringRef().split(QLatin1Char('|')); for (int i = l.size() - 1; i >= 0; i--) { const ProString val = l[i]; for (int mut = 0; mut < mutuals.count(); mut++) { - if (val == mutuals[mut].trimmed()) { + if (val.toQStringRef() == mutuals[mut].trimmed()) { return returnBool((!regx.isEmpty() && regx.exactMatch(val.toQString(m_tmp[m_toggle ^= 1]))) || val == qry); @@ -1499,7 +1503,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( || comp == QLatin1String("=") || comp == QLatin1String("==")) { // fallthrough } else { - evalError(fL1S("Unexpected modifier to count(%2).").arg(comp.toQString(m_tmp1))); + evalError(fL1S("Unexpected modifier to count(%2).").arg(comp.toQStringView())); return ReturnFalse; } } @@ -1509,7 +1513,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( case T_LESSTHAN: { if (args.count() != 2) { evalError(fL1S("%1(variable, value) requires two arguments.") - .arg(function.toQString(m_tmp1))); + .arg(function.toQStringView())); return ReturnFalse; } const ProString &rhs = args.at(1); @@ -1531,15 +1535,28 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( case T_EQUALS: if (args.count() != 2) { evalError(fL1S("%1(variable, value) requires two arguments.") - .arg(function.toQString(m_tmp1))); + .arg(function.toQStringView())); return ReturnFalse; } return returnBool(values(map(args.at(0))).join(statics.field_sep) - == args.at(1).toQStringRef()); + == args.at(1).toQStringView()); + case T_VERSION_AT_LEAST: + case T_VERSION_AT_MOST: { + if (args.count() != 2) { + evalError(fL1S("%1(variable, versionNumber) requires two arguments.") + .arg(function.toQStringView())); + return ReturnFalse; + } + const QVersionNumber lvn = QVersionNumber::fromString(values(args.at(0).toKey()).join('.')); + const QVersionNumber rvn = QVersionNumber::fromString(args.at(1).toQStringView()); + if (func_t == T_VERSION_AT_LEAST) + return returnBool(lvn >= rvn); + return returnBool(lvn <= rvn); + } case T_CLEAR: { if (args.count() != 1) { evalError(fL1S("%1(variable) requires one argument.") - .arg(function.toQString(m_tmp1))); + .arg(function.toQStringView())); return ReturnFalse; } ProValueMap *hsh; @@ -1556,7 +1573,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( case T_UNSET: { if (args.count() != 1) { evalError(fL1S("%1(variable) requires one argument.") - .arg(function.toQString(m_tmp1))); + .arg(function.toQStringView())); return ReturnFalse; } ProValueMap *hsh; @@ -1663,7 +1680,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( case T_MESSAGE: { if (args.count() != 1) { evalError(fL1S("%1(message) requires one argument.") - .arg(function.toQString(m_tmp1))); + .arg(function.toQStringView())); return ReturnFalse; } const QString &msg = m_option->expandEnvVars(args.at(0).toQString(m_tmp2)); @@ -1845,7 +1862,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( srcvar = dstvar; ProValueMap::Iterator srcvarIt; if (!findValues(srcvar, &srcvarIt)) { - evalError(fL1S("Variable %1 is not defined.").arg(srcvar.toQString(m_tmp1))); + evalError(fL1S("Variable %1 is not defined.").arg(srcvar.toQStringView())); return ReturnFalse; } // The caches for the host and target may differ (e.g., when we are manipulating @@ -1974,7 +1991,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( #endif return ReturnTrue; default: - evalError(fL1S("Function '%1' is not implemented.").arg(function.toQString(m_tmp1))); + evalError(fL1S("Function '%1' is not implemented.").arg(function.toQStringView())); return ReturnFalse; } } diff --git a/qmake/library/qmakeevaluator.cpp b/qmake/library/qmakeevaluator.cpp index 6c8112de57..6e6c72de59 100644 --- a/qmake/library/qmakeevaluator.cpp +++ b/qmake/library/qmakeevaluator.cpp @@ -1581,7 +1581,7 @@ ProString QMakeEvaluator::propertyValue(const ProKey &name) const return ProString(m_mkspecPaths.join(m_option->dirlist_sep)); ProString ret = m_option->propertyValue(name); // if (ret.isNull()) -// evalError(fL1S("Querying unknown property %1").arg(name.toQString(m_mtmp))); +// evalError(fL1S("Querying unknown property %1").arg(name.toQStringView())); return ret; } @@ -1778,7 +1778,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateConditionalFunction( } skipExpression(tokPtr); - evalError(fL1S("'%1' is not a recognized test function.").arg(func.toQString(m_tmp1))); + evalError(fL1S("'%1' is not a recognized test function.").arg(func.toQStringView())); return ReturnFalse; } @@ -1804,7 +1804,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateExpandFunction( } skipExpression(tokPtr); - evalError(fL1S("'%1' is not a recognized replace function.").arg(func.toQString(m_tmp1))); + evalError(fL1S("'%1' is not a recognized replace function.").arg(func.toQStringView())); return ReturnFalse; } |