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:
Oswald Buddenhagen
2013-05-16 15:21:20 +02:00
parent 314126cc75
commit 3729f4aa31

View File

@@ -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;