aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-05-17 14:03:01 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2018-05-18 07:05:41 +0000
commitd8f1a1b01ed947a1d70c7635945b845a6236f64e (patch)
treeaea5b37a956b0e32286fc75dabb2c0d05e09b822
parent9008034adf19176c399853ddd04e36ea3473e26e (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.cpp2
-rw-r--r--src/lib/corelib/buildgraph/artifact.h2
-rw-r--r--src/lib/corelib/buildgraph/buildgraphloader.cpp1
-rw-r--r--src/lib/corelib/buildgraph/executor.cpp9
-rw-r--r--src/lib/corelib/buildgraph/rescuableartifactdata.h3
-rw-r--r--src/lib/corelib/tools/persistence.cpp2
-rw-r--r--tests/auto/blackbox/testdata/out-of-date-marking/main.c3
-rw-r--r--tests/auto/blackbox/testdata/out-of-date-marking/out-of-date-marking.qbs22
-rw-r--r--tests/auto/blackbox/tst_blackbox.cpp10
-rw-r--r--tests/auto/blackbox/tst_blackbox.h1
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();