diff options
author | Joerg Bornemann <joerg.bornemann@qt.io> | 2016-11-08 15:04:46 +0100 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@qt.io> | 2016-11-10 15:13:27 +0000 |
commit | fb2cf69d8322ed1dc165ca67ffe68825fc699123 (patch) | |
tree | 8f514b22b8283696151a4fcbe69456c496d0a7f1 /src/lib/corelib/tools/msvcinfo.cpp | |
parent | 684548e2634ca620ae24b73f7715b70ac90cbb76 (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.cpp | 33 |
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()); +} |