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>
This commit is contained in:
parent
f0862c08f1
commit
5db8579620
@ -9,6 +9,7 @@ add_library(QtLibraryInfo OBJECT
|
|||||||
library/proitems.cpp library/proitems.h
|
library/proitems.cpp library/proitems.h
|
||||||
library/qmake_global.h
|
library/qmake_global.h
|
||||||
property.cpp property.h
|
property.cpp property.h
|
||||||
|
propertyprinter.cpp propertyprinter.h
|
||||||
qmakelibraryinfo.cpp qmakelibraryinfo.h
|
qmakelibraryinfo.cpp qmakelibraryinfo.h
|
||||||
)
|
)
|
||||||
set_target_properties(QtLibraryInfo PROPERTIES
|
set_target_properties(QtLibraryInfo PROPERTIES
|
||||||
|
@ -508,10 +508,18 @@ int runQMake(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QMakeProperty prop;
|
QMakeProperty prop;
|
||||||
if(Option::qmake_mode == Option::QMAKE_QUERY_PROPERTY ||
|
switch (Option::qmake_mode) {
|
||||||
Option::qmake_mode == Option::QMAKE_SET_PROPERTY ||
|
case Option::QMAKE_QUERY_PROPERTY:
|
||||||
Option::qmake_mode == Option::QMAKE_UNSET_PROPERTY)
|
return prop.queryProperty(Option::prop::properties);
|
||||||
return prop.exec() ? 0 : 101;
|
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);
|
globals.setQMakeProperty(&prop);
|
||||||
|
|
||||||
ProFileCache proFileCache;
|
ProFileCache proFileCache;
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "property.h"
|
#include "property.h"
|
||||||
#include "option.h"
|
|
||||||
|
|
||||||
#include <qdir.h>
|
#include <qdir.h>
|
||||||
#include <qsettings.h>
|
#include <qsettings.h>
|
||||||
@ -35,6 +34,11 @@
|
|||||||
#include <qstringlist.h>
|
#include <qstringlist.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
constexpr int PropSuccessRetCode = 0;
|
||||||
|
constexpr int PropFailRetCode = 101;
|
||||||
|
}
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
static const struct {
|
static const struct {
|
||||||
@ -146,76 +150,79 @@ QMakeProperty::remove(const QString &var)
|
|||||||
settings->remove(var);
|
settings->remove(var);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
int QMakeProperty::queryProperty(const QStringList &optionProperties,
|
||||||
QMakeProperty::exec()
|
const PropertyPrinter &printer)
|
||||||
{
|
{
|
||||||
bool ret = true;
|
QList<QPair<QString, QString>> output;
|
||||||
if (Option::qmake_mode == Option::QMAKE_QUERY_PROPERTY) {
|
int ret = PropSuccessRetCode;
|
||||||
if (Option::prop::properties.isEmpty()) {
|
if (optionProperties.isEmpty()) {
|
||||||
initSettings();
|
initSettings();
|
||||||
const auto keys = settings->childKeys();
|
const auto keys = settings->childKeys();
|
||||||
for (const QString &key : keys) {
|
for (const QString &key : keys) {
|
||||||
QString val = settings->value(key).toString();
|
QString val = settings->value(key).toString();
|
||||||
fprintf(stdout, "%s:%s\n", qPrintable(key), qPrintable(val));
|
output.append({ key, val });
|
||||||
}
|
}
|
||||||
QStringList specialProps;
|
QStringList specialProps;
|
||||||
for (unsigned i = 0; i < sizeof(propList)/sizeof(propList[0]); i++)
|
for (unsigned i = 0; i < sizeof(propList) / sizeof(propList[0]); i++)
|
||||||
specialProps.append(QString::fromLatin1(propList[i].name));
|
specialProps.append(QString::fromLatin1(propList[i].name));
|
||||||
specialProps.append("QMAKE_VERSION");
|
#ifdef QMAKE_VERSION_STR
|
||||||
#ifdef QT_VERSION_STR
|
specialProps.append("QMAKE_VERSION");
|
||||||
specialProps.append("QT_VERSION");
|
|
||||||
#endif
|
#endif
|
||||||
for (const QString &prop : qAsConst(specialProps)) {
|
#ifdef QT_VERSION_STR
|
||||||
ProString val = value(ProKey(prop));
|
specialProps.append("QT_VERSION");
|
||||||
ProString pval = value(ProKey(prop + "/raw"));
|
#endif
|
||||||
ProString gval = value(ProKey(prop + "/get"));
|
for (const QString &prop : qAsConst(specialProps)) {
|
||||||
ProString sval = value(ProKey(prop + "/src"));
|
ProString val = value(ProKey(prop));
|
||||||
ProString dval = value(ProKey(prop + "/dev"));
|
ProString pval = value(ProKey(prop + "/raw"));
|
||||||
fprintf(stdout, "%s:%s\n", prop.toLatin1().constData(), val.toLatin1().constData());
|
ProString gval = value(ProKey(prop + "/get"));
|
||||||
if (!pval.isEmpty() && pval != val)
|
ProString sval = value(ProKey(prop + "/src"));
|
||||||
fprintf(stdout, "%s/raw:%s\n", prop.toLatin1().constData(), pval.toLatin1().constData());
|
ProString dval = value(ProKey(prop + "/dev"));
|
||||||
if (!gval.isEmpty() && gval != (pval.isEmpty() ? val : pval))
|
output.append({ prop, val.toQString() });
|
||||||
fprintf(stdout, "%s/get:%s\n", prop.toLatin1().constData(), gval.toLatin1().constData());
|
if (!pval.isEmpty() && pval != val)
|
||||||
if (!sval.isEmpty() && sval != gval)
|
output.append({ prop + "/raw", pval.toQString() });
|
||||||
fprintf(stdout, "%s/src:%s\n", prop.toLatin1().constData(), sval.toLatin1().constData());
|
if (!gval.isEmpty() && gval != (pval.isEmpty() ? val : pval))
|
||||||
if (!dval.isEmpty() && dval != pval)
|
output.append({ prop + "/get", gval.toQString() });
|
||||||
fprintf(stdout, "%s/dev:%s\n", prop.toLatin1().constData(), dval.toLatin1().constData());
|
if (!sval.isEmpty() && sval != gval)
|
||||||
}
|
output.append({ prop + "/src", sval.toQString() });
|
||||||
return true;
|
if (!dval.isEmpty() && dval != pval)
|
||||||
|
output.append({ prop + "/dev", dval.toQString() });
|
||||||
}
|
}
|
||||||
for (QStringList::ConstIterator it = Option::prop::properties.cbegin();
|
} else {
|
||||||
it != Option::prop::properties.cend(); it++) {
|
for (const auto &prop : optionProperties) {
|
||||||
if (Option::prop::properties.count() > 1)
|
const ProKey pkey(prop);
|
||||||
fprintf(stdout, "%s:", (*it).toLatin1().constData());
|
|
||||||
const ProKey pkey(*it);
|
|
||||||
if (!hasValue(pkey)) {
|
if (!hasValue(pkey)) {
|
||||||
ret = false;
|
ret = PropFailRetCode;
|
||||||
fprintf(stdout, "**Unknown**\n");
|
output.append({ prop, QString("**Unknown**") });
|
||||||
} else {
|
} else {
|
||||||
fprintf(stdout, "%s\n", value(pkey).toLatin1().constData());
|
output.append({ prop, value(pkey).toQString() });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} 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;
|
|
||||||
}
|
|
||||||
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;
|
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
|
QT_END_NAMESPACE
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#define PROPERTY_H
|
#define PROPERTY_H
|
||||||
|
|
||||||
#include "library/proitems.h"
|
#include "library/proitems.h"
|
||||||
|
#include "propertyprinter.h"
|
||||||
|
|
||||||
#include <qglobal.h>
|
#include <qglobal.h>
|
||||||
#include <qstring.h>
|
#include <qstring.h>
|
||||||
@ -39,7 +40,7 @@ QT_BEGIN_NAMESPACE
|
|||||||
|
|
||||||
class QSettings;
|
class QSettings;
|
||||||
|
|
||||||
class QMakeProperty
|
class QMakeProperty final
|
||||||
{
|
{
|
||||||
QSettings *settings;
|
QSettings *settings;
|
||||||
void initSettings();
|
void initSettings();
|
||||||
@ -58,7 +59,10 @@ public:
|
|||||||
void setValue(QString, const QString &);
|
void setValue(QString, const QString &);
|
||||||
void remove(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
|
QT_END_NAMESPACE
|
||||||
|
68
qmake/propertyprinter.cpp
Normal file
68
qmake/propertyprinter.cpp
Normal file
@ -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
|
58
qmake/propertyprinter.h
Normal file
58
qmake/propertyprinter.h
Normal file
@ -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
|
Loading…
x
Reference in New Issue
Block a user