aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/tools/msvcinfo.cpp
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2016-11-08 15:04:46 +0100
committerJoerg Bornemann <joerg.bornemann@qt.io>2016-11-10 15:13:27 +0000
commitfb2cf69d8322ed1dc165ca67ffe68825fc699123 (patch)
tree8f514b22b8283696151a4fcbe69456c496d0a7f1 /src/lib/corelib/tools/msvcinfo.cpp
parent684548e2634ca620ae24b73f7715b70ac90cbb76 (diff)
Speed up qbs-setup-toolchains for MSVC
Determine the compiler's version by preprocessing a file containing _MSC_FULL_VER instead of compiling and linking a program to determine all compiler defines. With this change qbs-setup-toolchains needs less than 1/2 of the time to detect MSVC installations. Change-Id: I254e6c6d3abe489b328e979228e8b21f8d92f39c Task-number: QBS-866 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/lib/corelib/tools/msvcinfo.cpp')
-rw-r--r--src/lib/corelib/tools/msvcinfo.cpp33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/lib/corelib/tools/msvcinfo.cpp b/src/lib/corelib/tools/msvcinfo.cpp
index e2862a591..d464f001e 100644
--- a/src/lib/corelib/tools/msvcinfo.cpp
+++ b/src/lib/corelib/tools/msvcinfo.cpp
@@ -41,7 +41,6 @@
#include <tools/error.h>
#include <tools/profile.h>
-#include <tools/version.h>
#include <tools/vsenvironmentdetector.h>
#include <QByteArray>
@@ -209,6 +208,11 @@ static QVariantMap getMsvcDefines(const QString &hostCompilerFilePath,
return map;
}
+void MSVC::init()
+{
+ determineCompilerVersion();
+}
+
QString MSVC::binPathForArchitecture(const QString &arch) const
{
QString archSubDir;
@@ -228,3 +232,30 @@ QVariantMap MSVC::compilerDefines(const QString &compilerFilePath) const
return getMsvcDefines(clPathForArchitecture(QStringLiteral("x86")), compilerFilePath,
environment);
}
+
+void MSVC::determineCompilerVersion()
+{
+ QString cppFilePath;
+ {
+ QTemporaryFile cppFile(QDir::tempPath() + QLatin1String("/qbsXXXXXX.cpp"));
+ cppFile.setAutoRemove(false);
+ if (!cppFile.open()) {
+ throw ErrorInfo(mkStr("Could not create temporary file (%1)")
+ .arg(cppFile.errorString()));
+ }
+ cppFilePath = cppFile.fileName();
+ cppFile.write("_MSC_FULL_VER");
+ cppFile.close();
+ }
+ DummyFile fileDeleter(cppFilePath);
+
+ const QByteArray origPath = qgetenv("PATH");
+ qputenv("PATH", environment.value(QStringLiteral("PATH")).toLatin1() + ';' + origPath);
+ QByteArray versionStr = runProcess(
+ binPath + QStringLiteral("/cl.exe"),
+ QStringList() << QStringLiteral("/nologo") << QStringLiteral("/EP")
+ << QDir::toNativeSeparators(cppFilePath));
+ qputenv("PATH", origPath);
+ compilerVersion = Version(versionStr.mid(0, 2).toInt(), versionStr.mid(2, 2).toInt(),
+ versionStr.mid(4).toInt());
+}