look for mkspecs in the project root, not next to every project
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>
This commit is contained in:
parent
e05d5c36be
commit
65b42dd4c8
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user