From 2713f080bb34a2513dc5585a209bdc95ab815e45 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Thu, 10 Nov 2016 09:40:09 +0100 Subject: Remove wondrous VS version detection logic Replace which_dotnet_version with a simple function that converts the value of MSVC_VER to its corresponding enum value in the VS project generator. This reduces the maintenance burden when adding support for a new VS version, because we do not need to update the registry keys in which_dotnet_version anymore. The which_dotnet_version function implemented the following logic: - find all installed VS versions via registry - select the "best matching one" - if there is no best match, select the VS that's in PATH - create a project for that VS installation The usefulness of this whole stunt is questionable as the VS version of Qt's mkspec must match the version of a project using that Qt anyway. Change-Id: I9fb9a099ee5ddb5fc4c450be4f68f41f2b406b9a Reviewed-by: Oswald Buddenhagen Reviewed-by: Oliver Wolff Reviewed-by: Joerg Bornemann --- qmake/generators/win32/msvc_objectmodel.cpp | 30 ++++++++++ qmake/generators/win32/msvc_objectmodel.h | 2 + qmake/generators/win32/msvc_vcproj.cpp | 93 +---------------------------- 3 files changed, 33 insertions(+), 92 deletions(-) (limited to 'qmake/generators') diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp index aa733bfc36..219b889706 100644 --- a/qmake/generators/win32/msvc_objectmodel.cpp +++ b/qmake/generators/win32/msvc_objectmodel.cpp @@ -34,6 +34,36 @@ QT_BEGIN_NAMESPACE +static DotNET vsVersionFromString(const char *versionString) +{ + struct VSVersionMapping + { + const char *str; + DotNET version; + }; + static VSVersionMapping mapping[] = { + "7.0", NET2002, + "7.1", NET2003, + "8.0", NET2005, + "9.0", NET2008, + "10.0", NET2010, + "11.0", NET2012, + "12.0", NET2013, + "14.0", NET2015 + }; + DotNET result = NETUnknown; + for (const auto entry : mapping) { + if (strcmp(entry.str, versionString) == 0) + return entry.version; + } + return result; +} + +DotNET vsVersionFromString(const ProString &versionString) +{ + return vsVersionFromString(versionString.toLatin1().constData()); +} + // XML Tags --------------------------------------------------------- const char _Configuration[] = "Configuration"; const char _Configurations[] = "Configurations"; diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h index 94256f2103..64c6e9098d 100644 --- a/qmake/generators/win32/msvc_objectmodel.h +++ b/qmake/generators/win32/msvc_objectmodel.h @@ -54,6 +54,8 @@ enum DotNET { NET2015 = 0xd0 }; +DotNET vsVersionFromString(const ProString &versionString); + /* This Object model is of course VERY simplyfied, and does not actually follow the original MSVC diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index 3558f94098..77cb554ec6 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp @@ -50,97 +50,6 @@ const char _GUIDFormFiles[] = "{99349809-55BA-4b9d-BF79-8FDBB0286EB3} const char _GUIDExtraCompilerFiles[] = "{E0D8C965-CC5F-43d7-AD63-FAEF0BBC0F85}"; const char _GUIDDeploymentFiles[] = "{D9D6E243-F8AF-46E4-B9FD-80ECBC20BA3E}"; const char _GUIDDistributionFiles[] = "{B83CAF91-C7BF-462F-B76C-EA11631F866C}"; -QT_END_NAMESPACE - -#ifdef Q_OS_WIN32 -#include -#include - -QT_BEGIN_NAMESPACE - -struct DotNetCombo { - DotNET version; - const char *versionStr; - const char *regKey; -} dotNetCombo[] = { - {NET2015, "MSVC.NET 2015 (14.0)", "Software\\Microsoft\\VisualStudio\\14.0\\Setup\\VC\\ProductDir"}, - {NET2013, "MSVC.NET 2013 (12.0)", "Software\\Microsoft\\VisualStudio\\12.0\\Setup\\VC\\ProductDir"}, - {NET2013, "MSVC.NET 2013 Express Edition (12.0)", "Software\\Microsoft\\VCExpress\\12.0\\Setup\\VC\\ProductDir"}, - {NET2012, "MSVC.NET 2012 (11.0)", "Software\\Microsoft\\VisualStudio\\11.0\\Setup\\VC\\ProductDir"}, - {NET2012, "MSVC.NET 2012 Express Edition (11.0)", "Software\\Microsoft\\VCExpress\\11.0\\Setup\\VC\\ProductDir"}, - {NET2010, "MSVC.NET 2010 (10.0)", "Software\\Microsoft\\VisualStudio\\10.0\\Setup\\VC\\ProductDir"}, - {NET2010, "MSVC.NET 2010 Express Edition (10.0)", "Software\\Microsoft\\VCExpress\\10.0\\Setup\\VC\\ProductDir"}, - {NET2008, "MSVC.NET 2008 (9.0)", "Software\\Microsoft\\VisualStudio\\9.0\\Setup\\VC\\ProductDir"}, - {NET2008, "MSVC.NET 2008 Express Edition (9.0)", "Software\\Microsoft\\VCExpress\\9.0\\Setup\\VC\\ProductDir"}, - {NET2005, "MSVC.NET 2005 (8.0)", "Software\\Microsoft\\VisualStudio\\8.0\\Setup\\VC\\ProductDir"}, - {NET2005, "MSVC.NET 2005 Express Edition (8.0)", "Software\\Microsoft\\VCExpress\\8.0\\Setup\\VC\\ProductDir"}, - {NET2003, "MSVC.NET 2003 (7.1)", "Software\\Microsoft\\VisualStudio\\7.1\\Setup\\VC\\ProductDir"}, - {NET2002, "MSVC.NET 2002 (7.0)", "Software\\Microsoft\\VisualStudio\\7.0\\Setup\\VC\\ProductDir"}, - {NETUnknown, "", ""}, -}; - -QT_END_NAMESPACE -#endif - -QT_BEGIN_NAMESPACE -DotNET which_dotnet_version(const QByteArray &preferredVersion = QByteArray()) -{ -#ifndef Q_OS_WIN32 - Q_UNUSED(preferredVersion); - return NET2002; // Always generate 7.0 versions on other platforms -#else - // Only search for the version once - static DotNET current_version = NETUnknown; - if(current_version != NETUnknown) - return current_version; - - // Fallback to .NET 2002 - current_version = NET2002; - - const DotNetCombo *lowestInstalledVersion = 0; - QHash installPaths; - int installed = 0; - int i = 0; - for(; dotNetCombo[i].version; ++i) { - QString path = qt_readRegistryKey(HKEY_LOCAL_MACHINE, dotNetCombo[i].regKey, - KEY_WOW64_32KEY); - if (!path.isEmpty() && installPaths.value(dotNetCombo[i].version) != path) { - lowestInstalledVersion = &dotNetCombo[i]; - installPaths.insert(lowestInstalledVersion->version, path); - ++installed; - current_version = lowestInstalledVersion->version; - if (QByteArray(lowestInstalledVersion->versionStr).contains(preferredVersion)) { - installed = 1; - break; - } - } - } - - if (installed < 2) - return current_version; - - // More than one version installed, search directory path - QString paths = qgetenv("PATH"); - const QStringList pathlist = paths.split(QLatin1Char(';')); - for (const QString &path : pathlist) { - for (i = 0; dotNetCombo[i].version; ++i) { - const QString productPath = installPaths.value(dotNetCombo[i].version); - if (productPath.isEmpty()) - continue; - if (path.startsWith(productPath, Qt::CaseInsensitive)) { - current_version = dotNetCombo[i].version; - return current_version; - } - } - } - - warn_msg(WarnLogic, "Generator: MSVC.NET: Found more than one version of Visual Studio, but" - " none in your PATH. Falling back to lowest version (%s)", - qPrintable(lowestInstalledVersion->versionStr)); - - return current_version; -#endif -}; // Flatfile Tags ---------------------------------------------------- const char _slnHeader70[] = "Microsoft Visual Studio Solution File, Format Version 7.00"; @@ -986,7 +895,7 @@ void VcprojGenerator::initConfiguration() // - to know of certain compiler/linker options VCConfiguration &conf = vcProject.Configuration; conf.suppressUnknownOptionWarnings = project->isActiveConfig("suppress_vcproj_warnings"); - conf.CompilerVersion = which_dotnet_version(project->first("MSVC_VER").toLatin1()); + conf.CompilerVersion = vsVersionFromString(project->first("MSVC_VER")); if (conf.CompilerVersion >= NET2012) { conf.WinRT = project->isActiveConfig("winrt"); -- cgit v1.2.3