summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>2012-01-31 18:36:18 +0100
committerOswald Buddenhagen <oswald.buddenhagen@nokia.com>2012-06-19 16:37:49 +0200
commit14bbab09c158e3eb54169b42c4a303d396a32f0e (patch)
treefd4706e980c1440eb6b91868d71979060af2398c
parent528192a78b3250964ee99efab42b6683da02eb11 (diff)
introduce ability to build projects for the host system
when qmake runs into the new option(host_build) command, it will restart the project evaluation with a host spec. the new default host spec is called default-host (gasp!). it is overridden with the pre-exising -spec / -platform option, while the new -xspec / -xplatform option overrides the pre-existing default spec. specifying -spec but not -xspec will set the xspec, too, so the behavior is backwards-compatible. same for the XQMAKESPEC override read from .qmake.cache and the environment variable. the cleaner solution would be adding -hostspec, to be symmetrical with the override semantics, but that would deviate from configure in turn. Change-Id: I4297c873780af16ab7928421b434ce0f1d3820da Reviewed-by: Joerg Bornemann <joerg.bornemann@nokia.com>
-rwxr-xr-xconfigure12
-rw-r--r--qmake/generators/makefile.cpp9
-rw-r--r--qmake/generators/makefile.h2
-rw-r--r--qmake/generators/win32/msvc_vcproj.cpp24
-rw-r--r--qmake/option.cpp15
-rw-r--r--qmake/option.h2
-rw-r--r--qmake/project.cpp81
-rw-r--r--qmake/project.h4
-rw-r--r--qtbase.pro18
-rw-r--r--tools/configure/configureapp.cpp16
10 files changed, 128 insertions, 55 deletions
diff --git a/configure b/configure
index 1bb7bb9bf6..a4180bccc4 100755
--- a/configure
+++ b/configure
@@ -3491,8 +3491,9 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
mv -f "$QMAKE_QCONFIG_H" "$QCONFIG_H"
#mkspecs/default is used as a (gasp!) default mkspec so QMAKESPEC needn't be set once configured
- rm -rf mkspecs/default
+ rm -rf mkspecs/default mkspecs/default-host
ln -s `echo $XQMAKESPEC | sed "s,^${relpath}/mkspecs/,,"` mkspecs/default
+ ln -s `echo $QMAKESPEC | sed "s,^${relpath}/mkspecs/,,"` mkspecs/default-host
mkdir -p "$outpath/qmake" || exit
# fix makefiles
for mkfile in GNUmakefile Makefile; do
@@ -5906,9 +5907,14 @@ EOF
#dump the qmake spec
if [ -d "$outpath/mkspecs/$XPLATFORM" ]; then
- echo "QMAKESPEC = \$\$QT_BUILD_TREE/mkspecs/$XPLATFORM" >> "$CACHEFILE.tmp"
+ echo "XQMAKESPEC = \$\$QT_BUILD_TREE/mkspecs/$XPLATFORM" >> "$CACHEFILE.tmp"
else
- echo "QMAKESPEC = $XPLATFORM" >> "$CACHEFILE.tmp"
+ echo "XQMAKESPEC = $XPLATFORM" >> "$CACHEFILE.tmp"
+fi
+if [ -d "$outpath/mkspecs/$PLATFORM" ]; then
+ echo "QMAKESPEC = \$\$QT_BUILD_TREE/mkspecs/$PLATFORM" >> "$CACHEFILE.tmp"
+else
+ echo "QMAKESPEC = $PLATFORM" >> "$CACHEFILE.tmp"
fi
# replace .qmake.cache if it differs from the newly created temp file
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index d37089ee35..97370f06d7 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -2193,7 +2193,9 @@ QString MakefileGenerator::buildArgs(const QString &outdir)
if(!Option::mkfile::do_dep_heuristics)
ret += " -nodependheuristics";
if(!Option::mkfile::qmakespec_commandline.isEmpty())
- ret += " -spec " + specdir(outdir);
+ ret += " -spec " + specdir(outdir, 1);
+ if (!Option::mkfile::xqmakespec_commandline.isEmpty())
+ ret += " -xspec " + specdir(outdir, 0);
if (Option::target_mode_overridden) {
if (Option::target_mode == Option::TARG_MACX_MODE)
ret += " -macx";
@@ -3046,13 +3048,14 @@ QStringList
}
QString
-MakefileGenerator::specdir(const QString &outdir)
+MakefileGenerator::specdir(const QString &outdir, int host_build)
{
#if 0
if(!spec.isEmpty())
return spec;
#endif
- spec = fileFixify(Option::mkfile::qmakespec, outdir);
+ spec = fileFixify((host_build >= 0 ? bool(host_build) : project->isHostBuild())
+ ? Option::mkfile::qmakespec : Option::mkfile::xqmakespec, outdir);
return spec;
}
diff --git a/qmake/generators/makefile.h b/qmake/generators/makefile.h
index 5b64ea68fb..a4ec259bb0 100644
--- a/qmake/generators/makefile.h
+++ b/qmake/generators/makefile.h
@@ -187,7 +187,7 @@ protected:
//subclasses can use these to query information about how the generator was "run"
QString buildArgs(const QString &outdir=QString());
- QString specdir(const QString &outdir=QString());
+ QString specdir(const QString &outdir = QString(), int host_build = -1);
virtual QStringList &findDependencies(const QString &file);
virtual bool doDepends() const { return Option::mkfile::do_deps; }
diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp
index 951784ec28..cd45ea6cee 100644
--- a/qmake/generators/win32/msvc_vcproj.cpp
+++ b/qmake/generators/win32/msvc_vcproj.cpp
@@ -649,12 +649,15 @@ nextfile:
t << _slnProjConfBeg;
for(QList<VcsolutionDepend*>::Iterator it = solution_cleanup.begin(); it != solution_cleanup.end(); ++it) {
QString platform = is64Bit ? "x64" : "Win32";
+ QString xplatform = platform;
if (!project->isEmpty("CE_SDK") && !project->isEmpty("CE_ARCH"))
- platform = project->values("CE_SDK").join(" ") + " (" + project->first("CE_ARCH") + ")";
- t << "\n\t\t" << (*it)->uuid << QString(_slnProjDbgConfTag1).arg(platform) << platform;
- t << "\n\t\t" << (*it)->uuid << QString(_slnProjDbgConfTag2).arg(platform) << platform;
- t << "\n\t\t" << (*it)->uuid << QString(_slnProjRelConfTag1).arg(platform) << platform;
- t << "\n\t\t" << (*it)->uuid << QString(_slnProjRelConfTag2).arg(platform) << platform;
+ xplatform = project->values("CE_SDK").join(" ") + " (" + project->first("CE_ARCH") + ")";
+ if (!project->isHostBuild())
+ platform = xplatform;
+ t << "\n\t\t" << (*it)->uuid << QString(_slnProjDbgConfTag1).arg(xplatform) << platform;
+ t << "\n\t\t" << (*it)->uuid << QString(_slnProjDbgConfTag2).arg(xplatform) << platform;
+ t << "\n\t\t" << (*it)->uuid << QString(_slnProjRelConfTag1).arg(xplatform) << platform;
+ t << "\n\t\t" << (*it)->uuid << QString(_slnProjRelConfTag2).arg(xplatform) << platform;
}
t << _slnProjConfEnd;
t << _slnExtSections;
@@ -858,7 +861,7 @@ void VcprojGenerator::initProject()
}
vcProject.Keyword = project->first("VCPROJ_KEYWORD");
- if (project->isEmpty("CE_SDK") || project->isEmpty("CE_ARCH")) {
+ if (project->isHostBuild() || project->isEmpty("CE_SDK") || project->isEmpty("CE_ARCH")) {
vcProject.PlatformName = (is64Bit ? "x64" : "Win32");
} else {
vcProject.PlatformName = project->values("CE_SDK").join(" ") + " (" + project->first("CE_ARCH") + ")";
@@ -922,7 +925,7 @@ void VcprojGenerator::initConfiguration()
if (conf.Name.isEmpty())
conf.Name = isDebug ? "Debug" : "Release";
conf.ConfigurationName = conf.Name;
- if (project->isEmpty("CE_SDK") || project->isEmpty("CE_ARCH")) {
+ if (project->isHostBuild() || project->isEmpty("CE_SDK") || project->isEmpty("CE_ARCH")) {
conf.Name += (is64Bit ? "|x64" : "|Win32");
} else {
conf.Name += "|" + project->values("CE_SDK").join(" ") + " (" + project->first("CE_ARCH") + ")";
@@ -948,7 +951,7 @@ void VcprojGenerator::initConfiguration()
initPreBuildEventTools();
initPostBuildEventTools();
// Only deploy for CE projects
- if (!project->isEmpty("CE_SDK") && !project->isEmpty("CE_ARCH"))
+ if (!project->isHostBuild() && !project->isEmpty("CE_SDK") && !project->isEmpty("CE_ARCH"))
initDeploymentTool();
initPreLinkEventTools();
@@ -1084,7 +1087,7 @@ void VcprojGenerator::initPostBuildEventTools()
QString signature = !project->isEmpty("SIGNATURE_FILE") ? var("SIGNATURE_FILE") : var("DEFAULT_SIGNATURE");
bool useSignature = !signature.isEmpty() && !project->isActiveConfig("staticlib") &&
- !project->isEmpty("CE_SDK") && !project->isEmpty("CE_ARCH");
+ !project->isHostBuild() && !project->isEmpty("CE_SDK") && !project->isEmpty("CE_ARCH");
if (useSignature) {
conf.postBuild.CommandLine.prepend(
QLatin1String("signtool sign /F ") + signature + QLatin1String(" \"$(TargetPath)\""));
@@ -1578,7 +1581,8 @@ QString VcprojGenerator::findTemplate(QString file)
{
QString ret;
if(!exists((ret = file)) &&
- !exists((ret = QString(Option::mkfile::qmakespec + "/" + file))) &&
+ !exists((ret = QString((project->isHostBuild()
+ ? Option::mkfile::qmakespec : Option::mkfile::xqmakespec) + '/' + file))) &&
!exists((ret = QString(QLibraryInfo::location(QLibraryInfo::HostDataPath) + "/win32-msvc.net/" + file))) &&
!exists((ret = QString(QLibraryInfo::location(QLibraryInfo::HostDataPath) + "/win32-msvc2002/" + file))) &&
!exists((ret = QString(QLibraryInfo::location(QLibraryInfo::HostDataPath) + "/win32-msvc2003/" + file))) &&
diff --git a/qmake/option.cpp b/qmake/option.cpp
index de907f0528..836cc3f492 100644
--- a/qmake/option.cpp
+++ b/qmake/option.cpp
@@ -107,6 +107,7 @@ QStringList Option::projfile::project_dirs;
//QMAKE_GENERATE_MAKEFILE stuff
QString Option::mkfile::qmakespec;
+QString Option::mkfile::xqmakespec;
int Option::mkfile::cachefile_depth = -1;
bool Option::mkfile::do_deps = true;
bool Option::mkfile::do_mocs = true;
@@ -117,6 +118,7 @@ bool Option::mkfile::do_cache = true;
QString Option::mkfile::cachefile;
QStringList Option::mkfile::project_files;
QString Option::mkfile::qmakespec_commandline;
+QString Option::mkfile::xqmakespec_commandline;
static Option::QMAKE_MODE default_mode(QString progname)
{
@@ -327,6 +329,9 @@ Option::parseCommandLine(int argc, char **argv, int skip)
} else if(opt == "platform" || opt == "spec") {
Option::mkfile::qmakespec = cleanSpec(argv[++x]);
Option::mkfile::qmakespec_commandline = argv[x];
+ } else if (opt == "xplatform" || opt == "xspec") {
+ Option::mkfile::xqmakespec = cleanSpec(argv[++x]);
+ Option::mkfile::xqmakespec_commandline = argv[x];
} else {
fprintf(stderr, "***Unknown option -%s\n", opt.toLatin1().constData());
return Option::QMAKE_CMDLINE_SHOW_USAGE | Option::QMAKE_CMDLINE_ERROR;
@@ -381,6 +386,9 @@ Option::parseCommandLine(int argc, char **argv, int skip)
if (!user_configs.isEmpty())
Option::before_user_vars += "CONFIG += " + user_configs.join(" ");
+ if (Option::mkfile::xqmakespec.isEmpty())
+ Option::mkfile::xqmakespec = Option::mkfile::qmakespec;
+
return Option::QMAKE_CMDLINE_SUCCESS;
}
@@ -536,8 +544,13 @@ Option::init(int argc, char **argv)
//last chance for defaults
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
Option::qmake_mode == Option::QMAKE_GENERATE_PRL) {
- if(Option::mkfile::qmakespec.isNull() || Option::mkfile::qmakespec.isEmpty())
+ if (Option::mkfile::xqmakespec.isEmpty())
+ Option::mkfile::xqmakespec = QString::fromLocal8Bit(qgetenv("XQMAKESPEC").constData());
+ if (Option::mkfile::qmakespec.isEmpty()) {
Option::mkfile::qmakespec = QString::fromLocal8Bit(qgetenv("QMAKESPEC").constData());
+ if (Option::mkfile::xqmakespec.isEmpty())
+ Option::mkfile::xqmakespec = Option::mkfile::qmakespec;
+ }
//try REALLY hard to do it for them, lazy..
if(Option::mkfile::project_files.isEmpty()) {
diff --git a/qmake/option.h b/qmake/option.h
index 0ec6a36a29..f6f5dbbb9d 100644
--- a/qmake/option.h
+++ b/qmake/option.h
@@ -196,6 +196,7 @@ struct Option
//QMAKE_GENERATE_MAKEFILE options
struct mkfile {
static QString qmakespec;
+ static QString xqmakespec;
static bool do_cache;
static bool do_deps;
static bool do_mocs;
@@ -206,6 +207,7 @@ struct Option
static int cachefile_depth;
static QStringList project_files;
static QString qmakespec_commandline;
+ static QString xqmakespec_commandline;
};
private:
diff --git a/qmake/project.cpp b/qmake/project.cpp
index 4d4dfe955e..f3a3856d82 100644
--- a/qmake/project.cpp
+++ b/qmake/project.cpp
@@ -531,7 +531,7 @@ static void qmake_error_msg(const QString &msg)
1) features/(unix|win32|macx)/
2) features/
*/
-QStringList qmake_feature_paths(QMakeProperty *prop=0)
+QStringList qmake_feature_paths(QMakeProperty *prop, bool host_build)
{
const QString mkspecs_concat = QLatin1String("/mkspecs");
const QString base_concat = QLatin1String("/features");
@@ -578,12 +578,13 @@ QStringList qmake_feature_paths(QMakeProperty *prop=0)
feature_roots << ((*it) + mkspecs_concat + (*concat_it));
}
}
- if(!Option::mkfile::qmakespec.isEmpty()) {
+ QString *specp = host_build ? &Option::mkfile::qmakespec : &Option::mkfile::xqmakespec;
+ if (!specp->isEmpty()) {
// The spec is already platform-dependent, so no subdirs here.
- feature_roots << Option::mkfile::qmakespec + base_concat;
+ feature_roots << *specp + base_concat;
// Also check directly under the root directory of the mkspecs collection
- QFileInfo specfi(Option::mkfile::qmakespec);
+ QFileInfo specfi(*specp);
QDir specrootdir(specfi.absolutePath());
while (!specrootdir.isRoot()) {
const QString specrootpath = specrootdir.path();
@@ -629,16 +630,7 @@ QMakeProject::~QMakeProject()
{
if(own_prop)
delete prop;
- for(QHash<QString, FunctionBlock*>::iterator it = replaceFunctions.begin(); it != replaceFunctions.end(); ++it) {
- if(!it.value()->deref())
- delete it.value();
- }
- replaceFunctions.clear();
- for(QHash<QString, FunctionBlock*>::iterator it = testFunctions.begin(); it != testFunctions.end(); ++it) {
- if(!it.value()->deref())
- delete it.value();
- }
- testFunctions.clear();
+ cleanup();
}
@@ -653,14 +645,29 @@ QMakeProject::init(QMakeProperty *p)
own_prop = false;
}
recursive = false;
+ host_build = false;
reset();
}
+void
+QMakeProject::cleanup()
+{
+ for (QHash<QString, FunctionBlock*>::iterator it = replaceFunctions.begin(); it != replaceFunctions.end(); ++it)
+ if (!it.value()->deref())
+ delete it.value();
+ replaceFunctions.clear();
+ for (QHash<QString, FunctionBlock*>::iterator it = testFunctions.begin(); it != testFunctions.end(); ++it)
+ if (!it.value()->deref())
+ delete it.value();
+ testFunctions.clear();
+}
+
// Duplicate project. It is *not* allowed to call the complex read() functions on the copy.
QMakeProject::QMakeProject(QMakeProject *p, const QHash<QString, QStringList> *_vars)
{
init(p->properties());
vars = _vars ? *_vars : p->variables();
+ host_build = p->host_build;
for(QHash<QString, FunctionBlock*>::iterator it = p->replaceFunctions.begin(); it != p->replaceFunctions.end(); ++it) {
it.value()->ref();
replaceFunctions.insert(it.key(), it.value());
@@ -680,6 +687,7 @@ QMakeProject::reset()
iterator = 0;
function = 0;
backslashWarned = false;
+ need_restart = false;
}
bool
@@ -1226,6 +1234,8 @@ QMakeProject::read(QTextStream &file, QHash<QString, QStringList> &place)
}
s = "";
numLines = 0;
+ if (need_restart)
+ break;
}
}
}
@@ -1271,7 +1281,7 @@ QMakeProject::read(const QString &file, QHash<QString, QStringList> &place)
if(!using_stdin)
qfile.close();
}
- if(scope_blocks.count() != 1) {
+ if (!need_restart && scope_blocks.count() != 1) {
qmake_error_msg("Unterminated conditional block at end of file");
ret = false;
}
@@ -1290,6 +1300,7 @@ QMakeProject::read(const QString &project, uchar cmd)
bool
QMakeProject::read(uchar cmd)
{
+ again:
if ((cmd & ReadSetup) && base_vars.isEmpty()) {
// hack to get the Option stuff in there
base_vars["QMAKE_EXT_CPP"] = Option::cpp_ext;
@@ -1320,8 +1331,13 @@ QMakeProject::read(uchar cmd)
Option::mkfile::cachefile.clear();
goto no_cache;
}
- if (Option::mkfile::qmakespec.isEmpty() && !cache["QMAKESPEC"].isEmpty())
+ if (Option::mkfile::xqmakespec.isEmpty() && !cache["XQMAKESPEC"].isEmpty())
+ Option::mkfile::xqmakespec = cache["XQMAKESPEC"].first();
+ if (Option::mkfile::qmakespec.isEmpty() && !cache["QMAKESPEC"].isEmpty()) {
Option::mkfile::qmakespec = cache["QMAKESPEC"].first();
+ if (Option::mkfile::xqmakespec.isEmpty())
+ Option::mkfile::xqmakespec = Option::mkfile::qmakespec;
+ }
if (Option::output_dir.startsWith(project_build_root))
Option::mkfile::cachefile_depth =
@@ -1355,9 +1371,10 @@ QMakeProject::read(uchar cmd)
}
{ // parse mkspec
- QString qmakespec = Option::mkfile::qmakespec;
+ QString *specp = host_build ? &Option::mkfile::qmakespec : &Option::mkfile::xqmakespec;
+ QString qmakespec = *specp;
if (qmakespec.isEmpty())
- qmakespec = "default";
+ qmakespec = host_build ? "default-host" : "default";
if (QDir::isRelativePath(qmakespec)) {
QStringList mkspec_roots = qmake_mkspec_paths();
debug_msg(2, "Looking for mkspec %s in (%s)", qmakespec.toLatin1().constData(),
@@ -1367,7 +1384,7 @@ QMakeProject::read(uchar cmd)
QString mkspec = (*it) + QLatin1Char('/') + qmakespec;
if (QFile::exists(mkspec)) {
found_mkspec = true;
- Option::mkfile::qmakespec = qmakespec = mkspec;
+ *specp = qmakespec = mkspec;
break;
}
}
@@ -1441,6 +1458,11 @@ QMakeProject::read(uchar cmd)
pfile += Option::pro_ext;
if(!read(pfile, vars))
return false;
+ if (need_restart) {
+ base_vars.clear();
+ cleanup();
+ goto again;
+ }
}
if (cmd & ReadSetup) {
@@ -1537,7 +1559,7 @@ QMakeProject::resolveSpec(QString *spec, const QString &qmakespec)
{
if (spec->isEmpty()) {
*spec = QFileInfo(qmakespec).fileName();
- if (*spec == "default") {
+ if (*spec == "default" || *spec == "default-host") {
#ifdef Q_OS_UNIX
char buffer[1024];
int l = readlink(qmakespec.toLatin1().constData(), buffer, 1023);
@@ -1586,9 +1608,14 @@ QMakeProject::isActiveConfig(const QString &x, bool regex, QHash<QString, QStrin
return Option::target_mode == Option::TARG_WIN_MODE;
}
+ if (x == "host_build")
+ return host_build ? "true" : "false";
+
//mkspecs
- static QString spec;
- resolveSpec(&spec, Option::mkfile::qmakespec);
+ static QString hspec, xspec;
+ resolveSpec(&hspec, Option::mkfile::qmakespec);
+ resolveSpec(&xspec, Option::mkfile::xqmakespec);
+ const QString &spec = host_build ? hspec : xspec;
QRegExp re(x, Qt::CaseSensitive, QRegExp::Wildcard);
if((regex && re.exactMatch(spec)) || (!regex && spec == x))
return true;
@@ -1646,9 +1673,10 @@ QMakeProject::doProjectInclude(QString file, uchar flags, QHash<QString, QString
file += Option::prf_ext;
validateModes(); // init dir_sep
if(file.indexOf(QLatin1Char('/')) == -1 || !QFile::exists(file)) {
- static QStringList *feature_roots = 0;
+ static QStringList *all_feature_roots[2] = { 0, 0 };
+ QStringList *&feature_roots = all_feature_roots[host_build];
if(!feature_roots) {
- feature_roots = new QStringList(qmake_feature_paths(prop));
+ feature_roots = new QStringList(qmake_feature_paths(prop, host_build));
qmakeAddCacheClear(qmakeDeleteCacheClear<QStringList>, (void**)&feature_roots);
}
debug_msg(2, "Looking for feature '%s' in (%s)", file.toLatin1().constData(),
@@ -2742,6 +2770,11 @@ QMakeProject::doProjectTest(QString func, QList<QStringList> args_list, QHash<QS
}
if (args.first() == "recursive") {
recursive = true;
+ } else if (args.first() == "host_build") {
+ if (!host_build && isActiveConfig("cross_compile")) {
+ host_build = true;
+ need_restart = true;
+ }
} else {
fprintf(stderr, "%s:%d: unrecognized option() argument '%s'.\n",
parser.file.toLatin1().constData(), parser.line_no,
diff --git a/qmake/project.h b/qmake/project.h
index ccdc1b63f1..700509b2a6 100644
--- a/qmake/project.h
+++ b/qmake/project.h
@@ -79,6 +79,8 @@ class QMakeProject
QHash<QString, FunctionBlock*> testFunctions, replaceFunctions;
bool recursive;
+ bool host_build;
+ bool need_restart;
bool own_prop;
bool backslashWarned;
QString pfile;
@@ -107,6 +109,7 @@ class QMakeProject
bool doVariableReplace(QString &str, QHash<QString, QStringList> &place);
QStringList doVariableReplaceExpand(const QString &str, QHash<QString, QStringList> &place, bool *ok=0);
void init(QMakeProperty *);
+ void cleanup();
QStringList &values(const QString &v, QHash<QString, QStringList> &place);
void validateModes();
void resolveSpec(QString *spec, const QString &qmakespec);
@@ -160,6 +163,7 @@ public:
QHash<QString, QStringList> &variables(); // No compat mapping and magic, obviously
bool isRecursive() const { return recursive; }
+ bool isHostBuild() const { return host_build; }
protected:
friend class MakefileGenerator;
diff --git a/qtbase.pro b/qtbase.pro
index 5efe77e99d..e8a26b7e9f 100644
--- a/qtbase.pro
+++ b/qtbase.pro
@@ -118,15 +118,17 @@ INSTALLS += configtests
mkspecs.path = $$[QT_HOST_DATA]/mkspecs
mkspecs.files = $$OUT_PWD/mkspecs/qconfig.pri $$OUT_PWD/mkspecs/qmodule.pri $$OUT_PWD/mkspecs/qdevice.pri $$files($$PWD/mkspecs/*)
mkspecs.files -= $$PWD/mkspecs/modules
-unix {
- DEFAULT_QMAKESPEC = $$QMAKESPEC
- DEFAULT_QMAKESPEC ~= s,^.*mkspecs/,,g
- mkspecs.commands += $(DEL_FILE) $(INSTALL_ROOT)$$mkspecs.path/default; $(SYMLINK) $$DEFAULT_QMAKESPEC $(INSTALL_ROOT)$$mkspecs.path/default
- mkspecs.files -= $$PWD/mkspecs/default
-}
-win32:!equals(OUT_PWD, $$PWD) {
+unix {
+ DEFAULT_QMAKESPEC = $$replace(QMAKESPEC, ^.*mkspecs/, )
+ DEFAULT_XQMAKESPEC = $$replace(XQMAKESPEC, ^.*mkspecs/, )
+ mkspecs.commands = \
+ $(DEL_FILE) $(INSTALL_ROOT)$$mkspecs.path/default-host $(INSTALL_ROOT)$$mkspecs.path/default; \
+ $(SYMLINK) $$DEFAULT_QMAKESPEC $(INSTALL_ROOT)$$mkspecs.path/default-host && \
+ $(SYMLINK) $$DEFAULT_XQMAKESPEC $(INSTALL_ROOT)$$mkspecs.path/default
+ mkspecs.files -= $$PWD/mkspecs/default-host $$PWD/mkspecs/default
+} else:!equals(OUT_PWD, $$PWD) {
# When shadow building on Windows, the default mkspec only exists in the build tree.
- mkspecs.files += $$OUT_PWD/mkspecs/default
+ mkspecs.files += $$OUT_PWD/mkspecs/default-host $$OUT_PWD/mkspecs/default
}
INSTALLS += mkspecs
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index ba50d9604c..ff2744397d 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -2583,13 +2583,18 @@ void Configure::generateCachefile()
moduleStream << "QMAKE_INCDIR_QT = $$QT_BUILD_TREE" << fixSeparators("/include", true) << endl;
moduleStream << "QMAKE_LIBDIR_QT = $$QT_BUILD_TREE" << fixSeparators("/lib", true) << endl;
-
- QString targetSpec = dictionary.contains("XQMAKESPEC") ? dictionary[ "XQMAKESPEC" ] : dictionary[ "QMAKESPEC" ];
- QString mkspec_path = fixSeparators(sourcePath + "/mkspecs/" + targetSpec);
+ QString hostSpec = dictionary[ "QMAKESPEC" ];
+ QString targetSpec = dictionary.contains("XQMAKESPEC") ? dictionary[ "XQMAKESPEC" ] : hostSpec;
+ QString xmkspec_path = fixSeparators(sourcePath + "/mkspecs/" + targetSpec);
+ if (QFile::exists(xmkspec_path))
+ moduleStream << "XQMAKESPEC = " << escapeSeparators(xmkspec_path) << endl;
+ else
+ moduleStream << "XQMAKESPEC = " << fixSeparators(targetSpec, true) << endl;
+ QString mkspec_path = fixSeparators(sourcePath + "/mkspecs/" + hostSpec);
if (QFile::exists(mkspec_path))
moduleStream << "QMAKESPEC = " << escapeSeparators(mkspec_path) << endl;
else
- moduleStream << "QMAKESPEC = " << fixSeparators(targetSpec, true) << endl;
+ moduleStream << "QMAKESPEC = " << fixSeparators(hostSpec, true) << endl;
if (dictionary["QT_EDITION"] != "QT_EDITION_OPENSOURCE")
moduleStream << "DEFINES *= QT_EDITION=QT_EDITION_DESKTOP" << endl;
@@ -3109,7 +3114,8 @@ void Configure::generateConfigfiles()
}
QString spec = dictionary.contains("XQMAKESPEC") ? dictionary["XQMAKESPEC"] : dictionary["QMAKESPEC"];
- if (!copySpec("default", "", spec))
+ if (!copySpec("default", "", spec)
+ || !copySpec("default-host", "host ", dictionary["QMAKESPEC"]))
return;
// Generate the new qconfig.cpp file