aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/corelib/buildgraph/buildgraph.pri5
-rw-r--r--src/lib/corelib/buildgraph/depscanner.cpp35
-rw-r--r--src/lib/corelib/buildgraph/depscanner.h15
-rw-r--r--src/lib/corelib/buildgraph/executor.cpp2
-rw-r--r--src/lib/corelib/buildgraph/executor.h2
-rw-r--r--src/lib/corelib/buildgraph/inputartifactscanner.cpp30
-rw-r--r--src/lib/corelib/buildgraph/inputartifactscanner.h15
-rw-r--r--src/lib/corelib/buildgraph/projectbuilddata.cpp2
-rw-r--r--src/lib/corelib/buildgraph/projectbuilddata.h2
-rw-r--r--src/lib/corelib/buildgraph/qtmocscanner.cpp58
-rw-r--r--src/lib/corelib/buildgraph/qtmocscanner.h2
-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.h28
-rw-r--r--src/lib/corelib/buildgraph/rawscanresults.cpp114
-rw-r--r--src/lib/corelib/buildgraph/rawscanresults.h (renamed from src/lib/corelib/buildgraph/scanresultcache.h)52
-rw-r--r--src/lib/corelib/corelib.qbs5
-rw-r--r--src/lib/corelib/tools/persistence.cpp2
-rw-r--r--tests/auto/blackbox/tst_blackbox.cpp20
18 files changed, 324 insertions, 105 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
diff --git a/src/lib/corelib/corelib.qbs b/src/lib/corelib/corelib.qbs
index d82d2a40b..85528550b 100644
--- a/src/lib/corelib/corelib.qbs
+++ b/src/lib/corelib/corelib.qbs
@@ -135,7 +135,10 @@ QbsLibrary {
"projectbuilddata.h",
"qtmocscanner.cpp",
"qtmocscanner.h",
+ "rawscanneddependency.cpp",
"rawscanneddependency.h",
+ "rawscanresults.cpp",
+ "rawscanresults.h",
"rescuableartifactdata.cpp",
"rescuableartifactdata.h",
"rulecommands.cpp",
@@ -148,8 +151,6 @@ QbsLibrary {
"rulesapplicator.h",
"rulesevaluationcontext.cpp",
"rulesevaluationcontext.h",
- "scanresultcache.cpp",
- "scanresultcache.h",
"timestampsupdater.cpp",
"timestampsupdater.h",
"transformer.cpp",
diff --git a/src/lib/corelib/tools/persistence.cpp b/src/lib/corelib/tools/persistence.cpp
index 3466422ab..5902dc686 100644
--- a/src/lib/corelib/tools/persistence.cpp
+++ b/src/lib/corelib/tools/persistence.cpp
@@ -50,7 +50,7 @@
namespace qbs {
namespace Internal {
-static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE-96";
+static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE-97";
PersistentPool::PersistentPool(Logger &logger) : m_logger(logger)
{
diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp
index b7e74977c..0b45e69a8 100644
--- a/tests/auto/blackbox/tst_blackbox.cpp
+++ b/tests/auto/blackbox/tst_blackbox.cpp
@@ -343,12 +343,9 @@ void TestBlackbox::artifactScanning()
QCOMPARE(m_qbsStderr.count("scanning p1.cpp"), 1);
QCOMPARE(m_qbsStderr.count("scanning p2.cpp"), 0);
QCOMPARE(m_qbsStderr.count("scanning p3.cpp"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning shared.h"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning external.h"), 0);
QCOMPARE(m_qbsStderr.count("scanning external2.h"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning external-indirect.h"), 0);
WAIT_FOR_NEW_TIMESTAMP();
@@ -357,12 +354,9 @@ void TestBlackbox::artifactScanning()
QCOMPARE(m_qbsStderr.count("scanning p1.cpp"), 0);
QCOMPARE(m_qbsStderr.count("scanning p2.cpp"), 1);
QCOMPARE(m_qbsStderr.count("scanning p3.cpp"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning shared.h"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning external.h"), 0);
QCOMPARE(m_qbsStderr.count("scanning external2.h"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning external-indirect.h"), 0);
WAIT_FOR_NEW_TIMESTAMP();
@@ -373,38 +367,29 @@ void TestBlackbox::artifactScanning()
QCOMPARE(m_qbsStderr.count("scanning p3.cpp"), 1);
QCOMPARE(m_qbsStderr.count("scanning shared.h"), 0);
QCOMPARE(m_qbsStderr.count("scanning external.h"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning external2.h"), 0);
QCOMPARE(m_qbsStderr.count("scanning external-indirect.h"), 0);
WAIT_FOR_NEW_TIMESTAMP();
touch("shared.h");
QCOMPARE(runQbs(params), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning p1.cpp"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning p2.cpp"), 0);
QCOMPARE(m_qbsStderr.count("scanning p3.cpp"), 0);
QCOMPARE(m_qbsStderr.count("scanning shared.h"), 1);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning external.h"), 0);
QCOMPARE(m_qbsStderr.count("scanning external2.h"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning external-indirect.h"), 0);
WAIT_FOR_NEW_TIMESTAMP();
touch("external.h");
QCOMPARE(runQbs(params), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning p1.cpp"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning p2.cpp"), 0);
QCOMPARE(m_qbsStderr.count("scanning p3.cpp"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning shared.h"), 0);
QCOMPARE(m_qbsStderr.count("scanning external.h"), 1);
QCOMPARE(m_qbsStderr.count("scanning external2.h"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning external-indirect.h"), 0);
WAIT_FOR_NEW_TIMESTAMP();
@@ -412,7 +397,6 @@ void TestBlackbox::artifactScanning()
QCOMPARE(runQbs(params), 0);
QCOMPARE(m_qbsStderr.count("scanning p1.cpp"), 0);
QCOMPARE(m_qbsStderr.count("scanning p2.cpp"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning p3.cpp"), 0);
QCOMPARE(m_qbsStderr.count("scanning shared.h"), 0);
QCOMPARE(m_qbsStderr.count("scanning external.h"), 0);
@@ -422,14 +406,10 @@ void TestBlackbox::artifactScanning()
WAIT_FOR_NEW_TIMESTAMP();
touch("external-indirect.h");
QCOMPARE(runQbs(params), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning p1.cpp"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning p2.cpp"), 0);
QCOMPARE(m_qbsStderr.count("scanning p3.cpp"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning shared.h"), 0);
- QEXPECT_FAIL(0, "QBS-1052", Continue);
QCOMPARE(m_qbsStderr.count("scanning external.h"), 0);
QCOMPARE(m_qbsStderr.count("scanning external2.h"), 0);
QCOMPARE(m_qbsStderr.count("scanning external-indirect.h"), 1);