aboutsummaryrefslogtreecommitdiffstats
path: root/src/app
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2014-02-21 11:07:07 +0100
committerJoerg Bornemann <joerg.bornemann@digia.com>2014-02-21 11:40:40 +0100
commit500a9716746fb61e80e1a284e271d9374b08265e (patch)
treea68660c1908cddeca3fd705850ffb2ba59a7dc5e /src/app
parent956331f697037cdd5547a1569e6e77884b0bc501 (diff)
Add command line parser classes to config-ui and setup-qt.
These tools will soon get more options. Change-Id: I72ea2a180376b2e70c0c5b1119460adb3768e622 Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/app')
-rw-r--r--src/app/config-ui/commandlineparser.cpp91
-rw-r--r--src/app/config-ui/commandlineparser.h53
-rw-r--r--src/app/config-ui/config-ui.pro4
-rw-r--r--src/app/config-ui/config-ui.qbs2
-rw-r--r--src/app/config-ui/main.cpp24
-rw-r--r--src/app/qbs-setup-qt/commandlineparser.cpp120
-rw-r--r--src/app/qbs-setup-qt/commandlineparser.h61
-rw-r--r--src/app/qbs-setup-qt/main.cpp78
-rw-r--r--src/app/qbs-setup-qt/qbs-setup-qt.pro2
-rw-r--r--src/app/qbs-setup-qt/qbs-setup-qt.qbs2
10 files changed, 369 insertions, 68 deletions
diff --git a/src/app/config-ui/commandlineparser.cpp b/src/app/config-ui/commandlineparser.cpp
new file mode 100644
index 000000000..f094fb3b6
--- /dev/null
+++ b/src/app/config-ui/commandlineparser.cpp
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Build Suite.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#include "commandlineparser.h"
+
+#include <logging/translator.h>
+#include <tools/error.h>
+
+#include <QFileInfo>
+
+using qbs::Internal::Tr;
+
+static QString helpOptionShort() { return QLatin1String("-h"); }
+static QString helpOptionLong() { return QLatin1String("--help"); }
+
+void CommandLineParser::parse(const QStringList &commandLine)
+{
+ m_commandLine = commandLine;
+ Q_ASSERT(!m_commandLine.isEmpty());
+ m_command = QFileInfo(m_commandLine.takeFirst()).fileName();
+ m_helpRequested = false;
+
+ if (m_commandLine.isEmpty())
+ return;
+ const QString &arg = m_commandLine.first();
+ if (arg == helpOptionShort() || arg == helpOptionLong()) {
+ m_commandLine.removeFirst();
+ m_helpRequested = true;
+ }
+
+ if (!m_commandLine.isEmpty())
+ complainAboutExtraArguments();
+}
+
+void CommandLineParser::throwError(const QString &message)
+{
+ qbs::ErrorInfo error(Tr::tr("Syntax error: %1").arg(message));
+ error.append(usageString());
+ throw error;
+}
+
+QString CommandLineParser::usageString() const
+{
+ QString s = Tr::tr("This tool displays qbs settings in a GUI.\n"
+ "If you have more than a few settings, this might be preferable to "
+ "plain \"qbs config\", as it presents a hierarchical view.\n");
+ s += Tr::tr("Usage:\n");
+ s += Tr::tr(" %1 [%3|%4]\n")
+ .arg(m_command, helpOptionShort(), helpOptionLong());
+ return s;
+}
+
+void CommandLineParser::assignOptionArgument(const QString &option, QString &argument)
+{
+ if (m_commandLine.isEmpty())
+ throwError(Tr::tr("Option '%1' needs an argument.").arg(option));
+ argument = m_commandLine.takeFirst();
+ if (argument.isEmpty())
+ throwError(Tr::tr("Argument for option '%1' must not be empty.").arg(option));
+}
+
+void CommandLineParser::complainAboutExtraArguments()
+{
+ throwError(Tr::tr("Extraneous command-line arguments '%1'.")
+ .arg(m_commandLine.join(QLatin1String(" "))));
+}
diff --git a/src/app/config-ui/commandlineparser.h b/src/app/config-ui/commandlineparser.h
new file mode 100644
index 000000000..0a5fcab0a
--- /dev/null
+++ b/src/app/config-ui/commandlineparser.h
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Build Suite.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#ifndef QBS_CONFIGUI_COMMANDLINEPARSER_H
+#define QBS_CONFIGUI_COMMANDLINEPARSER_H
+
+#include <QStringList>
+
+class CommandLineParser
+{
+public:
+ void parse(const QStringList &commandLine);
+
+ bool helpRequested() const { return m_helpRequested; }
+
+ QString usageString() const;
+
+private:
+ void throwError(const QString &message);
+ void assignOptionArgument(const QString &option, QString &argument);
+ void complainAboutExtraArguments();
+
+ bool m_helpRequested;
+ QStringList m_commandLine;
+ QString m_command;
+};
+
+#endif // Include guard
diff --git a/src/app/config-ui/config-ui.pro b/src/app/config-ui/config-ui.pro
index 3581ef42a..601b625e4 100644
--- a/src/app/config-ui/config-ui.pro
+++ b/src/app/config-ui/config-ui.pro
@@ -6,6 +6,6 @@ greaterThan(QT_MAJOR_VERSION, 4):QT += widgets
TARGET = qbs-config-ui
-HEADERS += settingsmodel.h mainwindow.h
-SOURCES += settingsmodel.cpp mainwindow.cpp main.cpp
+HEADERS += commandlineparser.h settingsmodel.h mainwindow.h
+SOURCES += commandlineparser.cpp settingsmodel.cpp mainwindow.cpp main.cpp
FORMS += mainwindow.ui
diff --git a/src/app/config-ui/config-ui.qbs b/src/app/config-ui/config-ui.qbs
index b8856d795..c50c93a9f 100644
--- a/src/app/config-ui/config-ui.qbs
+++ b/src/app/config-ui/config-ui.qbs
@@ -6,6 +6,8 @@ QbsApp {
name: "qbs-config-ui"
consoleApplication: false
files: [
+ "commandlineparser.cpp",
+ "commandlineparser.h",
"main.cpp",
"mainwindow.cpp",
"mainwindow.h",
diff --git a/src/app/config-ui/main.cpp b/src/app/config-ui/main.cpp
index b11042b72..6515ec227 100644
--- a/src/app/config-ui/main.cpp
+++ b/src/app/config-ui/main.cpp
@@ -28,29 +28,31 @@
****************************************************************************/
#include "mainwindow.h"
-#include "../shared/logging/consolelogger.h"
-#include "../shared/qbssettings.h"
+#include "commandlineparser.h"
#include <logging/translator.h>
+#include <tools/error.h>
#include <QApplication>
#include <cstdlib>
+#include <iostream>
using qbs::Internal::Tr;
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
- SettingsPtr settings = qbsSettings();
- ConsoleLogger::instance(settings.data());
- const QStringList args = app.arguments().mid(1);
- if (args.count() == 1 &&
- (args.first() == QLatin1String("--help") || args.first() == QLatin1String("-h"))) {
- qbsInfo() << Tr::tr("This tool displays qbs settings in a GUI.\n"
- "If you have more than a few settings, this might be preferable to "
- "plain \"qbs config\", as it presents a hierarchical view.");
- return EXIT_SUCCESS;
+ CommandLineParser clParser;
+ try {
+ clParser.parse(app.arguments());
+ if (clParser.helpRequested()) {
+ std::cout << qPrintable(clParser.usageString());
+ return EXIT_SUCCESS;
+ }
+ } catch (const qbs::ErrorInfo &error) {
+ std::cerr << qPrintable(error.toString());
+ return EXIT_FAILURE;
}
MainWindow mw;
diff --git a/src/app/qbs-setup-qt/commandlineparser.cpp b/src/app/qbs-setup-qt/commandlineparser.cpp
new file mode 100644
index 000000000..d5811d1c4
--- /dev/null
+++ b/src/app/qbs-setup-qt/commandlineparser.cpp
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Build Suite.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#include "commandlineparser.h"
+
+#include <logging/translator.h>
+#include <tools/error.h>
+
+#include <QFileInfo>
+
+using qbs::Internal::Tr;
+
+static QString helpOptionShort() { return QLatin1String("-h"); }
+static QString helpOptionLong() { return QLatin1String("--help"); }
+static QString detectOption() { return QLatin1String("--detect"); }
+
+void CommandLineParser::parse(const QStringList &commandLine)
+{
+ m_commandLine = commandLine;
+ Q_ASSERT(!m_commandLine.isEmpty());
+ m_command = QFileInfo(m_commandLine.takeFirst()).fileName();
+ m_helpRequested = false;
+ m_autoDetectionMode = false;
+ m_qmakePath.clear();
+ m_profileName.clear();
+
+ if (m_commandLine.isEmpty())
+ throwError(Tr::tr("No command-line arguments provided."));
+
+ while (!m_commandLine.isEmpty()) {
+ const QString arg = m_commandLine.first();
+ if (!arg.startsWith(QLatin1String("--")))
+ break;
+ m_commandLine.removeFirst();
+ if (arg == helpOptionShort() || arg == helpOptionLong())
+ m_helpRequested = true;
+ else if (arg == detectOption())
+ m_autoDetectionMode = true;
+ }
+
+ if (m_helpRequested || m_autoDetectionMode) {
+ if (!m_commandLine.isEmpty())
+ complainAboutExtraArguments();
+ return;
+ }
+
+ switch (m_commandLine.count()) {
+ case 0:
+ case 1:
+ throwError(Tr::tr("Not enough command-line arguments provided."));
+ case 2:
+ m_qmakePath = m_commandLine.at(0);
+ m_profileName = m_commandLine.at(1);
+ break;
+ default:
+ complainAboutExtraArguments();
+ }
+}
+
+void CommandLineParser::throwError(const QString &message)
+{
+ qbs::ErrorInfo error(Tr::tr("Syntax error: %1").arg(message));
+ error.append(usageString());
+ throw error;
+}
+
+QString CommandLineParser::usageString() const
+{
+ QString s = Tr::tr("This tool creates qbs profiles from Qt versions.\n");
+ s += Tr::tr("Usage:\n");
+ s += Tr::tr(" %1 %3\n")
+ .arg(m_command, detectOption());
+ s += Tr::tr(" %1 <compiler path> <profile name>\n")
+ .arg(m_command);
+ s += Tr::tr(" %1 %2|%3\n").arg(m_command, helpOptionShort(), helpOptionLong());
+ s += Tr::tr("The first form tries to auto-detect all known Qt versions, looking them up "
+ "via the PATH environment variable.\n");
+ s += Tr::tr("The second form creates one profile for one Qt version.");
+ return s;
+}
+
+void CommandLineParser::assignOptionArgument(const QString &option, QString &argument)
+{
+ if (m_commandLine.isEmpty())
+ throwError(Tr::tr("Option '%1' needs an argument.").arg(option));
+ argument = m_commandLine.takeFirst();
+ if (argument.isEmpty())
+ throwError(Tr::tr("Argument for option '%1' must not be empty.").arg(option));
+}
+
+void CommandLineParser::complainAboutExtraArguments()
+{
+ throwError(Tr::tr("Extraneous command-line arguments '%1'.")
+ .arg(m_commandLine.join(QLatin1String(" "))));
+}
diff --git a/src/app/qbs-setup-qt/commandlineparser.h b/src/app/qbs-setup-qt/commandlineparser.h
new file mode 100644
index 000000000..21310f432
--- /dev/null
+++ b/src/app/qbs-setup-qt/commandlineparser.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Build Suite.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#ifndef QBS_SETUPQT_COMMANDLINEPARSER_H
+#define QBS_SETUPQT_COMMANDLINEPARSER_H
+
+#include <QStringList>
+
+class CommandLineParser
+{
+public:
+ void parse(const QStringList &commandLine);
+
+ bool helpRequested() const { return m_helpRequested; }
+ bool autoDetectionMode() const { return m_autoDetectionMode; }
+
+ QString qmakePath() const { return m_qmakePath; }
+ QString profileName() const { return m_profileName; }
+
+ QString usageString() const;
+
+private:
+ void throwError(const QString &message);
+ void assignOptionArgument(const QString &option, QString &argument);
+ void complainAboutExtraArguments();
+
+ bool m_helpRequested;
+ bool m_autoDetectionMode;
+ QString m_qmakePath;
+ QString m_profileName;
+ QString m_settingsDir;
+ QStringList m_commandLine;
+ QString m_command;
+};
+
+#endif // Include guard
diff --git a/src/app/qbs-setup-qt/main.cpp b/src/app/qbs-setup-qt/main.cpp
index 34adcb3e2..bbd80461c 100644
--- a/src/app/qbs-setup-qt/main.cpp
+++ b/src/app/qbs-setup-qt/main.cpp
@@ -28,53 +28,37 @@
****************************************************************************/
#include "setupqt.h"
-#include "../shared/logging/consolelogger.h"
#include "../shared/qbssettings.h"
+#include "commandlineparser.h"
#include <qtprofilesetup.h>
#include <logging/translator.h>
#include <QCoreApplication>
#include <QFileInfo>
-#include <QtDebug>
#include <QStringList>
+#include <iostream>
+
using namespace qbs;
using Internal::Tr;
-static void printWrongQMakePath(const QString &qmakePath)
-{
- qbsError() << QCoreApplication::translate("SetupQt", "Invalid path to qmake: %1").arg(qmakePath);
-}
-
-static void printUsage(const QString &appName)
-{
- qbsInfo() << Tr::tr("Usage: %1 --detect | <qmake path> [<profile name>]").arg(appName);
- qbsInfo() << Tr::tr("Use --detect to use all qmake executables found "
- "via the PATH environment variable.");
-}
-
int main(int argc, char *argv[])
{
QCoreApplication application(argc, argv);
- SettingsPtr settings = qbsSettings();
- ConsoleLogger::instance(settings.data());
- QStringList args = application.arguments();
- const QString appName = QFileInfo(args.takeFirst()).fileName();
try {
- if (args.isEmpty()) {
- printUsage(appName);
- return EXIT_FAILURE;
- }
- if (args.count() == 1 && (args.first() == QLatin1String("--help")
- || args.first() == QLatin1String("-h"))) {
- qbsInfo() << Tr::tr("This tool creates qbs profiles from Qt versions.");
- printUsage(appName);
+ CommandLineParser clParser;
+ clParser.parse(application.arguments());
+
+ if (clParser.helpRequested()) {
+ std::cout << qPrintable(clParser.usageString()) << std::endl;
return EXIT_SUCCESS;
}
- if (args.count() == 1 && args.first() == QLatin1String("--detect")) {
+ SettingsPtr settings = qbsSettings();
+
+ if (clParser.autoDetectionMode()) {
// search all Qt's in path and dump their settings
QList<QtEnvironment> qtEnvironments = SetupQt::fetchEnvironments();
foreach (const QtEnvironment &qtEnvironment, qtEnvironments) {
@@ -89,36 +73,20 @@ int main(int argc, char *argv[])
}
return EXIT_SUCCESS;
}
- if (args.count() == 1) {
- QString qmakePath = args.first();
- if (!SetupQt::isQMakePathValid(qmakePath)) {
- printWrongQMakePath(qmakePath);
- return 1;
- }
- QtEnvironment qtEnvironment = SetupQt::fetchEnvironment(qmakePath);
- QString profileName = QLatin1String("qt-") + qtEnvironment.qtVersion;
- profileName.replace(QLatin1Char('.'), QLatin1Char('-'));
- SetupQt::saveToQbsSettings(profileName , qtEnvironment, settings.data());
- return EXIT_SUCCESS;
- }
- if (args.count() == 2) {
- QString qmakePath = args.first();
- if (!SetupQt::isQMakePathValid(qmakePath)) {
- printWrongQMakePath(qmakePath);
- return 1;
- }
- QtEnvironment qtEnvironment = SetupQt::fetchEnvironment(qmakePath);
- QString profileName = args.at(1);
- profileName.replace(QLatin1Char('.'), QLatin1Char('-'));
- SetupQt::saveToQbsSettings(profileName , qtEnvironment, settings.data());
- return EXIT_SUCCESS;
+
+ if (!SetupQt::isQMakePathValid(clParser.qmakePath())) {
+ std::cerr << qPrintable(Tr::tr("'%1' does not seem to be a qmake executable.")
+ .arg(clParser.qmakePath())) << std::endl;
+ return EXIT_FAILURE;
}
- printUsage(appName);
- return EXIT_FAILURE;
+
+ QtEnvironment qtEnvironment = SetupQt::fetchEnvironment(clParser.qmakePath());
+ QString profileName = clParser.profileName();
+ profileName.replace(QLatin1Char('.'), QLatin1Char('-'));
+ SetupQt::saveToQbsSettings(profileName, qtEnvironment, settings.data());
+ return EXIT_SUCCESS;
} catch (const ErrorInfo &e) {
- qbsError() << Tr::tr("%1: %2").arg(appName, e.toString());
+ std::cerr << qPrintable(e.toString()) << std::endl;
return EXIT_FAILURE;
}
-
- return 0;
}
diff --git a/src/app/qbs-setup-qt/qbs-setup-qt.pro b/src/app/qbs-setup-qt/qbs-setup-qt.pro
index 2b87c04e2..9421dfc61 100644
--- a/src/app/qbs-setup-qt/qbs-setup-qt.pro
+++ b/src/app/qbs-setup-qt/qbs-setup-qt.pro
@@ -4,10 +4,12 @@ include($${PWD}/../../lib/qtprofilesetup/use_qtprofilesetup.pri)
TARGET = qbs-setup-qt
SOURCES += \
+ commandlineparser.cpp \
main.cpp \
setupqt.cpp
HEADERS += \
+ commandlineparser.h \
setupqt.h \
../shared/qbssettings.h
diff --git a/src/app/qbs-setup-qt/qbs-setup-qt.qbs b/src/app/qbs-setup-qt/qbs-setup-qt.qbs
index b432cd1f7..7cdf45d5c 100644
--- a/src/app/qbs-setup-qt/qbs-setup-qt.qbs
+++ b/src/app/qbs-setup-qt/qbs-setup-qt.qbs
@@ -6,6 +6,8 @@ QbsApp {
Depends { name: "qbsqtprofilesetup" }
files: [
"../shared/qbssettings.h",
+ "commandlineparser.cpp",
+ "commandlineparser.h",
"main.cpp",
"setupqt.cpp",
"setupqt.h"