summaryrefslogtreecommitdiff
path: root/src/shared/proparser/qmakebuiltins.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/proparser/qmakebuiltins.cpp')
-rw-r--r--src/shared/proparser/qmakebuiltins.cpp107
1 files changed, 87 insertions, 20 deletions
diff --git a/src/shared/proparser/qmakebuiltins.cpp b/src/shared/proparser/qmakebuiltins.cpp
index b7cbb1b3a7..787d9effb9 100644
--- a/src/shared/proparser/qmakebuiltins.cpp
+++ b/src/shared/proparser/qmakebuiltins.cpp
@@ -419,8 +419,9 @@ QMakeEvaluator::VisitReturn
QMakeEvaluator::writeFile(const QString &ctx, const QString &fn, QIODevice::OpenMode mode,
QMakeVfs::VfsFlags flags, const QString &contents)
{
- int oldId = m_vfs->idForFileName(fn, flags | QMakeVfs::VfsAccessedOnly);
- int id = m_vfs->idForFileName(fn, flags | QMakeVfs::VfsCreate);
+ const QString fileName = deviceRoot() + fn;
+ int oldId = m_vfs->idForFileName(fileName, flags | QMakeVfs::VfsAccessedOnly);
+ int id = m_vfs->idForFileName(fileName, flags | QMakeVfs::VfsCreate);
QString errStr;
if (!m_vfs->writeFile(id, mode, flags, contents, &errStr)) {
evalError(fL1S("Cannot write %1file %2: %3")
@@ -432,6 +433,65 @@ QMakeEvaluator::writeFile(const QString &ctx, const QString &fn, QIODevice::Open
return ReturnTrue;
}
+// This is the global callback
+
+QMAKE_EXPORT std::function<void(ProcessData *data)> &theProcessRunner()
+{
+ static std::function<void(ProcessData *)> runner;
+ return runner;
+}
+
+void QMakeEvaluator::runProcessHelper(ProcessData *data) const
+{
+ const QString root = deviceRoot();
+ if (root.isEmpty()) {
+
+ // The "normal" setup.
+ QProcess proc;
+
+ proc.setProcessChannelMode(data->processChannelMode);
+
+ runProcess(&proc, data->command);
+
+ data->exitCode = proc.exitCode();
+ data->exitStatus = proc.exitStatus();
+ data->stdOut = proc.readAllStandardOutput();
+ data->stdErr = proc.readAllStandardError();
+
+ } else {
+
+ // "Remote"
+ const std::function<void(ProcessData *data)> &runner = theProcessRunner();
+ if (!runner) {
+ qWarning("Missing qmake process callback");
+ data->exitCode = -1;
+ data->exitStatus = QProcess::CrashExit;
+ return;
+ }
+
+ data->workingDirectory = currentDirectory();
+# ifdef PROEVALUATOR_SETENV
+ if (!m_option->environment.isEmpty()) {
+ QProcessEnvironment env = m_option->environment;
+ static const QString dummyVar = "__qtc_dummy";
+ static const QString notSetValue = "not set";
+ const QString oldValue = env.value(dummyVar, notSetValue); // Just in case.
+ env.insert(dummyVar, "QTCREATORBUG-23504"); // Force detach.
+ if (oldValue == notSetValue)
+ env.remove(dummyVar);
+ else
+ env.insert(dummyVar, oldValue);
+ data->environment = env;
+ }
+# endif
+
+ data->deviceRoot = root;
+
+ runner(data);
+
+ }
+}
+
#ifndef QT_BOOTSTRAPPED
void QMakeEvaluator::runProcess(QProcess *proc, const QString &command) const
{
@@ -485,10 +545,15 @@ QByteArray QMakeEvaluator::getCommandOutput(const QString &args, int *exitCode)
{
QByteArray out;
#ifndef QT_BOOTSTRAPPED
- QProcess proc;
- runProcess(&proc, args);
- *exitCode = (proc.exitStatus() == QProcess::NormalExit) ? proc.exitCode() : -1;
- QByteArray errout = proc.isReadable() ? proc.readAllStandardError() : QByteArray();
+ ProcessData data;
+ data.command = args;
+
+ runProcessHelper(&data);
+
+ *exitCode = data.exitStatus == QProcess::NormalExit ? data.exitCode : -1;
+ QByteArray errout = data.stdErr;
+
+
# ifdef PROEVALUATOR_FULL
// FIXME: Qt really should have the option to set forwarding per channel
fputs(errout.constData(), stderr);
@@ -501,7 +566,7 @@ QByteArray QMakeEvaluator::getCommandOutput(const QString &args, int *exitCode)
QString::fromLocal8Bit(errout));
}
# endif
- out = proc.isReadable() ? proc.readAllStandardOutput() : QByteArray();
+ out = data.stdOut;
# ifdef Q_OS_WIN
// FIXME: Qt's line end conversion on sequential files should really be fixed
out.replace("\r\n", "\n");
@@ -1060,7 +1125,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand(
QString r = m_option->expandEnvVars(args.at(0).toQString(m_tmp1))
.replace(QLatin1Char('\\'), QLatin1Char('/'));
QString pfx;
- if (IoUtils::isRelativePath(r)) {
+ if (IoUtils::isRelativePath(deviceRoot(), r)) {
pfx = currentDirectory();
if (!pfx.endsWith(QLatin1Char('/')))
pfx += QLatin1Char('/');
@@ -1081,12 +1146,12 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand(
}
for (int d = 0; d < dirs.count(); d++) {
QString dir = dirs[d];
- QDir qdir(pfx + dir);
+ QDir qdir(deviceRoot() + pfx + dir);
for (int i = 0; i < (int)qdir.count(); ++i) {
if (qdir[i] == statics.strDot || qdir[i] == statics.strDotDot)
continue;
QString fname = dir + qdir[i];
- if (IoUtils::fileType(pfx + fname) == IoUtils::FileIsDir) {
+ if (IoUtils::fileType(deviceRoot(), pfx + fname) == IoUtils::FileIsDir) {
if (recursive)
dirs.append(fname + QLatin1Char('/'));
}
@@ -1208,7 +1273,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand(
} else {
QString arg = args.at(0).toQString(m_tmp1);
QString baseDir = args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory();
- QString rstr = arg.isEmpty() ? baseDir : IoUtils::resolvePath(baseDir, arg);
+ QString rstr = arg.isEmpty() ? baseDir : IoUtils::resolvePath(deviceRoot(), baseDir, arg);
ret << (rstr.isSharedWith(m_tmp1)
? args.at(0)
: args.count() > 1 && rstr.isSharedWith(m_tmp2)
@@ -1222,7 +1287,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand(
} else {
QString arg = args.at(0).toQString(m_tmp1);
QString baseDir = args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory();
- QString absArg = arg.isEmpty() ? baseDir : IoUtils::resolvePath(baseDir, arg);
+ QString absArg = arg.isEmpty() ? baseDir : IoUtils::resolvePath(deviceRoot(), baseDir, arg);
QString rstr = QDir(baseDir).relativeFilePath(absArg);
ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0)));
}
@@ -1405,7 +1470,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
}
QString fn = resolvePath(args.at(0).toQString(m_tmp1));
QMakeVfs::VfsFlags flags = (m_cumulative ? QMakeVfs::VfsCumulative : QMakeVfs::VfsExact);
- int pro = m_vfs->idForFileName(fn, flags | QMakeVfs::VfsAccessedOnly);
+ int pro = m_vfs->idForFileName(deviceRoot() + fn, flags | QMakeVfs::VfsAccessedOnly);
if (!pro)
return ReturnFalse;
ProValueMap &vmap = m_valuemapStack.front();
@@ -1481,7 +1546,8 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
case T_EVAL: {
VisitReturn ret = ReturnFalse;
QString contents = args.join(statics.field_sep);
- ProFile *pro = m_parser->parsedProBlock(QStringView(contents),
+ ProFile *pro = m_parser->parsedProBlock(m_current.pro->device(),
+ QStringView(contents),
0, m_current.pro->fileName(), m_current.line);
if (m_cumulative || pro->isOk()) {
m_locationStack.push(m_current);
@@ -1785,10 +1851,11 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
if (m_cumulative) // Anything else would be insanity
return ReturnFalse;
#ifndef QT_BOOTSTRAPPED
- QProcess proc;
- proc.setProcessChannelMode(QProcess::ForwardedChannels);
- runProcess(&proc, args.at(0).toQString());
- return returnBool(proc.exitStatus() == QProcess::NormalExit && proc.exitCode() == 0);
+ ProcessData data;
+ data.command = args.at(0).toQString();
+ data.processChannelMode = QProcess::ForwardedChannels;
+ runProcessHelper(&data);
+ return returnBool(data.exitStatus == QProcess::NormalExit && data.exitCode == 0);
#else
int ec = system((QLatin1String("cd ")
+ IoUtils::shellQuote(QDir::toNativeSeparators(currentDirectory()))
@@ -1817,7 +1884,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
// Don't use VFS here:
// - it supports neither listing nor even directories
// - it's unlikely that somebody would test for files they created themselves
- if (IoUtils::exists(file))
+ if (IoUtils::exists(deviceRoot(), file))
return ReturnTrue;
int slsh = file.lastIndexOf(QLatin1Char('/'));
QString fn = file.mid(slsh+1);
@@ -2052,7 +2119,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
fn = m_stashfile;
if (fn.isEmpty())
fn = QDir::cleanPath(m_outputDir + QLatin1String("/.qmake.stash"));
- if (!m_vfs->exists(fn, flags)) {
+ if (!m_vfs->exists(deviceRoot(), fn, flags)) {
printf("Info: creating stash file %s\n", qPrintable(QDir::toNativeSeparators(fn)));
valuesRef(ProKey("_QMAKE_STASH_")) << ProString(fn);
}