summaryrefslogtreecommitdiff
path: root/qmake
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2021-04-23 15:42:15 +0200
committerJoerg Bornemann <joerg.bornemann@qt.io>2021-04-26 10:59:32 +0200
commit63a812b85191c9cfe0704d400df86ce7961dea12 (patch)
tree05724a51f66ac76bc1f90c57002a46411d6fb73b /qmake
parent6235893d54b8fbf5c8bd54e33cd82b55042555f1 (diff)
downloadqtbase-63a812b85191c9cfe0704d400df86ce7961dea12.tar.gz
Fix "qmake -spec foo" call for cross builds
In a cross built Qt, for example Qt for Android, calling "qmake -spec android-clang" led to an error message: "Could not find qmake spec '-qtconf'." This happened, because: - the qmake in Qt for Android is a wrapper script that calls "qmake -qtconf qt_target.conf -spec android-clang" - the first stage of command line argument handling in qmake garbled the call to "qmake -spec -qtconf qt_target.conf android-clang" We do not modify the order of arguments anymore. Instead, we skip the "-qtconf <file>" arguments in the first argument handling stage that is supposed to determine qmake's modus operandi (like -project or -query). In addition, we need to fix the assignment of QLibraryInfoPrivate::qtconfManualPath which was only done if QMakeGlobals::addCommandLineArguments returned ArgumentsOk. However, this function returns ArgumentUnknown, if it encounters an argument it cannot handle - like the project name. Now, we assign QLibraryInfoPrivate::qtconfManualPath if there was no error detected. Document the return values of addCommandLineArguments. This amends commit 661b586a69740bd9a1791622f8b238d290ebe00d. Pick-to: 6.1 6.0 Fixes: QTBUG-93079 Task-number: QTBUG-85136 Change-Id: I12ec25b17d64c00be2a3904b7c4a975b781500a0 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'qmake')
-rw-r--r--qmake/library/qmakeglobals.cpp7
-rw-r--r--qmake/option.cpp24
2 files changed, 19 insertions, 12 deletions
diff --git a/qmake/library/qmakeglobals.cpp b/qmake/library/qmakeglobals.cpp
index 247084f6c6..b4dab9ce8f 100644
--- a/qmake/library/qmakeglobals.cpp
+++ b/qmake/library/qmakeglobals.cpp
@@ -103,6 +103,13 @@ QString QMakeGlobals::cleanSpec(QMakeCmdLineParserState &state, const QString &s
return ret;
}
+/*
+ * Return value meanings:
+ * ArgumentUnknown The argument at *pos was not handled by this function.
+ * Leave it to the caller to handle this argument.
+ * ArgumentMalformed There was an error detected.
+ * ArgumentsOk All arguments were known. There are no arguments left to handle.
+ */
QMakeGlobals::ArgumentReturn QMakeGlobals::addCommandLineArguments(
QMakeCmdLineParserState &state, QStringList &args, int *pos)
{
diff --git a/qmake/option.cpp b/qmake/option.cpp
index 07cde6c949..72edf9c271 100644
--- a/qmake/option.cpp
+++ b/qmake/option.cpp
@@ -204,14 +204,13 @@ Option::parseCommandLine(QStringList &args, QMakeCmdLineParserState &state)
continue;
default:
QMakeGlobals::ArgumentReturn cmdRet = globals->addCommandLineArguments(state, args, &x);
- if (cmdRet == QMakeGlobals::ArgumentsOk) {
- QLibraryInfoPrivate::qtconfManualPath = globals->qtconf;
- break;
- }
if (cmdRet == QMakeGlobals::ArgumentMalformed) {
fprintf(stderr, "***Option %s requires a parameter\n", qPrintable(args.at(x - 1)));
return Option::QMAKE_CMDLINE_SHOW_USAGE | Option::QMAKE_CMDLINE_ERROR;
}
+ QLibraryInfoPrivate::qtconfManualPath = globals->qtconf;
+ if (cmdRet == QMakeGlobals::ArgumentsOk)
+ break;
Q_ASSERT(cmdRet == QMakeGlobals::ArgumentUnknown);
QString arg = args.at(x);
if (arg.startsWith(QLatin1Char('-'))) {
@@ -381,8 +380,9 @@ Option::init(int argc, char **argv)
for (int i = 1; i < argc; i++)
args << QString::fromLocal8Bit(argv[i]);
- while (!args.isEmpty()) {
- QString opt = args.at(0);
+ qsizetype idx = 0;
+ while (idx < args.size()) {
+ QString opt = args.at(idx);
if (opt == "-project") {
Option::recursive = true;
Option::qmake_mode = Option::QMAKE_GENERATE_PROJECT;
@@ -399,15 +399,15 @@ Option::init(int argc, char **argv)
} else if (opt == "-makefile") {
Option::qmake_mode = Option::QMAKE_GENERATE_MAKEFILE;
} else if (opt == "-qtconf") {
- if (args.length() >= 3) {
- // Move the argument following "-qtconf <file>" in front and check again.
- args.prepend(args.takeAt(2));
- continue;
- }
+ // Skip "-qtconf <file>" and proceed.
+ ++idx;
+ if (idx + 1 < args.length())
+ ++idx;
+ continue;
} else {
break;
}
- args.takeFirst();
+ args.takeAt(idx);
break;
}