summaryrefslogtreecommitdiff
path: root/src/lib/buildgraph
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2013-08-27 10:09:30 +0200
committerJoerg Bornemann <joerg.bornemann@digia.com>2013-08-27 16:44:24 +0200
commit92ae89a2f7aee0c857062ada2a82af55e9153070 (patch)
tree7105357ae8cc81ffcf14cde49306b2f006f6bcac /src/lib/buildgraph
parent33a91f7af18d8703cc63ef640d24b417a9e3cdf2 (diff)
downloadqbs-92ae89a2f7aee0c857062ada2a82af55e9153070.tar.gz
AutoMoc: do not scan files twice
We scanned files for the Q_OBJECT macro and then again to find moc_XXX.cpp includes. This can be done in one pass. Change-Id: I3b14be2a922ce244730b3ce21e7803c605ba59be Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'src/lib/buildgraph')
-rw-r--r--src/lib/buildgraph/automoc.cpp50
-rw-r--r--src/lib/buildgraph/scanresultcache.h4
2 files changed, 24 insertions, 30 deletions
diff --git a/src/lib/buildgraph/automoc.cpp b/src/lib/buildgraph/automoc.cpp
index 1c9374be8..40c798962 100644
--- a/src/lib/buildgraph/automoc.cpp
+++ b/src/lib/buildgraph/automoc.cpp
@@ -188,37 +188,21 @@ void AutoMoc::scan(Artifact *artifact, FileType fileType, bool &hasQObjectMacro,
hasQObjectMacro = false;
foreach (ScannerPlugin *scanner, fileType == HppFileType ? hppScanners() : cppScanners()) {
- void *opaq = scanner->open(artifact->filePath().utf16(), ScanForFileTagsFlag);
- if (!opaq || !scanner->additionalFileTags)
- continue;
-
- // HACK: misuse the file dependency scanner as provider for file tags
- int length = 0;
- const char **szFileTagsFromScanner = scanner->additionalFileTags(opaq, &length);
- if (szFileTagsFromScanner && length > 0) {
- for (int i=length; --i >= 0;) {
- artifact->fileTags.insert(szFileTagsFromScanner[i]);
- if (m_logger.traceEnabled())
- m_logger.qbsTrace() << "[AUTOMOC] finds Q_OBJECT macro";
- const QByteArray fileTagFromScanner
- = QByteArray::fromRawData(szFileTagsFromScanner[i],
- qstrlen(szFileTagsFromScanner[i]));
- if (fileTagFromScanner.startsWith("moc"))
- hasQObjectMacro = true;
- }
- }
-
- scanner->close(opaq);
-
- ScanResultCache::Result scanResult;
- if (m_scanResultCache)
- scanResult = m_scanResultCache->value(artifact->filePath());
+ ScanResultCache::Result scanResult = m_scanResultCache->value(artifact->filePath());
if (!scanResult.valid) {
scanResult.valid = true;
- opaq = scanner->open(artifact->filePath().utf16(), ScanForDependenciesFlag);
- if (!opaq)
+ void *opaq = scanner->open(artifact->filePath().utf16(),
+ ScanForDependenciesFlag | ScanForFileTagsFlag);
+ if (!opaq || !scanner->additionalFileTags)
continue;
+ int length = 0;
+ const char **szFileTagsFromScanner = scanner->additionalFileTags(opaq, &length);
+ if (szFileTagsFromScanner && length > 0) {
+ for (int i = length; --i >= 0;)
+ scanResult.additionalFileTags += szFileTagsFromScanner[i];
+ }
+
forever {
int flags = 0;
const char *szOutFilePath = scanner->next(opaq, &length, &flags);
@@ -232,8 +216,16 @@ void AutoMoc::scan(Artifact *artifact, FileType fileType, bool &hasQObjectMacro,
}
scanner->close(opaq);
- if (m_scanResultCache)
- m_scanResultCache->insert(artifact->filePath(), scanResult);
+ m_scanResultCache->insert(artifact->filePath(), scanResult);
+ }
+
+ foreach (const FileTag &tag, scanResult.additionalFileTags) {
+ artifact->fileTags.insert(tag);
+ if (tag.name().startsWith("moc")) {
+ hasQObjectMacro = true;
+ if (m_logger.traceEnabled())
+ m_logger.qbsTrace() << "[AUTOMOC] finds Q_OBJECT macro";
+ }
}
foreach (const ScanResultCache::Dependency &dependency, scanResult.deps) {
diff --git a/src/lib/buildgraph/scanresultcache.h b/src/lib/buildgraph/scanresultcache.h
index 922141be5..d71f66ccf 100644
--- a/src/lib/buildgraph/scanresultcache.h
+++ b/src/lib/buildgraph/scanresultcache.h
@@ -30,8 +30,9 @@
#ifndef QBS_SCANRESULTCACHE_H
#define QBS_SCANRESULTCACHE_H
+#include <language/filetags.h>
+
#include <QHash>
-#include <QSet>
#include <QString>
#include <QVector>
@@ -68,6 +69,7 @@ public:
{}
QVector<Dependency> deps;
+ FileTags additionalFileTags;
bool valid;
};