aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-11-19 11:22:35 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2019-01-29 10:14:21 +0000
commit5c84373d8d60a8b13df1fcdcd77480736952c095 (patch)
tree1bc6648f64a8b31b9407d359ca715164f30718e6
parent1cf4e24eb45498570b4302d25be90c0aa2923450 (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.qdoc12
-rw-r--r--src/lib/corelib/buildgraph/qtmocscanner.cpp12
-rw-r--r--tests/auto/blackbox/testdata-qt/forced-moc/createqtclass.h14
-rw-r--r--tests/auto/blackbox/testdata-qt/forced-moc/forced-moc.qbs13
-rw-r--r--tests/auto/blackbox/testdata-qt/forced-moc/main.cpp14
-rw-r--r--tests/auto/blackbox/testdata-qt/forced-moc/myqtclass.h8
-rw-r--r--tests/auto/blackbox/tst_blackboxqt.cpp7
-rw-r--r--tests/auto/blackbox/tst_blackboxqt.h1
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();