24

I have multiple versions of Visual Studio installed (2010, 2012, 2015 trial).

How can I force CMake to generate the makefiles for a specific VS version? By default it generates for VS2015.

Pietro
  • 12,086
  • 26
  • 100
  • 193

2 Answers2

34

First you can check what generators your CMake version does support (and how they are named):

> cmake.exe --help
...
The following generators are available on this platform:
...
  Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files.
                                 Optional [arch] can be "Win64" or "ARM".    
...

Then you can give the generator with

  1. cmake.exe -G "Visual Studio 11" .. (short name)
  2. cmake.exe -G "Visual Studio 11 2012" .. (full name)

I prefer the later, because of its clarity. And I normally have this call in a build script wrapper:

@ECHO off
IF NOT EXIST "BuildDir\*.sln" (
    cmake -H"." -B"BuildDir" -G"Visual Studio 11 2012"
)
cmake --build "BuildDir" --target "ALL_BUILD" --config "Release"

The full name is transferred to an internal cached CMake variable name CMAKE_GENERATOR. So the above calls are equivalent to

  1. cmake -DCMAKE_GENERATOR="Visual Studio 11 2012" ..

This gives us an interesting possibility. If you place a file called PreLoad.cmake parallel to your main CMakeLists.txt file you can force the default (if available) to take for your project there

  1. cmake.exe ..

    PreLoad.cmake

    if (NOT "$ENV{VS110COMNTOOLS}" STREQUAL "")
        set(CMAKE_GENERATOR "Visual Studio 11 2012" CACHE INTERNAL "Name of generator.")
    endif()
    

Sometimes you may need to add also -T <toolset-name> or -A <platform-name> option:

  1. cmake.exe -G "Visual Studio 10" -T "v90" ..

And last but not least if you are really only interested in the compiler

  1. "\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat"

    cmake.exe -G "NMake Makefiles" ..


References

Community
  • 1
  • 1
Florian
  • 39,996
  • 9
  • 133
  • 149
  • An important answer for an important question. +1 for you. – Herve Mutombo Jul 02 '18 at 14:06
  • Is there a way to set the generator to be MSVC yet make it use CLANG as a compiler? It seems whatever I do once `-G"Visual Studio 15 2017 Win64"` I can't make CMake use a different compiler (Though it is compatible). – Royi Aug 18 '18 at 21:27
  • this doesn't work for me, I indicated `-G"Visual Studio 15 2017 Win64"` but still shows `-- The C compiler identification is MSVC 19.16.27045.0 -- The CXX compiler identification is MSVC 19.16.27045.0` – JustWe Mar 05 '21 at 02:59
2
cmake -G "Visual Studio 12" ..\MyProject
Pietro
  • 12,086
  • 26
  • 100
  • 193