diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-05-17 14:03:01 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-05-18 07:05:41 +0000 |
commit | d8f1a1b01ed947a1d70c7635945b845a6236f64e (patch) | |
tree | aea5b37a956b0e32286fc75dabb2c0d05e09b822 | |
parent | 9008034adf19176c399853ddd04e36ea3473e26e (diff) |
Mark parent artifacts explicitly as out of date
... after a transformer finishes. This makes our "out of date" check
independent of the local clock resolution for generated artifacts that
do not have source artifacts as children.
Change-Id: If3d47f1fd859c30846806fabaddf3b47a840a6d3
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
-rw-r--r-- | src/lib/corelib/buildgraph/artifact.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/artifact.h | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/buildgraphloader.cpp | 1 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/executor.cpp | 9 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/rescuableartifactdata.h | 3 | ||||
-rw-r--r-- | src/lib/corelib/tools/persistence.cpp | 2 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/out-of-date-marking/main.c | 3 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/out-of-date-marking/out-of-date-marking.qbs | 22 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackbox.cpp | 10 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackbox.h | 1 |
10 files changed, 53 insertions, 2 deletions
diff --git a/src/lib/corelib/buildgraph/artifact.cpp b/src/lib/corelib/buildgraph/artifact.cpp index 5e38c3b36..667194356 100644 --- a/src/lib/corelib/buildgraph/artifact.cpp +++ b/src/lib/corelib/buildgraph/artifact.cpp @@ -145,6 +145,7 @@ void Artifact::load(PersistentPool &pool) artifactType = static_cast<ArtifactType>(pool.load<quint8>()); alwaysUpdated = pool.load<bool>(); oldDataPossiblyPresent = pool.load<bool>(); + pool.load(knownOutOfDate); } void Artifact::store(PersistentPool &pool) @@ -162,6 +163,7 @@ void Artifact::store(PersistentPool &pool) pool.store(static_cast<quint8>(artifactType)); pool.store(alwaysUpdated); pool.store(oldDataPossiblyPresent); + pool.store(knownOutOfDate); } } // namespace Internal diff --git a/src/lib/corelib/buildgraph/artifact.h b/src/lib/corelib/buildgraph/artifact.h index 5ca4f4d46..b1669974c 100644 --- a/src/lib/corelib/buildgraph/artifact.h +++ b/src/lib/corelib/buildgraph/artifact.h @@ -100,6 +100,8 @@ public: bool alwaysUpdated : 1; bool oldDataPossiblyPresent : 1; + bool knownOutOfDate = false; + void initialize(); const TypeFilter<Artifact> parentArtifacts() const; const TypeFilter<Artifact> childArtifacts() const; diff --git a/src/lib/corelib/buildgraph/buildgraphloader.cpp b/src/lib/corelib/buildgraph/buildgraphloader.cpp index bef7145ca..9890a8327 100644 --- a/src/lib/corelib/buildgraph/buildgraphloader.cpp +++ b/src/lib/corelib/buildgraph/buildgraphloader.cpp @@ -857,6 +857,7 @@ void BuildGraphLoader::rescueOldBuildData(const ResolvedProductConstPtr &restore if (!newArtifact) { RescuableArtifactData rad; rad.timeStamp = oldArtifact->timestamp(); + rad.knownOutOfDate = oldArtifact->knownOutOfDate; rad.fileTags = oldArtifact->fileTags(); rad.properties = oldArtifact->properties; rad.commands = oldArtifact->transformer->commands; diff --git a/src/lib/corelib/buildgraph/executor.cpp b/src/lib/corelib/buildgraph/executor.cpp index 1783decab..24f484ad2 100644 --- a/src/lib/corelib/buildgraph/executor.cpp +++ b/src/lib/corelib/buildgraph/executor.cpp @@ -391,6 +391,11 @@ bool Executor::isUpToDate(Artifact *artifact) const return false; } + if (artifact->knownOutOfDate) { + qCDebug(lcUpToDateCheck) << "Explicitly marked as out of date."; + return false; + } + for (Artifact *childArtifact : filterByType<Artifact>(artifact->children)) { QBS_CHECK(childArtifact->timestamp().isValid()); qCDebug(lcUpToDateCheck) << "child timestamp" @@ -564,6 +569,9 @@ void Executor::finishJob(ExecutorJob *job, bool success) for (Artifact * const artifact : qAsConst(transformer->outputs)) { if (artifact->alwaysUpdated) { artifact->setTimestamp(FileTime::currentTime()); + artifact->knownOutOfDate = false; + for (Artifact * const parent : artifact->parentArtifacts()) + parent->knownOutOfDate = true; if (m_buildOptions.forceOutputCheck() && !m_buildOptions.dryRun() && !FileInfo(artifact->filePath()).exists()) { if (transformer->rule) { @@ -854,6 +862,7 @@ void Executor::rescueOldBuildData(Artifact *artifact, bool *childrenAdded = 0) artifact->transformer->lastPrepareScriptExecutionTime = rad.lastPrepareScriptExecutionTime; artifact->transformer->commandsNeedChangeTracking = true; artifact->setTimestamp(rad.timeStamp); + artifact->knownOutOfDate = artifact->knownOutOfDate || rad.knownOutOfDate; if (childrenAdded && !childrenToConnect.empty()) *childrenAdded = true; for (const ChildArtifactData &cad : qAsConst(childrenToConnect)) { diff --git a/src/lib/corelib/buildgraph/rescuableartifactdata.h b/src/lib/corelib/buildgraph/rescuableartifactdata.h index 7e846aef7..fbcf8a9d4 100644 --- a/src/lib/corelib/buildgraph/rescuableartifactdata.h +++ b/src/lib/corelib/buildgraph/rescuableartifactdata.h @@ -66,7 +66,7 @@ class QBS_AUTOTEST_EXPORT RescuableArtifactData public: template<PersistentPool::OpType opType> void completeSerializationOp(PersistentPool &pool) { - pool.serializationOp<opType>(timeStamp, children, fileDependencies, + pool.serializationOp<opType>(timeStamp, children, fileDependencies, knownOutOfDate, propertiesRequestedInPrepareScript, propertiesRequestedInCommands, propertiesRequestedFromArtifactInPrepareScript, @@ -105,6 +105,7 @@ public: FileTime timeStamp; QList<ChildData> children; std::vector<QString> fileDependencies; + bool knownOutOfDate = false; // Per-Transformer data CommandList commands; diff --git a/src/lib/corelib/tools/persistence.cpp b/src/lib/corelib/tools/persistence.cpp index 0dab81440..4ad024c8d 100644 --- a/src/lib/corelib/tools/persistence.cpp +++ b/src/lib/corelib/tools/persistence.cpp @@ -49,7 +49,7 @@ namespace qbs { namespace Internal { -static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE-117"; +static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE-118"; NoBuildGraphError::NoBuildGraphError(const QString &filePath) : ErrorInfo(Tr::tr("Build graph not found for configuration '%1'. Expected location was '%2'.") diff --git a/tests/auto/blackbox/testdata/out-of-date-marking/main.c b/tests/auto/blackbox/testdata/out-of-date-marking/main.c new file mode 100644 index 000000000..7b4a384a7 --- /dev/null +++ b/tests/auto/blackbox/testdata/out-of-date-marking/main.c @@ -0,0 +1,3 @@ +#include <myheader.h> + +int main() { return 0; } diff --git a/tests/auto/blackbox/testdata/out-of-date-marking/out-of-date-marking.qbs b/tests/auto/blackbox/testdata/out-of-date-marking/out-of-date-marking.qbs new file mode 100644 index 000000000..1ef57bae7 --- /dev/null +++ b/tests/auto/blackbox/testdata/out-of-date-marking/out-of-date-marking.qbs @@ -0,0 +1,22 @@ +import qbs +import qbs.TextFile + +CppApplication { + name: "app" + files: "main.c" + cpp.includePaths: buildDirectory + Rule { + multiplex: true + alwaysRun: true + Artifact { filePath: "myheader.h"; fileTags: "hpp" } + prepare: { + var cmd = new JavaScriptCommand(); + cmd.description = "generating " + output.fileName; + cmd.sourceCode = function() { + var f = new TextFile(output.filePath, TextFile.WriteOnly); + f.close(); + }; + return cmd; + } + } +} diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index 93387e2f6..2cf0c5003 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -5066,6 +5066,16 @@ void TestBlackbox::nsisDependencies() QCOMPARE(m_qbsStdout.contains("compiling hello.nsi"), targetIsWindows); } +void TestBlackbox::outOfDateMarking() +{ + QDir::setCurrent(testDataDir + "/out-of-date-marking"); + for (int i = 0; i < 25; ++i) { + QCOMPARE(runQbs(), 0); + QVERIFY2(m_qbsStdout.contains("generating myheader.h"), qPrintable(QString::number(i))); + QVERIFY2(m_qbsStdout.contains("compiling main.c"), qPrintable(QString::number(i))); + } +} + void TestBlackbox::enableExceptions() { QFETCH(QString, file); diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h index 2646704f9..f55158be5 100644 --- a/tests/auto/blackbox/tst_blackbox.h +++ b/tests/auto/blackbox/tst_blackbox.h @@ -178,6 +178,7 @@ private slots: void nonDefaultProduct(); void nsis(); void nsisDependencies(); + void outOfDateMarking(); void outputArtifactAutoTagging(); void overrideProjectProperties(); void pchChangeTracking(); |