forked from qt/qtbase
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for machine-readable JSON output to the MOC
The --output-json parameter will make moc produce a .json file next to the regular output file. With --collect-json the .json files for a module can be merged into a single one. Task-number: QTBUG-68796 Change-Id: I0e8fb802d47bd22da219701a8df947973d4bd7b5 Reviewed-by: Simon Hausmann <[email protected]> Reviewed-by: Ulf Hermann <[email protected]>
- Loading branch information
Showing
11 changed files
with
3,144 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
qtPrepareTool(MOC_COLLECT_JSON, moc) | ||
|
||
QMAKE_MOC_OPTIONS += --output-json | ||
|
||
moc_json_header.input = HEADERS | ||
moc_json_header.output = $$MOC_DIR/$${QMAKE_H_MOD_MOC}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)}.json | ||
moc_json_header.CONFIG = no_link moc_verify | ||
moc_json_header.depends = $$MOC_DIR/$${QMAKE_H_MOD_MOC}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)} | ||
moc_json_header.commands = $$escape_expand(\\n) # force creation of rule | ||
moc_json_header.variable_out = MOC_JSON_FILES | ||
|
||
moc_json_source.input = SOURCES | ||
moc_json_source.output = $$MOC_DIR/$${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_EXT_CPP_MOC}.json | ||
moc_json_source.CONFIG = no_link moc_verify | ||
moc_json_source.depends = $$MOC_DIR/$${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_EXT_CPP_MOC} | ||
moc_json_source.commands = $$escape_expand(\\n) # force creation of rule | ||
moc_json_source.variable_out = MOC_JSON_FILES | ||
|
||
MOC_COLLECT_JSON_OUTPUT = $$lower($$basename(TARGET))_metatypes.json | ||
|
||
moc_collect_json.CONFIG += no_link combine | ||
moc_collect_json.commands = $$MOC_COLLECT_JSON --collect-json -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN} | ||
moc_collect_json.input = MOC_JSON_FILES | ||
moc_collect_json.output = $$MOC_COLLECT_JSON_OUTPUT | ||
moc_collect_json.name = Collect moc JSON output into central file | ||
|
||
install_metatypes { | ||
do_install.path = $$[QT_INSTALL_LIBS]/metatypes | ||
do_install.files = $$OUT_PWD/$$MOC_COLLECT_JSON_OUTPUT | ||
prefix_build: INSTALLS += do_install | ||
else: COPIES += do_install | ||
} | ||
|
||
QMAKE_EXTRA_COMPILERS += moc_collect_json moc_json_header moc_json_source |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
/**************************************************************************** | ||
** | ||
** Copyright (C) 2018 The Qt Company Ltd. | ||
** Contact: https://www.qt.io/licensing/ | ||
** | ||
** This file is part of the test suite of the Qt Toolkit. | ||
** | ||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$ | ||
** 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 General Public License Usage | ||
** Alternatively, this file may be used under the terms of the GNU | ||
** General Public License version 3 as published by the Free Software | ||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT | ||
** 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-3.0.html. | ||
** | ||
** $QT_END_LICENSE$ | ||
** | ||
****************************************************************************/ | ||
|
||
#include <qfile.h> | ||
#include <qjsonarray.h> | ||
#include <qjsondocument.h> | ||
#include <qjsonobject.h> | ||
#include <qhashfunctions.h> | ||
#include <qstringlist.h> | ||
#include <cstdlib> | ||
|
||
static bool readFromDevice(QIODevice *device, QJsonArray *allMetaObjects) | ||
{ | ||
const QByteArray contents = device->readAll(); | ||
if (contents.isEmpty()) | ||
return true; | ||
|
||
QJsonParseError error {}; | ||
QJsonDocument metaObjects = QJsonDocument::fromJson(contents, &error); | ||
if (error.error != QJsonParseError::NoError) { | ||
fprintf(stderr, "%s at %d\n", error.errorString().toUtf8().constData(), error.offset); | ||
return false; | ||
} | ||
|
||
allMetaObjects->append(metaObjects.object()); | ||
return true; | ||
} | ||
|
||
int collectJson(const QStringList &jsonFiles, const QString &outputFile) | ||
{ | ||
qSetGlobalQHashSeed(0); | ||
|
||
QFile output; | ||
if (outputFile.isEmpty()) { | ||
if (!output.open(stdout, QIODevice::WriteOnly)) { | ||
fprintf(stderr, "Error opening stdout for writing\n"); | ||
return EXIT_FAILURE; | ||
} | ||
} else { | ||
output.setFileName(outputFile); | ||
if (!output.open(QIODevice::WriteOnly)) { | ||
fprintf(stderr, "Error opening %s for writing\n", qPrintable(outputFile)); | ||
return EXIT_FAILURE; | ||
} | ||
} | ||
|
||
QJsonArray allMetaObjects; | ||
if (jsonFiles.isEmpty()) { | ||
QFile f; | ||
if (!f.open(stdin, QIODevice::ReadOnly)) { | ||
fprintf(stderr, "Error opening stdin for reading\n"); | ||
return EXIT_FAILURE; | ||
} | ||
|
||
if (!readFromDevice(&f, &allMetaObjects)) { | ||
fprintf(stderr, "Error parsing data from stdin\n"); | ||
return EXIT_FAILURE; | ||
} | ||
} | ||
|
||
for (const QString &jsonFile: jsonFiles) { | ||
QFile f(jsonFile); | ||
if (!f.open(QIODevice::ReadOnly)) { | ||
fprintf(stderr, "Error opening %s for reading\n", qPrintable(jsonFile)); | ||
return EXIT_FAILURE; | ||
} | ||
|
||
if (!readFromDevice(&f, &allMetaObjects)) { | ||
fprintf(stderr, "Error parsing %s\n", qPrintable(jsonFile)); | ||
return EXIT_FAILURE; | ||
} | ||
} | ||
|
||
QJsonDocument doc(allMetaObjects); | ||
output.write(doc.toJson()); | ||
|
||
return EXIT_SUCCESS; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
/**************************************************************************** | ||
** | ||
** Copyright (C) 2019 The Qt Company Ltd. | ||
** Contact: https://www.qt.io/licensing/ | ||
** | ||
** This file is part of the tools applications of the Qt Toolkit. | ||
** | ||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$ | ||
** 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 General Public License Usage | ||
** Alternatively, this file may be used under the terms of the GNU | ||
** General Public License version 3 as published by the Free Software | ||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT | ||
** 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-3.0.html. | ||
** | ||
** $QT_END_LICENSE$ | ||
** | ||
****************************************************************************/ | ||
|
||
#ifndef COLLECTJSON_H | ||
#define COLLECTJSON_H | ||
|
||
#include <qglobal.h> | ||
#include <qstring.h> | ||
#include <qstringlist.h> | ||
|
||
QT_BEGIN_NAMESPACE | ||
|
||
int collectJson(const QStringList &jsonFiles, const QString &outputFile); | ||
|
||
QT_END_NAMESPACE | ||
|
||
#endif // COLLECTOJSON_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.