summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Edelev <alexey.edelev@qt.io>2021-03-09 16:32:02 +0100
committerAlexey Edelev <alexey.edelev@qt.io>2021-03-12 13:20:00 +0100
commit5db85796206666bea8c47ea1a0c1cdb2fa863ffc (patch)
tree0bca21c20f78ff5659daead85dda36a67ed5b011
parentf0862c08f1a15baff20bca1d4c0fd9f331671b46 (diff)
Add support for various output formats for QMakeProperty
Add the ability to select a standard and json output formats of the Qt properties. This patch also improves the encapsulation of QMakeProperty. Change-Id: Ib1d232be1b430ed8456ce65cc98141282e4c3f7f Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
-rw-r--r--qmake/CMakeLists.txt1
-rw-r--r--qmake/main.cpp16
-rw-r--r--qmake/property.cpp129
-rw-r--r--qmake/property.h8
-rw-r--r--qmake/propertyprinter.cpp68
-rw-r--r--qmake/propertyprinter.h58
6 files changed, 213 insertions, 67 deletions
diff --git a/qmake/CMakeLists.txt b/qmake/CMakeLists.txt
index 0a49c9db79..b89cf25f10 100644
--- a/qmake/CMakeLists.txt
+++ b/qmake/CMakeLists.txt
@@ -9,6 +9,7 @@ add_library(QtLibraryInfo OBJECT
library/proitems.cpp library/proitems.h
library/qmake_global.h
property.cpp property.h
+ propertyprinter.cpp propertyprinter.h
qmakelibraryinfo.cpp qmakelibraryinfo.h
)
set_target_properties(QtLibraryInfo PROPERTIES
diff --git a/qmake/main.cpp b/qmake/main.cpp
index 3180d5c826..b00d110827 100644
--- a/qmake/main.cpp
+++ b/qmake/main.cpp
@@ -508,10 +508,18 @@ int runQMake(int argc, char **argv)
}
QMakeProperty prop;
- if(Option::qmake_mode == Option::QMAKE_QUERY_PROPERTY ||
- Option::qmake_mode == Option::QMAKE_SET_PROPERTY ||
- Option::qmake_mode == Option::QMAKE_UNSET_PROPERTY)
- return prop.exec() ? 0 : 101;
+ switch (Option::qmake_mode) {
+ case Option::QMAKE_QUERY_PROPERTY:
+ return prop.queryProperty(Option::prop::properties);
+ case Option::QMAKE_SET_PROPERTY:
+ return prop.setProperty(Option::prop::properties);
+ case Option::QMAKE_UNSET_PROPERTY:
+ prop.unsetProperty(Option::prop::properties);
+ return 0;
+ default:
+ break;
+ }
+
globals.setQMakeProperty(&prop);
ProFileCache proFileCache;
diff --git a/qmake/property.cpp b/qmake/property.cpp
index 0ef9813eee..2a1c4170b9 100644
--- a/qmake/property.cpp
+++ b/qmake/property.cpp
@@ -27,7 +27,6 @@
****************************************************************************/
#include "property.h"
-#include "option.h"
#include <qdir.h>
#include <qsettings.h>
@@ -35,6 +34,11 @@
#include <qstringlist.h>
#include <stdio.h>
+namespace {
+constexpr int PropSuccessRetCode = 0;
+constexpr int PropFailRetCode = 101;
+}
+
QT_BEGIN_NAMESPACE
static const struct {
@@ -146,76 +150,79 @@ QMakeProperty::remove(const QString &var)
settings->remove(var);
}
-bool
-QMakeProperty::exec()
+int QMakeProperty::queryProperty(const QStringList &optionProperties,
+ const PropertyPrinter &printer)
{
- bool ret = true;
- if (Option::qmake_mode == Option::QMAKE_QUERY_PROPERTY) {
- if (Option::prop::properties.isEmpty()) {
- initSettings();
- const auto keys = settings->childKeys();
- for (const QString &key : keys) {
- QString val = settings->value(key).toString();
- fprintf(stdout, "%s:%s\n", qPrintable(key), qPrintable(val));
- }
- QStringList specialProps;
- for (unsigned i = 0; i < sizeof(propList)/sizeof(propList[0]); i++)
- specialProps.append(QString::fromLatin1(propList[i].name));
- specialProps.append("QMAKE_VERSION");
+ QList<QPair<QString, QString>> output;
+ int ret = PropSuccessRetCode;
+ if (optionProperties.isEmpty()) {
+ initSettings();
+ const auto keys = settings->childKeys();
+ for (const QString &key : keys) {
+ QString val = settings->value(key).toString();
+ output.append({ key, val });
+ }
+ QStringList specialProps;
+ for (unsigned i = 0; i < sizeof(propList) / sizeof(propList[0]); i++)
+ specialProps.append(QString::fromLatin1(propList[i].name));
+#ifdef QMAKE_VERSION_STR
+ specialProps.append("QMAKE_VERSION");
+#endif
#ifdef QT_VERSION_STR
- specialProps.append("QT_VERSION");
+ specialProps.append("QT_VERSION");
#endif
- for (const QString &prop : qAsConst(specialProps)) {
- ProString val = value(ProKey(prop));
- ProString pval = value(ProKey(prop + "/raw"));
- ProString gval = value(ProKey(prop + "/get"));
- ProString sval = value(ProKey(prop + "/src"));
- ProString dval = value(ProKey(prop + "/dev"));
- fprintf(stdout, "%s:%s\n", prop.toLatin1().constData(), val.toLatin1().constData());
- if (!pval.isEmpty() && pval != val)
- fprintf(stdout, "%s/raw:%s\n", prop.toLatin1().constData(), pval.toLatin1().constData());
- if (!gval.isEmpty() && gval != (pval.isEmpty() ? val : pval))
- fprintf(stdout, "%s/get:%s\n", prop.toLatin1().constData(), gval.toLatin1().constData());
- if (!sval.isEmpty() && sval != gval)
- fprintf(stdout, "%s/src:%s\n", prop.toLatin1().constData(), sval.toLatin1().constData());
- if (!dval.isEmpty() && dval != pval)
- fprintf(stdout, "%s/dev:%s\n", prop.toLatin1().constData(), dval.toLatin1().constData());
- }
- return true;
+ for (const QString &prop : qAsConst(specialProps)) {
+ ProString val = value(ProKey(prop));
+ ProString pval = value(ProKey(prop + "/raw"));
+ ProString gval = value(ProKey(prop + "/get"));
+ ProString sval = value(ProKey(prop + "/src"));
+ ProString dval = value(ProKey(prop + "/dev"));
+ output.append({ prop, val.toQString() });
+ if (!pval.isEmpty() && pval != val)
+ output.append({ prop + "/raw", pval.toQString() });
+ if (!gval.isEmpty() && gval != (pval.isEmpty() ? val : pval))
+ output.append({ prop + "/get", gval.toQString() });
+ if (!sval.isEmpty() && sval != gval)
+ output.append({ prop + "/src", sval.toQString() });
+ if (!dval.isEmpty() && dval != pval)
+ output.append({ prop + "/dev", dval.toQString() });
}
- for (QStringList::ConstIterator it = Option::prop::properties.cbegin();
- it != Option::prop::properties.cend(); it++) {
- if (Option::prop::properties.count() > 1)
- fprintf(stdout, "%s:", (*it).toLatin1().constData());
- const ProKey pkey(*it);
+ } else {
+ for (const auto &prop : optionProperties) {
+ const ProKey pkey(prop);
if (!hasValue(pkey)) {
- ret = false;
- fprintf(stdout, "**Unknown**\n");
+ ret = PropFailRetCode;
+ output.append({ prop, QString("**Unknown**") });
} else {
- fprintf(stdout, "%s\n", value(pkey).toLatin1().constData());
- }
- }
- } else if(Option::qmake_mode == Option::QMAKE_SET_PROPERTY) {
- for (QStringList::ConstIterator it = Option::prop::properties.cbegin();
- it != Option::prop::properties.cend(); it++) {
- QString var = (*it);
- it++;
- if (it == Option::prop::properties.cend()) {
- ret = false;
- break;
+ output.append({ prop, value(pkey).toQString() });
}
- if(!var.startsWith("."))
- setValue(var, (*it));
- }
- } else if(Option::qmake_mode == Option::QMAKE_UNSET_PROPERTY) {
- for (QStringList::ConstIterator it = Option::prop::properties.cbegin();
- it != Option::prop::properties.cend(); it++) {
- QString var = (*it);
- if(!var.startsWith("."))
- remove(var);
}
}
+ printer(output);
return ret;
}
+int QMakeProperty::setProperty(const QStringList &optionProperties)
+{
+ for (auto it = optionProperties.cbegin(); it != optionProperties.cend(); ++it) {
+ QString var = (*it);
+ ++it;
+ if (it == optionProperties.cend()) {
+ return PropFailRetCode;
+ }
+ if (!var.startsWith("."))
+ setValue(var, (*it));
+ }
+ return PropSuccessRetCode;
+}
+
+void QMakeProperty::unsetProperty(const QStringList &optionProperties)
+{
+ for (auto it = optionProperties.cbegin(); it != optionProperties.cend(); ++it) {
+ QString var = (*it);
+ if (!var.startsWith("."))
+ remove(var);
+ }
+}
+
QT_END_NAMESPACE
diff --git a/qmake/property.h b/qmake/property.h
index b0129196eb..7b41a7ad83 100644
--- a/qmake/property.h
+++ b/qmake/property.h
@@ -30,6 +30,7 @@
#define PROPERTY_H
#include "library/proitems.h"
+#include "propertyprinter.h"
#include <qglobal.h>
#include <qstring.h>
@@ -39,7 +40,7 @@ QT_BEGIN_NAMESPACE
class QSettings;
-class QMakeProperty
+class QMakeProperty final
{
QSettings *settings;
void initSettings();
@@ -58,7 +59,10 @@ public:
void setValue(QString, const QString &);
void remove(const QString &);
- bool exec();
+ int queryProperty(const QStringList &optionProperties = QStringList(),
+ const PropertyPrinter &printer = qmakePropertyPrinter);
+ int setProperty(const QStringList &optionProperties);
+ void unsetProperty(const QStringList &optionProperties);
};
QT_END_NAMESPACE
diff --git a/qmake/propertyprinter.cpp b/qmake/propertyprinter.cpp
new file mode 100644
index 0000000000..d59e99f824
--- /dev/null
+++ b/qmake/propertyprinter.cpp
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** 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 The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/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 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "propertyprinter.h"
+
+#include <iostream>
+
+QT_BEGIN_NAMESPACE
+
+void qmakePropertyPrinter(const QList<QPair<QString, QString>> &values)
+{
+ // Assume single property request
+ if (values.count() == 1) {
+ std::cout << qPrintable(values.at(0).second) << std::endl;
+ return;
+ }
+
+ for (const auto &val : values) {
+ std::cout << qPrintable(val.first) << ":" << qPrintable(val.second) << std::endl;
+ }
+}
+
+void jsonPropertyPrinter(const QList<QPair<QString, QString>> &values)
+{
+ std::cout << "{\n";
+ for (const auto &val : values) {
+ std::cout << "\"" << qPrintable(val.first) << "\":\"" << qPrintable(val.second) << "\",\n";
+ }
+ std::cout << "}\n";
+}
+
+QT_END_NAMESPACE
diff --git a/qmake/propertyprinter.h b/qmake/propertyprinter.h
new file mode 100644
index 0000000000..c885d5b055
--- /dev/null
+++ b/qmake/propertyprinter.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** 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 The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/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 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PROPERTYPRINTER_H
+#define PROPERTYPRINTER_H
+
+#include <qglobal.h>
+#include <qlist.h>
+#include <qpair.h>
+#include <qstring.h>
+
+#include <functional>
+
+QT_BEGIN_NAMESPACE
+
+using PropertyPrinter = std::function<void(const QList<QPair<QString, QString>> &)>;
+void qmakePropertyPrinter(const QList<QPair<QString, QString>> &values);
+void jsonPropertyPrinter(const QList<QPair<QString, QString>> &values);
+
+QT_END_NAMESPACE
+
+#endif // PROPERTYPRINTER_H