diff --git a/src/shared/proparser/qmakeevaluator.cpp b/src/shared/proparser/qmakeevaluator.cpp
index 93e224d12fc073d713668b55323729c66c11c70a..888da089785fd59326c1e2793970bbec2cb12299 100644
--- a/src/shared/proparser/qmakeevaluator.cpp
+++ b/src/shared/proparser/qmakeevaluator.cpp
@@ -945,6 +945,20 @@ bool QMakeEvaluator::prepareProject(const QString &inDir)
         if (cachefile.isEmpty())  { //find it as it has not been specified
             if (m_outputDir.isEmpty())
                 goto no_cache;
+            QString superdir = m_outputDir;
+            forever {
+                QString superfile = superdir + QLatin1String("/.qmake.super");
+                if (IoUtils::exists(superfile)) {
+                    m_superfile = superfile;
+                    break;
+                }
+                QFileInfo qdfi(superdir);
+                if (qdfi.isRoot()) {
+                    superdir.clear();
+                    break;
+                }
+                superdir = qdfi.path();
+            }
             QString sdir = inDir;
             QString dir = m_outputDir;
             forever {
@@ -959,6 +973,8 @@ bool QMakeEvaluator::prepareProject(const QString &inDir)
                     m_buildRoot = dir;
                     break;
                 }
+                if (dir == superdir)
+                    goto no_cache;
                 QFileInfo qsdfi(sdir);
                 QFileInfo qdfi(dir);
                 if (qsdfi.isRoot() || qdfi.isRoot())
@@ -984,6 +1000,11 @@ bool QMakeEvaluator::loadSpec()
 
     {
         QMakeEvaluator evaluator(m_option, m_parser, m_handler);
+        if (!m_superfile.isEmpty()) {
+            valuesRef(ProString("_QMAKE_SUPER_CACHE_")) << ProString(m_superfile, NoHash);
+            if (!evaluator.evaluateFileDirect(m_superfile, QMakeHandler::EvalConfigFile, LoadProOnly))
+                return false;
+        }
         if (!m_conffile.isEmpty()) {
             valuesRef(ProString("_QMAKE_CONF_")) << ProString(m_conffile, NoHash);
             if (!evaluator.evaluateFileDirect(m_conffile, QMakeHandler::EvalConfigFile, LoadProOnly))
@@ -1014,6 +1035,10 @@ bool QMakeEvaluator::loadSpec()
   cool:
     m_qmakespec = QDir::cleanPath(qmakespec);
 
+    if (!m_superfile.isEmpty()
+        && !evaluateFileDirect(m_superfile, QMakeHandler::EvalConfigFile, LoadProOnly)) {
+        return false;
+    }
     if (!evaluateFeatureFile(QLatin1String("spec_pre.prf")))
         return false;
     QString spec = m_qmakespec + QLatin1String("/qmake.conf");
@@ -1107,6 +1132,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProFile(
 
                 QMakeEvaluator *baseEval = new QMakeEvaluator(m_option, m_parser, m_handler);
                 baseEnv->evaluator = baseEval;
+                baseEval->m_superfile = m_superfile;
                 baseEval->m_conffile = m_conffile;
                 baseEval->m_cachefile = m_cachefile;
                 baseEval->m_sourceRoot = m_sourceRoot;
diff --git a/src/shared/proparser/qmakeevaluator.h b/src/shared/proparser/qmakeevaluator.h
index c96641e1d1747a708297501852751999b8593e1c..6c08b775de85e7722819d76db0749d063278f93a 100644
--- a/src/shared/proparser/qmakeevaluator.h
+++ b/src/shared/proparser/qmakeevaluator.h
@@ -200,6 +200,7 @@ public:
     int m_listCount;
     QString m_qmakespec;
     QString m_qmakespecName;
+    QString m_superfile;
     QString m_conffile;
     QString m_cachefile;
     QString m_sourceRoot;