When running CMake on one PC, CMake generates NMake files by default. On another, it generates a Visual Studio project.
I know I can override the default by adding -G "NMake Makefiles"
to the end of my CMake statement, but I want to know why it defaults to Visual Studio projects on one and NMake files on another.
Introduction. A CMake Generator is responsible for writing the input files for a native build system. Exactly one of the CMake Generators must be selected for a build tree to determine what native build system is to be used.
For those seeking the CMake GUI answer. Go to File->Delete Cache and then click Configure again. A scenario where changing the generator is needed is that you are keeping the CMake GUI open and reusing the same directory (source and CMakeList.
Tool that can launch the native build system. The value may be the full path to an executable or just the tool name if it is expected to be in the PATH .
The following is from the CMake Source (version 2.8.4: cmake.cxx: starting line 2039):
// Try to find the newest VS installed on the computer and // use that as a default if -G is not specified std::string vsregBase = "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\"; struct VSRegistryEntryName { const char* MSVersion; const char* GeneratorName; }; VSRegistryEntryName version[] = { {"6.0", "Visual Studio 6"}, {"7.0", "Visual Studio 7"}, {"7.1", "Visual Studio 7 .NET 2003"}, {"8.0", "Visual Studio 8 2005"}, {"9.0", "Visual Studio 9 2008"}, {"10.0", "Visual Studio 10"}, {0, 0}}; for(int i =0; version[i].MSVersion != 0; i++) { std::string reg = vsregBase + version[i].MSVersion; reg += ";InstallDir]"; cmSystemTools::ExpandRegistryValues(reg); if (!(reg == "/registry")) { installedCompiler = version[i].GeneratorName; } } cmGlobalGenerator* gen = this->CreateGlobalGenerator(installedCompiler.c_str()); if(!gen) { gen = new cmGlobalNMakeMakefileGenerator; } this->SetGlobalGenerator(gen); std::cout << "-- Building for: " << gen->GetName() << "\n";
It appears that CMake looks at the Windows Registry to determine which generator to use. It searches the Visual Studio registry subkeys (6.0, 7.0, etc) in [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\
for an entry called InstallDir
. If one is found, it uses the corresponding generator. (It will use the newest version of Visual Studio available.) Otherwise, it uses the NMake generator.
Note that the InstallDir
entry is not always present, even when a particular version of Visual Studio is installed. This may have to do with installation settings or a particular version of Visual Studio (e.g. it seems that the "Express" versions of Visual C++ do not add this entry.)
It is, of course, possible to override the default setting by appending -G {Generator Name}
to the end of your CMake command.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With