diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2016-12-08 12:47:57 +0100 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@qt.io> | 2017-01-10 10:00:09 +0000 |
commit | 4004e5688b49e0c7e97e9f4773c3d3c76c0059ee (patch) | |
tree | 125b596236fa93feddc37599e28b4db0268b26d6 /src/lib/corelib/buildgraph | |
parent | 4265033a34e1ecd06f9d51b72ab8d595d5eb28be (diff) |
Make scanning information persistent
This way, a change in some artifact or dependency will not cause re-
scanning of tons of other header files anymore.
Task-number: QBS-1052
Change-Id: I1713da416b47b19275641cbbacd0a5c9da866578
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/lib/corelib/buildgraph')
-rw-r--r-- | src/lib/corelib/buildgraph/buildgraph.pri | 5 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/depscanner.cpp | 35 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/depscanner.h | 15 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/executor.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/executor.h | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/inputartifactscanner.cpp | 30 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/inputartifactscanner.h | 15 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/projectbuilddata.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/projectbuilddata.h | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/qtmocscanner.cpp | 58 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/qtmocscanner.h | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/rawscanneddependency.cpp (renamed from src/lib/corelib/buildgraph/scanresultcache.cpp) | 40 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/rawscanneddependency.h | 28 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/rawscanresults.cpp | 114 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/rawscanresults.h (renamed from src/lib/corelib/buildgraph/scanresultcache.h) | 52 |
15 files changed, 320 insertions, 82 deletions
diff --git a/src/lib/corelib/buildgraph/buildgraph.pri b/src/lib/corelib/buildgraph/buildgraph.pri index 5ea37d210..fabba661e 100644 --- a/src/lib/corelib/buildgraph/buildgraph.pri +++ b/src/lib/corelib/buildgraph/buildgraph.pri @@ -23,13 +23,14 @@ SOURCES += \ $$PWD/productinstaller.cpp \ $$PWD/projectbuilddata.cpp \ $$PWD/qtmocscanner.cpp \ + $$PWD/rawscanneddependency.cpp \ + $$PWD/rawscanresults.cpp \ $$PWD/rescuableartifactdata.cpp \ $$PWD/rulecommands.cpp \ $$PWD/rulegraph.cpp \ $$PWD/rulenode.cpp \ $$PWD/rulesapplicator.cpp \ $$PWD/rulesevaluationcontext.cpp \ - $$PWD/scanresultcache.cpp \ $$PWD/timestampsupdater.cpp \ $$PWD/transformer.cpp @@ -59,13 +60,13 @@ HEADERS += \ $$PWD/projectbuilddata.h \ $$PWD/qtmocscanner.h \ $$PWD/rawscanneddependency.h \ + $$PWD/rawscanresults.h \ $$PWD/rescuableartifactdata.h \ $$PWD/rulecommands.h \ $$PWD/rulegraph.h \ $$PWD/rulenode.h \ $$PWD/rulesapplicator.h \ $$PWD/rulesevaluationcontext.h \ - $$PWD/scanresultcache.h \ $$PWD/timestampsupdater.h \ $$PWD/transformer.h diff --git a/src/lib/corelib/buildgraph/depscanner.cpp b/src/lib/corelib/buildgraph/depscanner.cpp index fb5d776d8..95d0adcf5 100644 --- a/src/lib/corelib/buildgraph/depscanner.cpp +++ b/src/lib/corelib/buildgraph/depscanner.cpp @@ -58,6 +58,13 @@ namespace qbs { namespace Internal { +QString DependencyScanner::id() const +{ + if (m_id.isEmpty()) + m_id = createId(); + return m_id; +} + static QStringList collectCppIncludePaths(const QVariantMap &modules) { QStringList result; @@ -128,6 +135,20 @@ const void *PluginDependencyScanner::key() const return m_plugin; } +QString PluginDependencyScanner::createId() const +{ + return QString::fromLatin1(m_plugin->name); +} + +bool PluginDependencyScanner::areModulePropertiesCompatible(const PropertyMapConstPtr &m1, + const PropertyMapConstPtr &m2) const +{ + // This changes when our C++ scanner starts taking defines into account. + Q_UNUSED(m1); + Q_UNUSED(m2); + return true; +} + UserDependencyScanner::UserDependencyScanner(const ResolvedScannerConstPtr &scanner, const Logger &logger) : m_scanner(scanner), @@ -172,6 +193,20 @@ const void *UserDependencyScanner::key() const return m_scanner.data(); } +QString UserDependencyScanner::createId() const +{ + return m_scanner->scanScript->sourceCode; +} + +bool UserDependencyScanner::areModulePropertiesCompatible(const PropertyMapConstPtr &m1, + const PropertyMapConstPtr &m2) const +{ + // TODO: This should probably be made more fine-grained. Perhaps the Scanner item + // could declare the relevant properties, or we could figure them out automatically + // somehow. + return m1 == m2 || m1->value() == m2->value(); +} + QStringList UserDependencyScanner::evaluate(Artifact *artifact, const ScriptFunctionPtr &script) { if (artifact->product.data() != m_product) { diff --git a/src/lib/corelib/buildgraph/depscanner.h b/src/lib/corelib/buildgraph/depscanner.h index cf614c1a6..9ecd6f252 100644 --- a/src/lib/corelib/buildgraph/depscanner.h +++ b/src/lib/corelib/buildgraph/depscanner.h @@ -63,10 +63,19 @@ class DependencyScanner public: virtual ~DependencyScanner() {} + QString id() const; + virtual QStringList collectSearchPaths(Artifact *artifact) = 0; virtual QStringList collectDependencies(FileResourceBase *file, const char *fileTags) = 0; virtual bool recursive() const = 0; virtual const void *key() const = 0; + virtual bool areModulePropertiesCompatible(const PropertyMapConstPtr &m1, + const PropertyMapConstPtr &m2) const = 0; + +private: + virtual QString createId() const = 0; + + mutable QString m_id; }; class PluginDependencyScanner : public DependencyScanner @@ -79,6 +88,9 @@ private: QStringList collectDependencies(FileResourceBase *file, const char *fileTags); bool recursive() const; const void *key() const; + QString createId() const; + bool areModulePropertiesCompatible(const PropertyMapConstPtr &m1, + const PropertyMapConstPtr &m2) const; ScannerPlugin* m_plugin; }; @@ -94,6 +106,9 @@ private: QStringList collectDependencies(FileResourceBase *file, const char *fileTags); bool recursive() const; const void *key() const; + QString createId() const; + bool areModulePropertiesCompatible(const PropertyMapConstPtr &m1, + const PropertyMapConstPtr &m2) const; QStringList evaluate(Artifact *artifact, const ScriptFunctionPtr &script); diff --git a/src/lib/corelib/buildgraph/executor.cpp b/src/lib/corelib/buildgraph/executor.cpp index 64a7cb498..2a6424beb 100644 --- a/src/lib/corelib/buildgraph/executor.cpp +++ b/src/lib/corelib/buildgraph/executor.cpp @@ -88,7 +88,7 @@ Executor::Executor(const Logger &logger, QObject *parent) , m_doTrace(logger.traceEnabled()) , m_doDebug(logger.debugEnabled()) { - m_inputArtifactScanContext = new InputArtifactScannerContext(&m_scanResultCache); + m_inputArtifactScanContext = new InputArtifactScannerContext; m_cancelationTimer->setSingleShot(false); m_cancelationTimer->setInterval(1000); connect(m_cancelationTimer, &QTimer::timeout, this, &Executor::checkForCancellation); diff --git a/src/lib/corelib/buildgraph/executor.h b/src/lib/corelib/buildgraph/executor.h index f55ca5a53..5371441a0 100644 --- a/src/lib/corelib/buildgraph/executor.h +++ b/src/lib/corelib/buildgraph/executor.h @@ -43,7 +43,6 @@ #include "forward_decls.h" #include "buildgraphvisitor.h" #include <buildgraph/artifact.h> -#include <buildgraph/scanresultcache.h> #include <language/forward_decls.h> #include <logging/logger.h> @@ -166,7 +165,6 @@ private: NodeSet m_roots; Leaves m_leaves; QList<Artifact *> m_changedSourceArtifacts; - ScanResultCache m_scanResultCache; InputArtifactScannerContext *m_inputArtifactScanContext; ErrorInfo m_error; bool m_explicitlyCanceled; diff --git a/src/lib/corelib/buildgraph/inputartifactscanner.cpp b/src/lib/corelib/buildgraph/inputartifactscanner.cpp index 47600bbfc..177eba970 100644 --- a/src/lib/corelib/buildgraph/inputartifactscanner.cpp +++ b/src/lib/corelib/buildgraph/inputartifactscanner.cpp @@ -60,11 +60,6 @@ namespace qbs { namespace Internal { -InputArtifactScannerContext::InputArtifactScannerContext(ScanResultCache *scanResultCache) - : scanResultCache(scanResultCache) -{ -} - static void resolveDepencency(const RawScannedDependency &dependency, const ResolvedProduct *product, ResolvedDependency *result, const QString &baseDir = QString()) @@ -112,7 +107,11 @@ static void resolveDepencency(const RawScannedDependency &dependency, InputArtifactScanner::InputArtifactScanner(Artifact *artifact, InputArtifactScannerContext *ctx, const Logger &logger) - : m_artifact(artifact), m_context(ctx), m_newDependencyAdded(false), m_logger(logger) + : m_artifact(artifact), + m_rawScanResults(artifact->product->topLevelProject()->buildData->rawScanResults), + m_context(ctx), + m_newDependencyAdded(false), + m_logger(logger) { } @@ -230,24 +229,25 @@ void InputArtifactScanner::scanForScannerFileDependencies(DependencyScanner *sca } const QString &filePathToBeScanned = fileToBeScanned->filePath(); - ScanResultCache::Result scanResult = m_context->scanResultCache->value(scanner->key(), filePathToBeScanned); - if (!scanResult.valid) { + RawScanResults::ScanData &scanData = m_rawScanResults.findScanData(fileToBeScanned, scanner, + m_artifact->properties); + if (scanData.lastScanTime < fileToBeScanned->timestamp()) { try { if (m_logger.traceEnabled()) m_logger.qbsTrace() << "scanning " << FileInfo::fileName(filePathToBeScanned); - scanWithScannerPlugin(scanner, fileToBeScanned, &scanResult); + scanWithScannerPlugin(scanner, fileToBeScanned, &scanData.rawScanResult); + scanData.lastScanTime = FileTime::currentTime(); } catch (const ErrorInfo &error) { m_logger.printWarning(error); return; } - m_context->scanResultCache->insert(scanner->key(), filePathToBeScanned, scanResult); } - resolveScanResultDependencies(inputArtifact, scanResult, filesToScan, cache); + resolveScanResultDependencies(inputArtifact, scanData.rawScanResult, filesToScan, cache); } void InputArtifactScanner::resolveScanResultDependencies(const Artifact *inputArtifact, - const ScanResultCache::Result &scanResult, QList<FileResourceBase *> *artifactsToScan, + const RawScanResult &scanResult, QList<FileResourceBase *> *artifactsToScan, InputArtifactScannerContext::ScannerResolvedDependenciesCache &cache) { foreach (const RawScannedDependency &dependency, scanResult.deps) { @@ -343,6 +343,8 @@ void InputArtifactScanner::handleDependency(ResolvedDependency &dependency) if (fileDependency) { m_artifact->fileDependencies << fileDependency; + if (!fileDependency->timestamp().isValid()) + fileDependency->setTimestamp(FileInfo(fileDependency->filePath()).lastModified()); } else { if (m_artifact->children.contains(artifactDependency)) return; @@ -354,13 +356,13 @@ void InputArtifactScanner::handleDependency(ResolvedDependency &dependency) void InputArtifactScanner::scanWithScannerPlugin(DependencyScanner *scanner, FileResourceBase *fileToBeScanned, - ScanResultCache::Result *scanResult) + RawScanResult *scanResult) { + scanResult->deps.clear(); const QStringList &dependencies = scanner->collectDependencies(fileToBeScanned, m_fileTagsForScanner.constData()); for (const QString &s : dependencies) scanResult->deps += RawScannedDependency(s); - scanResult->valid = true; } InputArtifactScannerContext::DependencyScannerCacheItem::DependencyScannerCacheItem() : valid(false) diff --git a/src/lib/corelib/buildgraph/inputartifactscanner.h b/src/lib/corelib/buildgraph/inputartifactscanner.h index 239bf66c8..6d82f97ec 100644 --- a/src/lib/corelib/buildgraph/inputartifactscanner.h +++ b/src/lib/corelib/buildgraph/inputartifactscanner.h @@ -40,7 +40,7 @@ #ifndef QBS_INPUTARTIFACTSCANNER_H #define QBS_INPUTARTIFACTSCANNER_H -#include "scanresultcache.h" +#include <language/filetags.h> #include <language/forward_decls.h> #include <logging/logger.h> #include <tools/set.h> @@ -55,6 +55,8 @@ namespace Internal { class Artifact; class FileResourceBase; +class RawScanResult; +class RawScanResults; class PropertyMapInternal; class DependencyScanner; @@ -71,12 +73,6 @@ public: class InputArtifactScannerContext { -public: - InputArtifactScannerContext(ScanResultCache *scanResultCache); - -private: - ScanResultCache *scanResultCache; - struct ResolvedDependencyCacheItem { ResolvedDependencyCacheItem() @@ -133,13 +129,14 @@ private: QList<FileResourceBase *> *filesToScan, InputArtifactScannerContext::ScannerResolvedDependenciesCache &cache); void resolveScanResultDependencies(const Artifact *inputArtifact, - const ScanResultCache::Result &scanResult, QList<FileResourceBase *> *artifactsToScan, + const RawScanResult &scanResult, QList<FileResourceBase *> *artifactsToScan, InputArtifactScannerContext::ScannerResolvedDependenciesCache &cache); void handleDependency(ResolvedDependency &dependency); void scanWithScannerPlugin(DependencyScanner *scanner, FileResourceBase *fileToBeScanned, - ScanResultCache::Result *scanResult); + RawScanResult *scanResult); Artifact * const m_artifact; + RawScanResults &m_rawScanResults; InputArtifactScannerContext *const m_context; QByteArray m_fileTagsForScanner; bool m_newDependencyAdded; diff --git a/src/lib/corelib/buildgraph/projectbuilddata.cpp b/src/lib/corelib/buildgraph/projectbuilddata.cpp index cd05c9d80..74b7b1b77 100644 --- a/src/lib/corelib/buildgraph/projectbuilddata.cpp +++ b/src/lib/corelib/buildgraph/projectbuilddata.cpp @@ -347,11 +347,13 @@ void ProjectBuildData::load(PersistentPool &pool) pool.load(fileDependencies); for (auto dep = fileDependencies.cbegin(); dep != fileDependencies.cend(); ++dep) insertFileDependency(*dep); + pool.load(rawScanResults); } void ProjectBuildData::store(PersistentPool &pool) const { pool.store(fileDependencies); + pool.store(rawScanResults); } diff --git a/src/lib/corelib/buildgraph/projectbuilddata.h b/src/lib/corelib/buildgraph/projectbuilddata.h index bb7df3550..fc0399d94 100644 --- a/src/lib/corelib/buildgraph/projectbuilddata.h +++ b/src/lib/corelib/buildgraph/projectbuilddata.h @@ -40,6 +40,7 @@ #define QBS_PROJECTBUILDDATA_H #include "forward_decls.h" +#include "rawscanresults.h" #include <language/forward_decls.h> #include <logging/logger.h> #include <tools/persistentobject.h> @@ -80,6 +81,7 @@ public: Set<FileDependency *> fileDependencies; + RawScanResults rawScanResults; // do not serialize: RulesEvaluationContextPtr evaluationContext; diff --git a/src/lib/corelib/buildgraph/qtmocscanner.cpp b/src/lib/corelib/buildgraph/qtmocscanner.cpp index 00d570489..caaf12825 100644 --- a/src/lib/corelib/buildgraph/qtmocscanner.cpp +++ b/src/lib/corelib/buildgraph/qtmocscanner.cpp @@ -40,8 +40,10 @@ #include "qtmocscanner.h" #include "artifact.h" +#include "depscanner.h" #include "productbuilddata.h" -#include "scanresultcache.h" +#include "projectbuilddata.h" +#include "rawscanresults.h" #include <logging/translator.h> #include <tools/fileinfo.h> #include <tools/scannerpluginmanager.h> @@ -55,12 +57,32 @@ namespace qbs { namespace Internal { +class QtScanner : public DependencyScanner +{ +public: + QtScanner(const DependencyScanner &actualScanner) + : m_id(QLatin1String("qt") + actualScanner.id()) {} + +private: + QStringList collectSearchPaths(Artifact *) { return QStringList(); } + QStringList collectDependencies(FileResourceBase *, const char *) { return QStringList(); } + bool recursive() const { return false; } + const void *key() const { return nullptr; } + QString createId() const { return m_id; } + bool areModulePropertiesCompatible(const PropertyMapConstPtr &, + const PropertyMapConstPtr &) const + { + return true; + } + + const QString m_id; +}; + QtMocScanner::QtMocScanner(const ResolvedProductPtr &product, QScriptValue targetScriptValue, const Logger &logger) : m_product(product) , m_targetScriptValue(targetScriptValue) , m_logger(logger) - , m_scanResultCache(new ScanResultCache) , m_cppScanner(0) , m_hppScanner(0) { @@ -74,7 +96,6 @@ QtMocScanner::QtMocScanner(const ResolvedProductPtr &product, QScriptValue targe QtMocScanner::~QtMocScanner() { m_targetScriptValue.setProperty(QLatin1String("QtMocScanner"), QScriptValue()); - delete m_scanResultCache; } ScannerPlugin *QtMocScanner::scannerPluginForFileTags(const FileTags &ft) @@ -86,25 +107,29 @@ ScannerPlugin *QtMocScanner::scannerPluginForFileTags(const FileTags &ft) return m_hppScanner; } -static ScanResultCache::Result runScanner(ScannerPlugin *scanner, const Artifact *artifact, - ScanResultCache *scanResultCache) +static RawScanResult runScanner(ScannerPlugin *scanner, const Artifact *artifact) { const QString &filepath = artifact->filePath(); - ScanResultCache::Result scanResult = scanResultCache->value(scanner, filepath); - if (!scanResult.valid) { - scanResult.valid = true; + QtScanner depScanner((PluginDependencyScanner(scanner))); + RawScanResults &rawScanResults + = artifact->product->topLevelProject()->buildData->rawScanResults; + RawScanResults::ScanData &scanData = rawScanResults.findScanData(artifact, &depScanner, + artifact->properties); + if (scanData.lastScanTime < artifact->timestamp()) { const QByteArray tagsForScanner = artifact->fileTags().toStringList().join(QLatin1Char(',')).toLatin1(); void *opaq = scanner->open(filepath.utf16(), tagsForScanner.constData(), ScanForDependenciesFlag | ScanForFileTagsFlag); if (!opaq || !scanner->additionalFileTags) - return scanResult; + return scanData.rawScanResult; + scanData.rawScanResult.additionalFileTags.clear(); + scanData.rawScanResult.deps.clear(); int length = 0; const char **szFileTagsFromScanner = scanner->additionalFileTags(opaq, &length); if (szFileTagsFromScanner) { for (int i = length; --i >= 0;) - scanResult.additionalFileTags += szFileTagsFromScanner[i]; + scanData.rawScanResult.additionalFileTags += szFileTagsFromScanner[i]; } QString baseDirOfInFilePath = artifact->dirPath(); @@ -122,13 +147,13 @@ static ScanResultCache::Result runScanner(ScannerPlugin *scanner, const Artifact if (FileInfo::exists(localFilePath)) includedFilePath = localFilePath; } - scanResult.deps += RawScannedDependency(includedFilePath); + scanData.rawScanResult.deps += RawScannedDependency(includedFilePath); } scanner->close(opaq); - scanResultCache->insert(scanner, filepath, scanResult); + scanData.lastScanTime = FileTime::currentTime(); } - return scanResult; + return scanData.rawScanResult; } void QtMocScanner::findIncludedMocCppFiles() @@ -143,9 +168,8 @@ void QtMocScanner::findIncludedMocCppFiles() << QStringLiteral("cpp") << QStringLiteral("objcpp")); foreach (Artifact *artifact, m_product->lookupArtifactsByFileTags(mocCppTags)) { - const ScanResultCache::Result scanResult - = runScanner(scannerPluginForFileTags(artifact->fileTags()), - artifact, m_scanResultCache); + const RawScanResult scanResult + = runScanner(scannerPluginForFileTags(artifact->fileTags()), artifact); foreach (const RawScannedDependency &dependency, scanResult.deps) { QString includedFileName = dependency.fileName(); if (includedFileName.startsWith(QLatin1String("moc_")) @@ -205,7 +229,7 @@ QScriptValue QtMocScanner::apply(QScriptEngine *engine, const Artifact *artifact ScannerPlugin * const scanner = scannerPluginForFileTags(artifact->fileTags()); - const ScanResultCache::Result scanResult = runScanner(scanner, artifact, m_scanResultCache); + const RawScanResult scanResult = runScanner(scanner, artifact); if (!scanResult.additionalFileTags.isEmpty()) { if (isHeaderFile) { if (scanResult.additionalFileTags.contains("moc_hpp")) diff --git a/src/lib/corelib/buildgraph/qtmocscanner.h b/src/lib/corelib/buildgraph/qtmocscanner.h index 3009d588b..806ec1f7b 100644 --- a/src/lib/corelib/buildgraph/qtmocscanner.h +++ b/src/lib/corelib/buildgraph/qtmocscanner.h @@ -58,7 +58,6 @@ namespace qbs { namespace Internal { class Artifact; -class ScanResultCache; class QtMocScanner { @@ -76,7 +75,6 @@ private: const ResolvedProductPtr &m_product; QScriptValue m_targetScriptValue; const Logger &m_logger; - ScanResultCache *m_scanResultCache; QHash<QString, QString> m_includedMocCppFiles; ScannerPlugin *m_cppScanner; ScannerPlugin *m_objcppScanner; diff --git a/src/lib/corelib/buildgraph/scanresultcache.cpp b/src/lib/corelib/buildgraph/rawscanneddependency.cpp index 2c0814aef..5839f2f4a 100644 --- a/src/lib/corelib/buildgraph/scanresultcache.cpp +++ b/src/lib/corelib/buildgraph/rawscanneddependency.cpp @@ -37,21 +37,49 @@ ** ****************************************************************************/ -#include "scanresultcache.h" -#include <tools/fileinfo.h> +#include "rawscanneddependency.h" + +#include <tools/persistence.h> namespace qbs { namespace Internal { -ScanResultCache::Result ScanResultCache::value(const void *scanner, const QString &fileName) const +RawScannedDependency::RawScannedDependency() : m_isClean(true) {} + +RawScannedDependency::RawScannedDependency(const QString &filePath) +{ + FileInfo::splitIntoDirectoryAndFileName(filePath, &m_dirPath, &m_fileName); + setClean(); +} + +QString RawScannedDependency::filePath() const +{ + return m_dirPath.isEmpty() ? m_fileName : m_dirPath + QLatin1Char('/') + m_fileName; +} + +void RawScannedDependency::setClean() { - return m_data[scanner][fileName]; + m_isClean = !m_dirPath.contains(QLatin1Char('.')) && !m_dirPath.contains(QLatin1String("//")); } -void ScanResultCache::insert(const void *scanner, const QString &fileName, const ScanResultCache::Result &value) +void RawScannedDependency::load(PersistentPool &pool) { - m_data[scanner].insert(fileName, value); + pool.load(m_dirPath); + pool.load(m_fileName); + setClean(); } +void RawScannedDependency::store(PersistentPool &pool) const +{ + pool.store(m_dirPath); + pool.store(m_fileName); +} + +bool operator==(const RawScannedDependency &d1, const RawScannedDependency &d2) +{ + return d1.dirPath() == d2.dirPath() && d1.fileName() == d2.fileName(); +} + + } // namespace Internal } // namespace qbs diff --git a/src/lib/corelib/buildgraph/rawscanneddependency.h b/src/lib/corelib/buildgraph/rawscanneddependency.h index af236599e..738a3294d 100644 --- a/src/lib/corelib/buildgraph/rawscanneddependency.h +++ b/src/lib/corelib/buildgraph/rawscanneddependency.h @@ -46,33 +46,37 @@ namespace qbs { namespace Internal { +class PersistentPool; class RawScannedDependency { public: - RawScannedDependency() : m_isClean(true) {} + RawScannedDependency(); + RawScannedDependency(const QString &filePath); - RawScannedDependency(const QString &filePath) - { - FileInfo::splitIntoDirectoryAndFileName(filePath, &m_dirPath, &m_fileName); - - m_isClean = !m_dirPath.contains(QLatin1Char('.')) - && !m_dirPath.contains(QLatin1String("//")); - } - - QString filePath() const { - return m_dirPath.isEmpty() ? m_fileName : m_dirPath + QLatin1Char('/') + m_fileName; - } + QString filePath() const; const QString &dirPath() const { return m_dirPath; } const QString &fileName() const { return m_fileName; } bool isClean() const { return m_isClean; } + bool isValid() const { return !m_fileName.isEmpty(); } + + void load(PersistentPool &pool); + void store(PersistentPool &pool) const; private: + void setClean(); + QString m_dirPath; QString m_fileName; bool m_isClean; }; +bool operator==(const RawScannedDependency &d1, const RawScannedDependency &d2); +inline bool operator!=(const RawScannedDependency &d1, const RawScannedDependency &d2) +{ + return !(d1 == d2); +} + } // namespace Internal } // namespace qbs diff --git a/src/lib/corelib/buildgraph/rawscanresults.cpp b/src/lib/corelib/buildgraph/rawscanresults.cpp new file mode 100644 index 000000000..a96574435 --- /dev/null +++ b/src/lib/corelib/buildgraph/rawscanresults.cpp @@ -0,0 +1,114 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qbs. +** +** $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 "rawscanresults.h" + +#include "filedependency.h" +#include "depscanner.h" + +#include <tools/persistence.h> +#include <language/propertymapinternal.h> + +#include <utility> + +namespace qbs { +namespace Internal { + +void RawScanResult::load(PersistentPool &pool) +{ + pool.load(deps); + pool.load(additionalFileTags); +} + +void RawScanResult::store(PersistentPool &pool) const +{ + pool.store(deps); + pool.store(additionalFileTags); +} + +void RawScanResults::ScanData::load(PersistentPool &pool) +{ + pool.load(scannerId); + pool.load(moduleProperties); + pool.load(lastScanTime); + pool.load(rawScanResult); +} + +void RawScanResults::ScanData::store(PersistentPool &pool) const +{ + pool.store(scannerId); + pool.store(moduleProperties); + pool.store(lastScanTime); + pool.store(rawScanResult); +} + +RawScanResults::ScanData &RawScanResults::findScanData( + const FileResourceBase *file, + const DependencyScanner *scanner, + const PropertyMapConstPtr &moduleProperties) +{ + QVector<ScanData> &scanDataForFile = m_rawScanData[file->filePath()]; + const QString &scannerId = scanner->id(); + for (auto it = scanDataForFile.begin(); it != scanDataForFile.end(); ++it) { + ScanData &scanData = *it; + if (scannerId != scanData.scannerId) + continue; + if (!scanner->areModulePropertiesCompatible(moduleProperties, scanData.moduleProperties)) + continue; + return scanData; + } + ScanData newScanData; + newScanData.scannerId = scannerId; + newScanData.moduleProperties = moduleProperties; + scanDataForFile.append(std::move(newScanData)); + return scanDataForFile.last(); +} + +void RawScanResults::load(PersistentPool &pool) +{ + pool.load(m_rawScanData); +} + +void RawScanResults::store(PersistentPool &pool) const +{ + pool.store(m_rawScanData); +} + +} // namespace Internal +} // namespace qbs diff --git a/src/lib/corelib/buildgraph/scanresultcache.h b/src/lib/corelib/buildgraph/rawscanresults.h index 4a60d2bee..ab7dceb2b 100644 --- a/src/lib/corelib/buildgraph/scanresultcache.h +++ b/src/lib/corelib/buildgraph/rawscanresults.h @@ -37,12 +37,14 @@ ** ****************************************************************************/ -#ifndef QBS_SCANRESULTCACHE_H -#define QBS_SCANRESULTCACHE_H +#ifndef QBS_RAWSCANRESULTS_H +#define QBS_RAWSCANRESULTS_H #include "rawscanneddependency.h" #include <language/filetags.h> +#include <language/forward_decls.h> +#include <tools/filetime.h> #include <QtCore/qhash.h> #include <QtCore/qstring.h> @@ -50,31 +52,47 @@ namespace qbs { namespace Internal { +class DependencyScanner; +class FileResourceBase; +class PersistentPool; -class ScanResultCache +class RawScanResult { public: - class Result + QVector<RawScannedDependency> deps; + FileTags additionalFileTags; + + void load(PersistentPool &pool); + void store(PersistentPool &pool) const; +}; + +class RawScanResults +{ +public: + struct ScanData { - public: - Result() - : valid(false) - {} + QString scannerId; + PropertyMapConstPtr moduleProperties; + FileTime lastScanTime; + RawScanResult rawScanResult; - QVector<RawScannedDependency> deps; - FileTags additionalFileTags; - bool valid; + void load(PersistentPool &pool); + void store(PersistentPool &pool) const; }; - Result value(const void* scanner, const QString &fileName) const; - void insert(const void* scanner, const QString &fileName, const Result &value); + ScanData &findScanData( + const FileResourceBase *file, + const DependencyScanner *scanner, + const PropertyMapConstPtr &moduleProperties); + + void load(PersistentPool &pool); + void store(PersistentPool &pool) const; private: - typedef QHash<const void*, QHash<QString, Result> > ScanResultCacheData; - ScanResultCacheData m_data; + QHash<QString, QVector<ScanData>> m_rawScanData; }; -} // namespace qbs +} // namespace Internal } // namespace qbs -#endif // QBS_SCANRESULTCACHE_H +#endif // Include guard |