Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the default generator for CMake in Windows?

Tags:

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.

like image 488
Chris Finley Avatar asked Jun 21 '11 18:06

Chris Finley


People also ask

What is CMake generator?

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.

How do I change the generator in my CMake GUI?

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.

What is Cmake_make_program?

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 .


1 Answers

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.

like image 107
Chris Finley Avatar answered Sep 23 '22 07:09

Chris Finley