look for mkspecs in the project root, not next to every project
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>
Thu, 23 Feb 2012 16:16:03 +0000 (17:16 +0100)
committerQt by Nokia <qt-info@nokia.com>
Tue, 28 Feb 2012 23:05:38 +0000 (00:05 +0100)
qmake would look for mkspecs/ in the directory containing the current
project file. this makes completely no sense with recursive projects:
a) nobody would make per-project specs and b) specs meant to be global
would not be found.

consequently, we look for a project root when starting qmake and use
only that directory.
if .qmake.cache is found/set, we assume that to be the project root.
otherwise, we search for mkspecs/ the same way we search for the cache -
just to up until we find one or hit the root. if we are shadow-building,
search the build dir as well.

Change-Id: Ie66b189a40c21203d956e681cbef44a89f98cd17
Reviewed-by: Joerg Bornemann <joerg.bornemann@nokia.com>
Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
qmake/main.cpp
qmake/option.cpp
qmake/option.h
qmake/project.cpp

index 54cf9f9..985afaa 100644 (file)
@@ -163,7 +163,7 @@ int runQMake(int argc, char **argv)
                 fn = fn.right(fn.length() - di - 1);
             }
 
-            if (!Option::prepareProject()) {
+            if (!Option::prepareProject(fn)) {
                 exit_val = 3;
                 break;
             }
index 0c649fd..16c5390 100644 (file)
@@ -116,6 +116,7 @@ bool Option::mkfile::do_dep_heuristics = true;
 bool Option::mkfile::do_preprocess = false;
 bool Option::mkfile::do_stub_makefile = false;
 bool Option::mkfile::do_cache = true;
+QString Option::mkfile::project_root;
 QString Option::mkfile::project_build_root;
 QString Option::mkfile::cachefile;
 QStringList Option::mkfile::project_files;
@@ -576,7 +577,7 @@ void Option::applyHostMode()
    }
 }
 
-bool Option::prepareProject()
+bool Option::prepareProject(const QString &pfile)
 {
     mkfile::project_build_root.clear();
     if (mkfile::do_cache) {
@@ -601,6 +602,34 @@ bool Option::prepareProject()
         }
     }
   no_cache:
+
+    QString srcpath = (pfile != "-")
+            ? QDir::cleanPath(QFileInfo(pfile).absolutePath()) : qmake_getpwd();
+    if (srcpath != output_dir || mkfile::project_build_root.isEmpty()) {
+        QDir srcdir(srcpath);
+        QDir dstdir(output_dir);
+        do {
+            if (!mkfile::project_build_root.isEmpty()) {
+                // If we already know the build root, just match up the source root with it.
+                if (dstdir.path() == mkfile::project_build_root) {
+                    mkfile::project_root = srcdir.path();
+                    break;
+                }
+            } else {
+                // Look for mkspecs/ in source and build. First to win determines the root.
+                if (dstdir.exists("mkspecs") || srcdir.exists("mkspecs")) {
+                    mkfile::project_build_root = dstdir.path();
+                    mkfile::project_root = srcdir.path();
+                    if (mkfile::project_root == mkfile::project_build_root)
+                        mkfile::project_root.clear();
+                    break;
+                }
+            }
+        } while (!srcdir.isRoot() && srcdir.cdUp() && !dstdir.isRoot() && dstdir.cdUp());
+    } else {
+        mkfile::project_root.clear();
+    }
+
     return true;
 }
 
index b8a3b56..a4d8ccc 100644 (file)
@@ -108,7 +108,7 @@ struct Option
     //both of these must be called..
     static int init(int argc=0, char **argv=0); //parse cmdline
     static void applyHostMode();
-    static bool prepareProject();
+    static bool prepareProject(const QString &pfile);
     static bool postProcessProject(QMakeProject *);
 
     enum StringFixFlags {
@@ -202,6 +202,7 @@ struct Option
         static bool do_dep_heuristics;
         static bool do_preprocess;
         static bool do_stub_makefile;
+        static QString project_root;
         static QString project_build_root;
         static QString cachefile;
         static int cachefile_depth;
index 1179812..0e0ac93 100644 (file)
@@ -607,6 +607,9 @@ QStringList qmake_mkspec_paths()
         for(QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it)
             ret << ((*it) + concat);
     }
+    ret << Option::mkfile::project_build_root + concat;
+    if (!Option::mkfile::project_root.isEmpty())
+        ret << Option::mkfile::project_root + concat;
     ret << QLibraryInfo::location(QLibraryInfo::DataPath) + concat;
 
     return ret;
@@ -1307,11 +1310,6 @@ QMakeProject::read(uchar cmd)
             }
 
             if(QDir::isRelativePath(qmakespec)) {
-                if (QFile::exists(Option::output_dir+"/"+qmakespec+"/qmake.conf")) {
-                    qmakespec = Option::mkfile::qmakespec = QFileInfo(Option::output_dir+"/"+qmakespec).absoluteFilePath();
-                } else if (QFile::exists(qmakespec+"/qmake.conf")) {
-                    Option::mkfile::qmakespec = QFileInfo(Option::mkfile::qmakespec).absoluteFilePath();
-                } else {
                     bool found_mkspec = false;
                     for(QStringList::ConstIterator it = mkspec_roots.begin(); it != mkspec_roots.end(); ++it) {
                         QString mkspec = (*it) + QLatin1Char('/') + qmakespec;
@@ -1326,7 +1324,6 @@ QMakeProject::read(uchar cmd)
                                 qmakespec.toLatin1().constData(), mkspec_roots.join("\n\t").toLatin1().constData());
                         return false;
                     }
-                }
             }
 
             // parse qmake configuration