diff options
author | Joerg Bornemann <joerg.bornemann@qt.io> | 2021-04-23 15:42:15 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@qt.io> | 2021-04-26 10:59:32 +0200 |
commit | 63a812b85191c9cfe0704d400df86ce7961dea12 (patch) | |
tree | 05724a51f66ac76bc1f90c57002a46411d6fb73b /qmake | |
parent | 6235893d54b8fbf5c8bd54e33cd82b55042555f1 (diff) | |
download | qtbase-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.cpp | 7 | ||||
-rw-r--r-- | qmake/option.cpp | 24 |
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; } |