forked from qt-creator/qt-creator
make stubs for dangerous/useless qmake functions in limited mode
instead of having them "not implemented" (and consequently getting errors), just let requires(), system(), mkpath(), write_file(), touch() and cache() do nothing. this is likely to cause followup failures which are harder to detect, but the amount of scary noise we are producing now is not really acceptable. furthermore, in qtcreator these failures actually terminate the "precise" evaluation, which breaks Run Configurations. Task-number: QTBUG-28159 (in different repo) Task-number: QTCREATORBUG-8550 Change-Id: I1bdeb759e895e4200f09332dadf8a6cef348182f Reviewed-by: Daniel Teske <daniel.teske@digia.com> Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com> (cherry picked from qttools/94ab2efb2d155d3c1ca7b91c1daf443a149bcf1f) Reviewed-by: Eike Ziller <eike.ziller@digia.com>
This commit is contained in:
@@ -1106,11 +1106,11 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ReturnFalse;
|
return ReturnFalse;
|
||||||
#ifdef PROEVALUATOR_FULL
|
|
||||||
case T_REQUIRES:
|
case T_REQUIRES:
|
||||||
|
#ifdef PROEVALUATOR_FULL
|
||||||
checkRequirements(args);
|
checkRequirements(args);
|
||||||
return ReturnFalse; // Another qmake breakage
|
|
||||||
#endif
|
#endif
|
||||||
|
return ReturnFalse; // Another qmake breakage
|
||||||
case T_EVAL: {
|
case T_EVAL: {
|
||||||
VisitReturn ret = ReturnFalse;
|
VisitReturn ret = ReturnFalse;
|
||||||
ProFile *pro = m_parser->parsedProBlock(args.join(statics.field_sep),
|
ProFile *pro = m_parser->parsedProBlock(args.join(statics.field_sep),
|
||||||
@@ -1377,14 +1377,14 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
|
|||||||
}
|
}
|
||||||
return (func_t == T_ERROR && !m_cumulative) ? ReturnError : ReturnTrue;
|
return (func_t == T_ERROR && !m_cumulative) ? ReturnError : ReturnTrue;
|
||||||
}
|
}
|
||||||
#ifdef PROEVALUATOR_FULL
|
|
||||||
case T_SYSTEM: {
|
case T_SYSTEM: {
|
||||||
if (m_cumulative) // Anything else would be insanity
|
|
||||||
return ReturnFalse;
|
|
||||||
if (args.count() != 1) {
|
if (args.count() != 1) {
|
||||||
evalError(fL1S("system(exec) requires one argument."));
|
evalError(fL1S("system(exec) requires one argument."));
|
||||||
return ReturnFalse;
|
return ReturnFalse;
|
||||||
}
|
}
|
||||||
|
#ifdef PROEVALUATOR_FULL
|
||||||
|
if (m_cumulative) // Anything else would be insanity
|
||||||
|
return ReturnFalse;
|
||||||
#ifndef QT_BOOTSTRAPPED
|
#ifndef QT_BOOTSTRAPPED
|
||||||
QProcess proc;
|
QProcess proc;
|
||||||
proc.setProcessChannelMode(QProcess::ForwardedChannels);
|
proc.setProcessChannelMode(QProcess::ForwardedChannels);
|
||||||
@@ -1395,8 +1395,10 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
|
|||||||
+ IoUtils::shellQuote(QDir::toNativeSeparators(currentDirectory()))
|
+ IoUtils::shellQuote(QDir::toNativeSeparators(currentDirectory()))
|
||||||
+ QLatin1String(" && ") + args.at(0)).toLocal8Bit().constData()) == 0);
|
+ QLatin1String(" && ") + args.at(0)).toLocal8Bit().constData()) == 0);
|
||||||
#endif
|
#endif
|
||||||
}
|
#else
|
||||||
|
return ReturnTrue;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
case T_ISEMPTY: {
|
case T_ISEMPTY: {
|
||||||
if (args.count() != 1) {
|
if (args.count() != 1) {
|
||||||
evalError(fL1S("isEmpty(var) requires one argument."));
|
evalError(fL1S("isEmpty(var) requires one argument."));
|
||||||
@@ -1423,17 +1425,18 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
|
|||||||
|
|
||||||
return ReturnFalse;
|
return ReturnFalse;
|
||||||
}
|
}
|
||||||
#ifdef PROEVALUATOR_FULL
|
|
||||||
case T_MKPATH: {
|
case T_MKPATH: {
|
||||||
if (args.count() != 1) {
|
if (args.count() != 1) {
|
||||||
evalError(fL1S("mkpath(file) requires one argument."));
|
evalError(fL1S("mkpath(file) requires one argument."));
|
||||||
return ReturnFalse;
|
return ReturnFalse;
|
||||||
}
|
}
|
||||||
|
#ifdef PROEVALUATOR_FULL
|
||||||
const QString &fn = resolvePath(args.at(0).toQString(m_tmp1));
|
const QString &fn = resolvePath(args.at(0).toQString(m_tmp1));
|
||||||
if (!QDir::current().mkpath(fn)) {
|
if (!QDir::current().mkpath(fn)) {
|
||||||
evalError(fL1S("Cannot create directory %1.").arg(QDir::toNativeSeparators(fn)));
|
evalError(fL1S("Cannot create directory %1.").arg(QDir::toNativeSeparators(fn)));
|
||||||
return ReturnFalse;
|
return ReturnFalse;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return ReturnTrue;
|
return ReturnTrue;
|
||||||
}
|
}
|
||||||
case T_WRITE_FILE: {
|
case T_WRITE_FILE: {
|
||||||
@@ -1441,6 +1444,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
|
|||||||
evalError(fL1S("write_file(name, [content var, [append]]) requires one to three arguments."));
|
evalError(fL1S("write_file(name, [content var, [append]]) requires one to three arguments."));
|
||||||
return ReturnFalse;
|
return ReturnFalse;
|
||||||
}
|
}
|
||||||
|
#ifdef PROEVALUATOR_FULL
|
||||||
QIODevice::OpenMode mode = QIODevice::Truncate;
|
QIODevice::OpenMode mode = QIODevice::Truncate;
|
||||||
QString contents;
|
QString contents;
|
||||||
if (args.count() >= 2) {
|
if (args.count() >= 2) {
|
||||||
@@ -1452,12 +1456,16 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
|
|||||||
mode = QIODevice::Append;
|
mode = QIODevice::Append;
|
||||||
}
|
}
|
||||||
return writeFile(QString(), resolvePath(args.at(0).toQString(m_tmp1)), mode, contents);
|
return writeFile(QString(), resolvePath(args.at(0).toQString(m_tmp1)), mode, contents);
|
||||||
|
#else
|
||||||
|
return ReturnTrue;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
case T_TOUCH: {
|
case T_TOUCH: {
|
||||||
if (args.count() != 2) {
|
if (args.count() != 2) {
|
||||||
evalError(fL1S("touch(file, reffile) requires two arguments."));
|
evalError(fL1S("touch(file, reffile) requires two arguments."));
|
||||||
return ReturnFalse;
|
return ReturnFalse;
|
||||||
}
|
}
|
||||||
|
#ifdef PROEVALUATOR_FULL
|
||||||
const QString &tfn = resolvePath(args.at(0).toQString(m_tmp1));
|
const QString &tfn = resolvePath(args.at(0).toQString(m_tmp1));
|
||||||
const QString &rfn = resolvePath(args.at(1).toQString(m_tmp2));
|
const QString &rfn = resolvePath(args.at(1).toQString(m_tmp2));
|
||||||
#ifdef Q_OS_UNIX
|
#ifdef Q_OS_UNIX
|
||||||
@@ -1493,6 +1501,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
|
|||||||
}
|
}
|
||||||
SetFileTime(wHand, 0, 0, &ft);
|
SetFileTime(wHand, 0, 0, &ft);
|
||||||
CloseHandle(wHand);
|
CloseHandle(wHand);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
return ReturnTrue;
|
return ReturnTrue;
|
||||||
}
|
}
|
||||||
@@ -1501,6 +1510,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
|
|||||||
evalError(fL1S("cache(var, [set|add|sub] [transient] [super], [srcvar]) requires one to three arguments."));
|
evalError(fL1S("cache(var, [set|add|sub] [transient] [super], [srcvar]) requires one to three arguments."));
|
||||||
return ReturnFalse;
|
return ReturnFalse;
|
||||||
}
|
}
|
||||||
|
#ifdef PROEVALUATOR_FULL
|
||||||
bool persist = true;
|
bool persist = true;
|
||||||
bool super = false;
|
bool super = false;
|
||||||
enum { CacheSet, CacheAdd, CacheSub } mode = CacheSet;
|
enum { CacheSet, CacheAdd, CacheSub } mode = CacheSet;
|
||||||
@@ -1626,8 +1636,10 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
|
|||||||
fn = m_cachefile;
|
fn = m_cachefile;
|
||||||
}
|
}
|
||||||
return writeFile(fL1S("cache "), fn, QIODevice::Append, varstr);
|
return writeFile(fL1S("cache "), fn, QIODevice::Append, varstr);
|
||||||
}
|
#else
|
||||||
|
return ReturnTrue;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
evalError(fL1S("Function '%1' is not implemented.").arg(function.toQString(m_tmp1)));
|
evalError(fL1S("Function '%1' is not implemented.").arg(function.toQString(m_tmp1)));
|
||||||
return ReturnFalse;
|
return ReturnFalse;
|
||||||
|
|||||||
Reference in New Issue
Block a user