From e17f3458ce8c5eaba53dc00d273d3456746c7fd4 Mon Sep 17 00:00:00 2001 From: Brad King Date: Sun, 16 Sep 2012 00:01:32 +0200 Subject: [PATCH 1/2] VS11: Detect VS 2012 Express for default generator (#13348) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add WDExpress to the list of registry search locations. Add VS 11 to the list of VS versions and corresponding generator names. Fix the search logic to use the most recent version found under any registry entry. Inspired-by: Peter Kümmel --- Source/cmake.cxx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Source/cmake.cxx b/Source/cmake.cxx index c6787b9d0..079ea36e8 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -2184,6 +2184,7 @@ int cmake::ActualConfigure() std::vector vsVerions; vsVerions.push_back("VisualStudio\\"); vsVerions.push_back("VCExpress\\"); + vsVerions.push_back("WDExpress\\"); struct VSRegistryEntryName { const char* MSVersion; @@ -2196,10 +2197,11 @@ int cmake::ActualConfigure() {"8.0", "Visual Studio 8 2005"}, {"9.0", "Visual Studio 9 2008"}, {"10.0", "Visual Studio 10"}, + {"11.0", "Visual Studio 11"}, {0, 0}}; - for(size_t b=0; b < vsVerions.size() && installedCompiler.empty(); b++) + for(int i=0; version[i].MSVersion != 0; i++) { - for(int i =0; version[i].MSVersion != 0; i++) + for(size_t b=0; b < vsVerions.size(); b++) { std::string reg = vsregBase + vsVerions[b] + version[i].MSVersion; reg += ";InstallDir]"; @@ -2208,6 +2210,7 @@ int cmake::ActualConfigure() if (!(reg == "/registry")) { installedCompiler = version[i].GeneratorName; + break; } } } From 7ee3cee9199e1207813e245b2bca18526d6bd74c Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 18 Sep 2012 11:39:34 -0400 Subject: [PATCH 2/2] VS11: Add VS 2012 Express support (#13348) Use the registry entries that vsvars32.bat uses to detect the location of MSBuild.exe in the framework directory. Invoke MSBuild with the option /p:VisualStudioVersion=$version so it knows from which VS version to load the system build rules. Teach cmGlobalVisualStudio11Generator to set its ExpressEdition member using the registry. --- Modules/CMakeDetermineCompilerId.cmake | 2 +- Modules/CMakeVS11FindMake.cmake | 9 ++++----- Source/cmGlobalVisualStudio10Generator.cxx | 2 ++ Source/cmGlobalVisualStudio11Generator.cxx | 5 ++++- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Modules/CMakeDetermineCompilerId.cmake b/Modules/CMakeDetermineCompilerId.cmake index 3df17c7c6..8e383990f 100644 --- a/Modules/CMakeDetermineCompilerId.cmake +++ b/Modules/CMakeDetermineCompilerId.cmake @@ -143,7 +143,7 @@ Id flags: ${testflags} set(id_toolset "") endif() if("${CMAKE_MAKE_PROGRAM}" MATCHES "[Mm][Ss][Bb][Uu][Ii][Ll][Dd]") - set(build /p:Configuration=Debug /p:Platform=@id_arch@) + set(build /p:Configuration=Debug /p:Platform=@id_arch@ /p:VisualStudioVersion=${vs_version}.0) elseif("${CMAKE_MAKE_PROGRAM}" MATCHES "[Mm][Ss][Dd][Ee][Vv]") set(build /make) else() diff --git a/Modules/CMakeVS11FindMake.cmake b/Modules/CMakeVS11FindMake.cmake index c55a4c53a..2df015d40 100644 --- a/Modules/CMakeVS11FindMake.cmake +++ b/Modules/CMakeVS11FindMake.cmake @@ -34,15 +34,14 @@ find_program(CMAKE_MAKE_PROGRAM # if devenv is not found, then use MSBuild. # it is expected that if devenv is not found, then we are -# dealing with Visual Studio Express. VCExpress has random -# failures when being run as a command line build tool which -# causes the compiler checks and try-compile stuff to fail. MSbuild -# is a better choice for this. However, VCExpress does not support -# cross compiling needed for Win CE. +# dealing with Visual Studio Express. if(NOT CMAKE_CROSSCOMPILING) + set(_FDIR "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VC7;FrameworkDir32]") + set(_FVER "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VC7;FrameworkVer32]") find_program(CMAKE_MAKE_PROGRAM NAMES MSBuild HINTS + ${_FDIR}/${_FVER} [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\11.0\\Setup\\VS;ProductDir] "$ENV{SYSTEMROOT}/Microsoft.NET/Framework/[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\11.0;CLR Version]/" "c:/WINDOWS/Microsoft.NET/Framework/[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\11.0;CLR Version]/" diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx index d1889809d..480c577f2 100644 --- a/Source/cmGlobalVisualStudio10Generator.cxx +++ b/Source/cmGlobalVisualStudio10Generator.cxx @@ -205,6 +205,8 @@ std::string cmGlobalVisualStudio10Generator { makeCommand += "Debug"; } + makeCommand += " /p:VisualStudioVersion="; + makeCommand += this->GetIDEVersion(); if ( additionalOptions ) { makeCommand += " "; diff --git a/Source/cmGlobalVisualStudio11Generator.cxx b/Source/cmGlobalVisualStudio11Generator.cxx index 7bb4d0c4a..23a1204bd 100644 --- a/Source/cmGlobalVisualStudio11Generator.cxx +++ b/Source/cmGlobalVisualStudio11Generator.cxx @@ -17,7 +17,10 @@ cmGlobalVisualStudio11Generator::cmGlobalVisualStudio11Generator() { this->FindMakeProgramFile = "CMakeVS11FindMake.cmake"; - this->ExpressEdition = false; // TODO: VS 11 Express support + std::string vc11Express; + this->ExpressEdition = cmSystemTools::ReadRegistryValue( + "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VCExpress\\11.0\\Setup\\VC;" + "ProductDir", vc11Express, cmSystemTools::KeyWOW64_32); this->PlatformToolset = "v110"; }