summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2011-12-31 20:40:49 -0200
committerQt by Nokia <qt-info@nokia.com>2012-05-30 17:28:07 +0200
commit735f7e6248fb7725ce952eede17117ca6dc3ee42 (patch)
treef8f1144aefd75993f4180d796c70d88f43ddd84c /tools
parent1533bfc5fcc4ec5865c1de606504b6aba8a5f6fe (diff)
Record the sub-architecture (CPU features enabled in the compiler)
If the system's compiler has extra features on top of the base settings enabled or if the mkspec or $CXXFLAGS variable included some, record them. This will allow us to choose whether or not to use our own special compilers, based on whether the system default compiler contains it or not. Change-Id: I87cada9fab4cfa58846a831d0a7c7b50d8fa87fd Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/configure/configureapp.cpp59
1 files changed, 46 insertions, 13 deletions
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index 1059f0f83b..3e6613f066 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -2531,6 +2531,17 @@ void Configure::generateCachefile()
}
}
+struct ArchData {
+ const char *qmakespec;
+ const char *key;
+ const char *subarchKey;
+ const char *type;
+ ArchData() {}
+ ArchData(const char *t, const char *qm, const char *k, const char *sak)
+ : qmakespec(qm), key(k), subarchKey(sak), type(t)
+ {}
+};
+
/*
Runs qmake on config.tests/arch/arch.pro, which will detect the target arch
for the compiler we are using
@@ -2551,15 +2562,16 @@ void Configure::detectArch()
return;
}
- QList<QPair<QString, QString> > qmakespecs;
+ QVector<ArchData> qmakespecs;
if (dictionary.contains("XQMAKESPEC"))
- qmakespecs << qMakePair(QString("XQMAKESPEC"), QString("QT_ARCH"));
- qmakespecs << qMakePair(QString("QMAKESPEC"), QString("QT_HOST_ARCH"));
+ qmakespecs << ArchData("target", "XQMAKESPEC", "QT_ARCH", "QT_CPU_FEATURES");
+ qmakespecs << ArchData("host", "QMAKESPEC", "QT_HOST_ARCH", "QT_HOST_CPU_FEATURES");
for (int i = 0; i < qmakespecs.count(); ++i) {
- const QPair<QString, QString> &pair = qmakespecs.at(i);
- QString qmakespec = dictionary.value(pair.first);
- QString key = pair.second;
+ const ArchData &data = qmakespecs.at(i);
+ QString qmakespec = dictionary.value(data.qmakespec);
+ QString key = data.key;
+ QString subarchKey = data.subarchKey;
// run qmake
QString command =
@@ -2584,10 +2596,11 @@ void Configure::detectArch()
QByteArray exeContents = exe.readAll();
exe.close();
- static const char magic[] = "==Qt=magic=Qt== Architecture:";
- int magicPos = exeContents.indexOf(magic);
+ static const char archMagic[] = "==Qt=magic=Qt== Architecture:";
+ int magicPos = exeContents.indexOf(archMagic);
if (magicPos == -1) {
- cout << "Internal error, could not find the architecture of the executable" << endl;
+ cout << "Internal error, could not find the architecture of the "
+ << data.type << " executable" << endl;
dictionary["DONE"] = "error";
return;
}
@@ -2595,10 +2608,24 @@ void Configure::detectArch()
// the conversion from QByteArray will stop at the ending NUL anyway
QString arch = QString::fromLatin1(exeContents.constData() + magicPos
- + sizeof(magic) - 1);
+ + sizeof(archMagic) - 1);
dictionary[key] = arch;
+ static const char subarchMagic[] = "==Qt=magic=Qt== Sub-architecture:";
+ magicPos = exeContents.indexOf(subarchMagic);
+ if (magicPos == -1) {
+ cout << "Internal error, could not find the sub-architecture of the "
+ << data.type << " executable" << endl;
+ dictionary["DONE"] = "error";
+ return;
+ }
+
+ QString subarch = QString::fromLatin1(exeContents.constData() + magicPos
+ + sizeof(subarchMagic) - 1);
+ dictionary[subarchKey] = subarch;
+
//cout << "Detected arch '" << qPrintable(arch) << "'\n";
+ //cout << "Detected sub-arch '" << qPrintable(subarch) << "'\n";
// clean up
Environment::execute(command + " distclean");
@@ -2606,8 +2633,10 @@ void Configure::detectArch()
if (!dictionary.contains("QT_HOST_ARCH"))
dictionary["QT_HOST_ARCH"] = "unknown";
- if (!dictionary.contains("QT_ARCH"))
+ if (!dictionary.contains("QT_ARCH")) {
dictionary["QT_ARCH"] = dictionary["QT_HOST_ARCH"];
+ dictionary["QT_CPU_FEATURES"] = dictionary["QT_HOST_CPU_FEATURES"];
+ }
QDir::setCurrent(oldpwd);
}
@@ -2650,6 +2679,8 @@ void Configure::generateQConfigPri()
configStream << endl;
configStream << "QT_ARCH = " << dictionary["QT_ARCH"] << endl;
configStream << "QT_HOST_ARCH = " << dictionary["QT_HOST_ARCH"] << endl;
+ configStream << "QT_CPU_FEATURES = " << dictionary["QT_CPU_FEATURES"] << endl;
+ configStream << "QT_HOST_CPU_FEATURES = " << dictionary["QT_HOST_CPU_FEATURES"] << endl;
if (dictionary["QT_EDITION"].contains("OPENSOURCE"))
configStream << "QT_EDITION = " << QLatin1String("OpenSource") << endl;
else
@@ -3037,8 +3068,10 @@ void Configure::displayConfig()
sout << "QMAKESPEC..................." << dictionary[ "XQMAKESPEC" ] << " (" << dictionary["QMAKESPEC_FROM"] << ")" << endl;
else
sout << "QMAKESPEC..................." << dictionary[ "QMAKESPEC" ] << " (" << dictionary["QMAKESPEC_FROM"] << ")" << endl;
- sout << "Architecture................" << dictionary["QT_ARCH"] << endl;
- sout << "Host Architecture..........." << dictionary["QT_HOST_ARCH"] << endl;
+ sout << "Architecture................" << dictionary["QT_ARCH"]
+ << ", features:" << dictionary["QT_CPU_FEATURES"] << endl;
+ sout << "Host Architecture..........." << dictionary["QT_HOST_ARCH"]
+ << ", features:" << dictionary["QT_HOST_CPU_FEATURES"] << endl;
sout << "Maketool...................." << dictionary[ "MAKE" ] << endl;
sout << "Debug symbols..............." << (dictionary[ "BUILD" ] == "debug" ? "yes" : "no") << endl;
sout << "Link Time Code Generation..." << dictionary[ "LTCG" ] << endl;