aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@theqtcompany.com>2015-10-23 10:20:59 +0200
committerChristian Kandeler <christian.kandeler@theqtcompany.com>2015-10-26 14:08:37 +0000
commit9bbbf55ea6d1e80871ab810eebaeaf377bc0aad0 (patch)
tree8896a7e71a889504722e3cfe3ec452a744d67a3c
parent7251fc9f805ed84a90b2b78a8d850d6534718d27 (diff)
Change tracking: Be more sensitive to environment changes.
Contrary to what the old code assumed, it is not enough to compare the values of environment variables that were used while resolving the project: A command run by a transformer might be sensitive to environment changes as well (e.g. gcc to CPLUS_INCLUDE_PATH). Note: This does not mean we will rebuild everything when anything in the environment changes; it means that *if* a file is rebuilt, its command will see the new environment instead of the old one. Change-Id: I7916b8c40f1440564034ec3317c549ebd4e988a0 Reviewed-by: Jake Petroules <jake.petroules@theqtcompany.com> Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
-rw-r--r--src/lib/corelib/buildgraph/buildgraphloader.cpp15
-rw-r--r--src/lib/corelib/language/language.h8
-rw-r--r--tests/auto/blackbox/testdata/trackExternalProductChanges/hidden/hiddenheaderqbs.h0
-rw-r--r--tests/auto/blackbox/testdata/trackExternalProductChanges/including.cpp3
-rw-r--r--tests/auto/blackbox/testdata/trackExternalProductChanges/project.qbs6
-rw-r--r--tests/auto/blackbox/tst_blackbox.cpp16
6 files changed, 37 insertions, 11 deletions
diff --git a/src/lib/corelib/buildgraph/buildgraphloader.cpp b/src/lib/corelib/buildgraph/buildgraphloader.cpp
index c1e1204b3..bf9f5e534 100644
--- a/src/lib/corelib/buildgraph/buildgraphloader.cpp
+++ b/src/lib/corelib/buildgraph/buildgraphloader.cpp
@@ -335,16 +335,11 @@ void BuildGraphLoader::trackProjectChanges()
bool BuildGraphLoader::hasEnvironmentChanged(const TopLevelProjectConstPtr &restoredProject) const
{
- for (QHash<QString, QString>::ConstIterator it = restoredProject->usedEnvironment.constBegin();
- it != restoredProject->usedEnvironment.constEnd(); ++it) {
- const QString var = it.key();
- const QString oldValue = it.value();
- const QString newValue = m_environment.value(var);
- if (newValue != oldValue) {
- m_logger.qbsDebug() << QString::fromLatin1("Environment variable '%1' changed "
- "from '%2' to '%3'. Must re-resolve project.").arg(var, oldValue, newValue);
- return true;
- }
+ if (m_environment != restoredProject->environment) {
+ m_logger.qbsDebug() << "Set of environment variables changed. Must re-resolve project.";
+ m_logger.qbsTrace() << "old: " << restoredProject->environment.toStringList() << "\nnew:"
+ << m_environment.toStringList();
+ return true;
}
return false;
}
diff --git a/src/lib/corelib/language/language.h b/src/lib/corelib/language/language.h
index 00d3963b9..8e1e90af9 100644
--- a/src/lib/corelib/language/language.h
+++ b/src/lib/corelib/language/language.h
@@ -458,7 +458,13 @@ public:
QString buildDirectory; // Not saved
QProcessEnvironment environment;
- QHash<QString, QString> usedEnvironment; // Environment variables requested by the project while resolving.
+
+ // Environment variables requested by the project while resolving.
+ // TODO: This information is currently not used. Remove in 1.5 or use elaborate change tracking
+ // logic where rules declare the environment variables that could influence their
+ // behavior.
+ QHash<QString, QString> usedEnvironment;
+
QHash<QString, QString> canonicalFilePathResults; // Results of calls to "File.canonicalFilePath()."
QHash<QString, bool> fileExistsResults; // Results of calls to "File.exists()".
QHash<QString, FileTime> fileLastModifiedResults; // Results of calls to "File.lastModified()".
diff --git a/tests/auto/blackbox/testdata/trackExternalProductChanges/hidden/hiddenheaderqbs.h b/tests/auto/blackbox/testdata/trackExternalProductChanges/hidden/hiddenheaderqbs.h
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/auto/blackbox/testdata/trackExternalProductChanges/hidden/hiddenheaderqbs.h
diff --git a/tests/auto/blackbox/testdata/trackExternalProductChanges/including.cpp b/tests/auto/blackbox/testdata/trackExternalProductChanges/including.cpp
new file mode 100644
index 000000000..bfe738d1d
--- /dev/null
+++ b/tests/auto/blackbox/testdata/trackExternalProductChanges/including.cpp
@@ -0,0 +1,3 @@
+#include <hiddenheaderqbs.h>
+
+void f() {}
diff --git a/tests/auto/blackbox/testdata/trackExternalProductChanges/project.qbs b/tests/auto/blackbox/testdata/trackExternalProductChanges/project.qbs
index df1ddc1f9..451b0a25a 100644
--- a/tests/auto/blackbox/testdata/trackExternalProductChanges/project.qbs
+++ b/tests/auto/blackbox/testdata/trackExternalProductChanges/project.qbs
@@ -6,4 +6,10 @@ CppApplication {
property stringList filesFromEnv: qbs.getEnv("QBS_TEST_PULL_IN_FILE_VIA_ENV")
? ["environmentChange.cpp"] : []
files: ["main.cpp"].concat(FileList.fileList()).concat(filesFromEnv).concat(FileList.filesFromFs(qbs))
+
+ Group {
+ condition: qbs.getEnv("INCLUDE_PATH_TEST")
+ name: "file that needs help from the environment to find a header"
+ files: "including.cpp"
+ }
}
diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp
index b7c382d46..c90ac5618 100644
--- a/tests/auto/blackbox/tst_blackbox.cpp
+++ b/tests/auto/blackbox/tst_blackbox.cpp
@@ -843,6 +843,22 @@ void TestBlackbox::trackExternalProductChanges()
QVERIFY(!m_qbsStdout.contains("compiling environmentChange.cpp"));
QVERIFY(!m_qbsStdout.contains("compiling jsFileChange.cpp"));
QVERIFY(m_qbsStdout.contains("compiling fileExists.cpp"));
+
+ rmDirR(relativeBuildDir());
+ Settings s((QString()));
+ const Profile profile(profileName(), &s);
+ const QStringList toolchainTypes = profile.value("qbs.toolchain").toStringList();
+ if (!toolchainTypes.contains("gcc"))
+ QSKIP("Need GCC-like compiler to run this test");
+ params.environment = QProcessEnvironment::systemEnvironment();
+ params.environment.insert("INCLUDE_PATH_TEST", "1");
+ params.expectFailure = true;
+ QVERIFY(runQbs(params) != 0);
+ QVERIFY2(m_qbsStderr.contains("hiddenheaderqbs.h"), m_qbsStderr.constData());
+ params.environment.insert("CPLUS_INCLUDE_PATH",
+ QDir::toNativeSeparators(QDir::currentPath() + "/hidden"));
+ params.expectFailure = false;
+ QCOMPARE(runQbs(params), 0);
}
void TestBlackbox::trackRemoveFile()