From fef850c51a069ed89ba400e6ffccbbea4b0cbb9f Mon Sep 17 00:00:00 2001 From: Alexey Edelev Date: Tue, 9 Mar 2021 18:03:21 +0100 Subject: [PATCH] Extend qtpaths functionally to replicate the 'qmake -query' behavior 'qt-version', 'install-prefix', 'binaries-dir' and 'plugin-dir' are covered by the introduced qt-query option. So make them obsolete and hidden in the application help. Note that the 'qtconf' option will affect the output of options associated with QLibraryInfo. [ChangeLog][Tools] qtpaths got new --qt-query argument that can be used instead of qmake -query. The new --qtconf, --query-format arguments allow you to further tweak its output. [ChangeLog][Tools] The qt-version, install-prefix, binaries-dir and plugin-dir options of the qtpaths tool are deprecated. [ChangeLog][Tools] The qtpaths tool has been moved from the qttools repository to the qtbase repository. Fixes: QTBUG-75870 Change-Id: I949acf79c8ce321811ee81cf707c1ae0eccb547d Reviewed-by: hjk Reviewed-by: Alexandru Croitor --- src/tools/qtpaths/CMakeLists.txt | 7 +++ src/tools/qtpaths/qtpaths.cpp | 75 +++++++++++++++++++++++++++++++- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/tools/qtpaths/CMakeLists.txt b/src/tools/qtpaths/CMakeLists.txt index 412ef5a0f99..e1df1d6422a 100644 --- a/src/tools/qtpaths/CMakeLists.txt +++ b/src/tools/qtpaths/CMakeLists.txt @@ -12,11 +12,18 @@ qt_internal_add_tool(${target_name} qtpaths.cpp DEFINES QT_NO_FOREACH + QTPATHS_VERSION_STR="2.0" ) ## Scopes: ##################################################################### +qt_internal_extend_target(${target_name} CONDITION QT_FEATURE_settings + LIBRARIES + QtLibraryInfo + Qt::CorePrivate +) + if(WIN32 AND TARGET ${target_name}) set_target_properties(${target_name} PROPERTIES WIN32_EXECUTABLE FALSE diff --git a/src/tools/qtpaths/qtpaths.cpp b/src/tools/qtpaths/qtpaths.cpp index 93e2e42a5fd..16fc1284f5f 100644 --- a/src/tools/qtpaths/qtpaths.cpp +++ b/src/tools/qtpaths/qtpaths.cpp @@ -58,6 +58,13 @@ #include +#if QT_CONFIG(settings) +# include +# include +# include +# include +#endif + QT_USE_NAMESPACE /** @@ -162,7 +169,7 @@ static QString searchStringOrError(QCommandLineParser *parser) int main(int argc, char **argv) { QCoreApplication app(argc, argv); - app.setApplicationVersion("1.0"); + app.setApplicationVersion(QTPATHS_VERSION_STR); #ifdef Q_OS_WIN const QLatin1Char pathsep(';'); @@ -171,8 +178,10 @@ int main(int argc, char **argv) #endif QCommandLineParser parser; - parser.setApplicationDescription(QCoreApplication::translate("qtpaths", "Command line client to QStandardPaths")); + parser.setApplicationDescription(QCoreApplication::translate("qtpaths", "Command line client to QStandardPaths and QLibraryInfo")); parser.addPositionalArgument(QCoreApplication::translate("qtpaths", "[name]"), QCoreApplication::tr("Name of file or directory")); + parser.addPositionalArgument(QCoreApplication::translate("qtpaths", "[properties]"), QCoreApplication::tr("List of the Qt properties to query by the --qt-query argument.")); + parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions); parser.addHelpOption(); parser.addVersionOption(); @@ -216,23 +225,51 @@ int main(int argc, char **argv) parser.addOption(testmode); QCommandLineOption qtversion(QStringLiteral("qt-version"), QCoreApplication::translate("qtpaths", "Qt version.")); + qtversion.setFlags(QCommandLineOption::HiddenFromHelp); parser.addOption(qtversion); QCommandLineOption installprefix(QStringLiteral("install-prefix"), QCoreApplication::translate("qtpaths", "Installation prefix for Qt.")); + installprefix.setFlags(QCommandLineOption::HiddenFromHelp); parser.addOption(installprefix); QCommandLineOption bindir(QStringList() << QStringLiteral("binaries-dir") << QStringLiteral("binaries-directory"), QCoreApplication::translate("qtpaths", "Location of Qt executables.")); + bindir.setFlags(QCommandLineOption::HiddenFromHelp); parser.addOption(bindir); QCommandLineOption plugindir(QStringList() << QStringLiteral("plugin-dir") << QStringLiteral("plugin-directory"), QCoreApplication::translate("qtpaths", "Location of Qt plugins.")); + plugindir.setFlags(QCommandLineOption::HiddenFromHelp); parser.addOption(plugindir); + QCommandLineOption query( + QStringList() << QStringLiteral("qt-query") << QStringLiteral("query"), + QCoreApplication::translate("qtpaths", + "List of Qt properties. Can be used standalone or with the " + "--query-format and --qtconf options.")); + parser.addOption(query); + + QCommandLineOption queryformat(QStringLiteral("query-format"), + QCoreApplication::translate("qtpaths", "Output format for --qt-query.\nSupported formats: qmake (default), json"), + QCoreApplication::translate("qtpaths", "format")); + queryformat.setDefaultValue("qmake"); + parser.addOption(queryformat); + + QCommandLineOption qtconf(QStringLiteral("qtconf"), + QCoreApplication::translate("qtpaths", "Path to qt.conf file that will be used to override the queried Qt properties."), + QCoreApplication::translate("qtpaths", "path")); + parser.addOption(qtconf); + parser.process(app); QStandardPaths::setTestModeEnabled(parser.isSet(testmode)); +#if QT_CONFIG(settings) + if (parser.isSet(qtconf)) { + QLibraryInfoPrivate::qtconfManualPath = parser.value(qtconf); + } +#endif + QStringList results; if (parser.isSet(qtversion)) { QString qtversionstring = QString::fromLatin1(qVersion()); @@ -310,6 +347,40 @@ int main(int argc, char **argv) QStringList paths = QStandardPaths::locateAll(location.enumvalue, searchitem, QStandardPaths::LocateFile); results << location.mapName(paths.join(pathsep)); } + +#if !QT_CONFIG(settings) + if (parser.isSet(query) || parser.isSet(qtconf) || parser.isSet(queryformat)) { + error(QStringLiteral("--qt-query, --qtconf and --query-format options are not supported. The 'settings' feature is missing.")); + } +#else + if (parser.isSet(query)) { + if (!results.isEmpty()) { + QString errorMessage = QCoreApplication::translate("qtpaths", "Several options given, only one is supported at a time."); + error(errorMessage); + } + + PropertyPrinter printer; + if (parser.isSet(queryformat)) { + QString formatValue = parser.value(queryformat); + if (formatValue == "json") { + printer = jsonPropertyPrinter; + } else if (formatValue != "qmake") { + QString errorMessage = QCoreApplication::translate("qtpaths", "Invalid output format %1. Supported formats: qmake, json").arg(formatValue); + error(errorMessage); + } + } + + QStringList optionProperties = parser.positionalArguments(); + QMakeProperty prop; + if (printer) { + return prop.queryProperty(optionProperties, printer); + } + return prop.queryProperty(optionProperties); + } else if (parser.isSet(queryformat)) { + error(QCoreApplication::translate("qtpaths", "--query-format is set, but --qt-query is not requested.")); + } +#endif + if (results.isEmpty()) { parser.showHelp(); } else if (results.size() == 1) {