diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp
index 769638a4cdc8a790a4856959ec9594b7309148e1..d549a53fb5b0a4c0b6b5f80c7acf75717eea5d14 100644
--- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp
+++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp
@@ -255,7 +255,14 @@ CMakeConfig BuildDirManager::configuration() const
     if (!m_hasData)
         return CMakeConfig();
 
-    return parseConfiguration();
+    Utils::FileName cacheFile = workDirectory();
+    cacheFile.appendPath(QLatin1String("CMakeCache.txt"));
+    QString errorMessage;
+    CMakeConfig result = parseConfiguration(cacheFile, sourceDirectory(), &errorMessage);
+    if (!errorMessage.isEmpty())
+        emit errorOccured(errorMessage);
+
+    return result;
 }
 
 void BuildDirManager::stopProcess()
@@ -517,13 +524,17 @@ static CMakeConfigItem::Type fromByteArray(const QByteArray &type) {
     return CMakeConfigItem::INTERNAL;
 }
 
-CMakeConfig BuildDirManager::parseConfiguration() const
+CMakeConfig BuildDirManager::parseConfiguration(const Utils::FileName &cacheFile,
+                                                const Utils::FileName &sourceDir,
+                                                QString *errorMessage)
 {
     CMakeConfig result;
-    const QString cacheFile = QDir(workDirectory().toString()).absoluteFilePath(QLatin1String("CMakeCache.txt"));
-    QFile cache(cacheFile);
-    if (!cache.open(QIODevice::ReadOnly | QIODevice::Text))
+    QFile cache(cacheFile.toString());
+    if (!cache.open(QIODevice::ReadOnly | QIODevice::Text)) {
+        if (errorMessage)
+            *errorMessage = tr("Failed to open %1 for reading.").arg(cacheFile.toUserOutput());
         return CMakeConfig();
+    }
 
     QSet<QByteArray> advancedSet;
     QByteArray documentation;
@@ -557,9 +568,12 @@ CMakeConfig BuildDirManager::parseConfiguration() const
             // Sanity checks:
             if (key == "CMAKE_HOME_DIRECTORY") {
                 const Utils::FileName actualSourceDir = Utils::FileName::fromUserInput(QString::fromUtf8(value));
-                if (actualSourceDir != sourceDirectory())
-                    emit errorOccured(tr("Build directory contains a build of the wrong project (%1).")
-                                      .arg(actualSourceDir.toUserOutput()));
+                if (actualSourceDir != sourceDir) {
+                    if (errorMessage)
+                        *errorMessage = tr("Build directory contains a build of the wrong project (%1).")
+                            .arg(actualSourceDir.toUserOutput());
+                    return CMakeConfig();
+                }
             }
         }
     }
diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.h b/src/plugins/cmakeprojectmanager/builddirmanager.h
index b6bbebf350bae60e98d5dab3ac1409aee67ac3a3..53abb3cf98b7169c7443c58b2bd9d271300ca7fd 100644
--- a/src/plugins/cmakeprojectmanager/builddirmanager.h
+++ b/src/plugins/cmakeprojectmanager/builddirmanager.h
@@ -86,6 +86,10 @@ public:
     void clearFiles();
     CMakeConfig configuration() const;
 
+    static CMakeConfig parseConfiguration(const Utils::FileName &cacheFile,
+                                          const Utils::FileName &sourceDir,
+                                          QString *errorMessage);
+
 signals:
     void configurationStarted() const;
     void dataAvailable() const;
@@ -102,7 +106,6 @@ private:
     void processCMakeOutput();
     void processCMakeError();
 
-    CMakeConfig parseConfiguration() const;
 
     bool m_hasData = false;