diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-11-19 11:22:35 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2019-01-29 10:14:21 +0000 |
commit | 5c84373d8d60a8b13df1fcdcd77480736952c095 (patch) | |
tree | 1bc6648f64a8b31b9407d359ca715164f30718e6 | |
parent | 1cf4e24eb45498570b4302d25be90c0aa2923450 (diff) |
Qt: Allow users to explicitly tag files as mocable
This is helpful for declaring a QObject-derived class via a macro, in
which case the moc scanner will not help.
Fixes: QBS-1410
Change-Id: I19ee30eac670228686b5528888159220cf39abd3
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
-rw-r--r-- | doc/reference/modules/qt-core-module.qdoc | 12 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/qtmocscanner.cpp | 12 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata-qt/forced-moc/createqtclass.h | 14 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata-qt/forced-moc/forced-moc.qbs | 13 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata-qt/forced-moc/main.cpp | 14 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata-qt/forced-moc/myqtclass.h | 8 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackboxqt.cpp | 7 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackboxqt.h | 1 |
8 files changed, 80 insertions, 1 deletions
diff --git a/doc/reference/modules/qt-core-module.qdoc b/doc/reference/modules/qt-core-module.qdoc index 922b1889b..c8c3dc7de 100644 --- a/doc/reference/modules/qt-core-module.qdoc +++ b/doc/reference/modules/qt-core-module.qdoc @@ -109,6 +109,18 @@ \li \c{*.ts} \li 1.0 \li Files with this tag serve as inputs to the rule running the \c lrelease tool. + \row + \li \c{"mocable"} + \li - + \li 1.13 + \li Use this tag to force \QBS to run \c moc on the respective files, even though + they do not contain \c Q_OBJECT or a related macro. + \row + \li \c{"unmocable"} + \li - + \li 1.2 + \li Use this tag for files that \QBS should not run \c moc on, even though they contain + \c Q_OBJECT or a related macro. \endtable */ diff --git a/src/lib/corelib/buildgraph/qtmocscanner.cpp b/src/lib/corelib/buildgraph/qtmocscanner.cpp index 121184648..dcdbd82a8 100644 --- a/src/lib/corelib/buildgraph/qtmocscanner.cpp +++ b/src/lib/corelib/buildgraph/qtmocscanner.cpp @@ -230,7 +230,17 @@ QScriptValue QtMocScanner::apply(QScriptEngine *engine, const Artifact *artifact bool hasPluginMetaDataMacro = false; const bool isHeaderFile = artifact->fileTags().contains(m_tags.hpp); - const RawScanResult scanResult = runScanner(m_cppScanner, artifact); + RawScanResult scanResult = runScanner(m_cppScanner, artifact); + if (scanResult.additionalFileTags.empty() && artifact->fileTags().contains("mocable")) { + if (isHeaderFile) { + scanResult.additionalFileTags.insert(m_tags.moc_hpp); + } else if (artifact->fileTags().contains(m_tags.cpp) + || artifact->fileTags().contains(m_tags.cppCombine) + || artifact->fileTags().contains(m_tags.objcpp) + || artifact->fileTags().contains(m_tags.objcppCombine)) { + scanResult.additionalFileTags.insert(m_tags.moc_cpp); + } + } if (!scanResult.additionalFileTags.empty()) { if (isHeaderFile) { if (scanResult.additionalFileTags.contains(m_tags.moc_hpp)) diff --git a/tests/auto/blackbox/testdata-qt/forced-moc/createqtclass.h b/tests/auto/blackbox/testdata-qt/forced-moc/createqtclass.h new file mode 100644 index 000000000..b57df6303 --- /dev/null +++ b/tests/auto/blackbox/testdata-qt/forced-moc/createqtclass.h @@ -0,0 +1,14 @@ +#ifndef CREATEQTCLASS_H +#define CREATEQTCLASS_H + +#include <QObject> + +#define CREATE_QT_CLASS(className) \ +class className : public QObject \ +{ \ + Q_OBJECT \ +public: \ + Q_SIGNAL void mySignal(); \ +} + +#endif diff --git a/tests/auto/blackbox/testdata-qt/forced-moc/forced-moc.qbs b/tests/auto/blackbox/testdata-qt/forced-moc/forced-moc.qbs new file mode 100644 index 000000000..a59aaa28e --- /dev/null +++ b/tests/auto/blackbox/testdata-qt/forced-moc/forced-moc.qbs @@ -0,0 +1,13 @@ +QtApplication { + files: "main.cpp" + Group { + name: "QObject service provider" + files: "createqtclass.h" + fileTags: ["hpp", "unmocable"] + } + Group { + name: "QObject service user" + files: "myqtclass.h" + fileTags: ["hpp", "mocable"] + } +} diff --git a/tests/auto/blackbox/testdata-qt/forced-moc/main.cpp b/tests/auto/blackbox/testdata-qt/forced-moc/main.cpp new file mode 100644 index 000000000..e07c62984 --- /dev/null +++ b/tests/auto/blackbox/testdata-qt/forced-moc/main.cpp @@ -0,0 +1,14 @@ +#include "myqtclass.h" + +#include <QCoreApplication> +#include <QDebug> +#include <QTimer> + +int main(int argc, char *argv[]) +{ + QCoreApplication app(argc, argv); + MyQtClass c; + QObject::connect(&c, &MyQtClass::mySignal, [] { qDebug() << "Hello from slot"; qApp->quit(); }); + QTimer::singleShot(0, &c, &MyQtClass::mySignal); + return app.exec(); +} diff --git a/tests/auto/blackbox/testdata-qt/forced-moc/myqtclass.h b/tests/auto/blackbox/testdata-qt/forced-moc/myqtclass.h new file mode 100644 index 000000000..d2557aab6 --- /dev/null +++ b/tests/auto/blackbox/testdata-qt/forced-moc/myqtclass.h @@ -0,0 +1,8 @@ +#ifndef MYQTCLASS_H +#define MYQTCLASS_H + +#include "createqtclass.h" + +CREATE_QT_CLASS(MyQtClass); + +#endif diff --git a/tests/auto/blackbox/tst_blackboxqt.cpp b/tests/auto/blackbox/tst_blackboxqt.cpp index 6c013d918..128c61133 100644 --- a/tests/auto/blackbox/tst_blackboxqt.cpp +++ b/tests/auto/blackbox/tst_blackboxqt.cpp @@ -145,6 +145,13 @@ void TestBlackboxQt::dbusInterfaces() QCOMPARE(runQbs(), 0); } +void TestBlackboxQt::forcedMoc() +{ + QDir::setCurrent(testDataDir + "/forced-moc"); + QCOMPARE(runQbs(QbsRunParameters("run")), 0); + QVERIFY2(m_qbsStderr.contains("Hello from slot"), m_qbsStderr.constData()); +} + void TestBlackboxQt::includedMocCpp() { QDir::setCurrent(testDataDir + "/included-moc-cpp"); diff --git a/tests/auto/blackbox/tst_blackboxqt.h b/tests/auto/blackbox/tst_blackboxqt.h index 0240312a0..180f9e0c0 100644 --- a/tests/auto/blackbox/tst_blackboxqt.h +++ b/tests/auto/blackbox/tst_blackboxqt.h @@ -49,6 +49,7 @@ private slots: void createProject(); void dbusAdaptors(); void dbusInterfaces(); + void forcedMoc(); void includedMocCpp(); void linkerVariant(); void lrelease(); |