diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2017-08-21 10:17:27 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2017-08-21 08:59:21 +0000 |
commit | dda87877ea6351a7b7902bfc2b48d99867a410ab (patch) | |
tree | 278589aceb85a9ab35ba933f63adc18ddc3719c3 | |
parent | 22c93d768b01936a341dea50b85a3a3d7484da72 (diff) |
Fix edge case in change tracking
Under certain circumstances, transformers could lose the information
about properties requested by their commands. Make sure this doesn't
happen anymore.
Change-Id: Ib224cd8425760543ae805875024e7886f67825fe
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
8 files changed, 60 insertions, 0 deletions
diff --git a/src/lib/corelib/buildgraph/rulesapplicator.cpp b/src/lib/corelib/buildgraph/rulesapplicator.cpp index 51b743527..0df7d204d 100644 --- a/src/lib/corelib/buildgraph/rulesapplicator.cpp +++ b/src/lib/corelib/buildgraph/rulesapplicator.cpp @@ -358,6 +358,7 @@ Artifact *RulesApplicator::createOutputArtifact(const QString &filePath, const F if (m_rule->declaresInputs() && m_rule->requiresInputs) outputArtifact->clearTimestamp(); m_invalidatedArtifacts += outputArtifact; + m_transformer->rescueChangeTrackingData(outputArtifact->transformer); } else { QScopedPointer<Artifact> newArtifact(new Artifact); newArtifact->artifactType = Artifact::Generated; diff --git a/src/lib/corelib/buildgraph/transformer.cpp b/src/lib/corelib/buildgraph/transformer.cpp index 0e5b4a084..b6e02e708 100644 --- a/src/lib/corelib/buildgraph/transformer.cpp +++ b/src/lib/corelib/buildgraph/transformer.cpp @@ -260,6 +260,17 @@ void Transformer::createCommands(ScriptEngine *engine, const ScriptFunctionConst } } +void Transformer::rescueChangeTrackingData(const TransformerConstPtr &other) +{ + if (!other) + return; + propertiesRequestedInPrepareScript = other->propertiesRequestedInPrepareScript; + propertiesRequestedInCommands = other->propertiesRequestedInCommands; + propertiesRequestedFromArtifactInPrepareScript + = other->propertiesRequestedFromArtifactInPrepareScript; + propertiesRequestedFromArtifactInCommands = other->propertiesRequestedFromArtifactInCommands; +} + void Transformer::load(PersistentPool &pool) { pool.load(rule); diff --git a/src/lib/corelib/buildgraph/transformer.h b/src/lib/corelib/buildgraph/transformer.h index e4ffcb83b..b83321bda 100644 --- a/src/lib/corelib/buildgraph/transformer.h +++ b/src/lib/corelib/buildgraph/transformer.h @@ -82,6 +82,7 @@ public: void setupExplicitlyDependsOn(QScriptValue targetScriptValue); void createCommands(ScriptEngine *engine, const ScriptFunctionConstPtr &script, const QScriptValueList &args); + void rescueChangeTrackingData(const TransformerConstPtr &other); private: Transformer(); diff --git a/tests/auto/blackbox/testdata/rescue-transformer-data/main.cpp b/tests/auto/blackbox/testdata/rescue-transformer-data/main.cpp new file mode 100644 index 000000000..237c8ce18 --- /dev/null +++ b/tests/auto/blackbox/testdata/rescue-transformer-data/main.cpp @@ -0,0 +1 @@ +int main() {} diff --git a/tests/auto/blackbox/testdata/rescue-transformer-data/modules/m/m.qbs b/tests/auto/blackbox/testdata/rescue-transformer-data/modules/m/m.qbs new file mode 100644 index 000000000..03fdf7a6b --- /dev/null +++ b/tests/auto/blackbox/testdata/rescue-transformer-data/modules/m/m.qbs @@ -0,0 +1,21 @@ +import qbs + +Module { + property bool p + + Rule { + multiplex: true + Artifact { + filePath: "dummy" + fileTags: ["out"] + } + prepare: { + var cmd = new JavaScriptCommand(); + cmd.description = "creating dummy"; + cmd.sourceCode = function() { + console.info("m.p: " + product.m.p); + }; + return [cmd]; + } + } +} diff --git a/tests/auto/blackbox/testdata/rescue-transformer-data/transformer-data-rescue.qbs b/tests/auto/blackbox/testdata/rescue-transformer-data/transformer-data-rescue.qbs new file mode 100644 index 000000000..2eafcc01d --- /dev/null +++ b/tests/auto/blackbox/testdata/rescue-transformer-data/transformer-data-rescue.qbs @@ -0,0 +1,7 @@ +import qbs + +CppApplication { + type: base.concat(["out"]) + Depends { name: "m" } + files: ["main.cpp"] +} diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index f26f33d53..3e6fe72b9 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -3258,6 +3258,23 @@ void TestBlackbox::requireDeprecated() m_qbsStderr.constData()); } +void TestBlackbox::rescueTransformerData() +{ + QDir::setCurrent(testDataDir + "/rescue-transformer-data"); + QCOMPARE(runQbs(), 0); + QVERIFY2(m_qbsStdout.contains("compiling main.cpp") && m_qbsStdout.contains("m.p: undefined"), + m_qbsStdout.constData()); + WAIT_FOR_NEW_TIMESTAMP(); + touch("main.cpp"); + QCOMPARE(runQbs(), 0); + QVERIFY2(m_qbsStdout.contains("compiling main.cpp") && !m_qbsStdout.contains("m.p: "), + m_qbsStdout.constData()); + QCOMPARE(runQbs(QbsRunParameters("resolve", QStringList("modules.m.p:true"))), 0); + QCOMPARE(runQbs(), 0); + QVERIFY2(!m_qbsStdout.contains("compiling main.cpp") && m_qbsStdout.contains("m.p: true"), + m_qbsStdout.constData()); +} + void TestBlackbox::multipleChanges() { QDir::setCurrent(testDataDir + "/multiple-changes"); diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h index 1426046cf..9b48fa40d 100644 --- a/tests/auto/blackbox/tst_blackbox.h +++ b/tests/auto/blackbox/tst_blackbox.h @@ -156,6 +156,7 @@ private slots: void reproducibleBuild_data(); void require(); void requireDeprecated(); + void rescueTransformerData(); void responseFiles(); void ruleConditions(); void ruleCycle(); |