22
votes

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.

1
Is it the same version of CMake?rubenvb
Yes, the version is 2.8.4 on both machines.Chris Finley
I actually found a solution, but it won't allow me to post it for another seven hours... <.<Chris Finley
You can probably post your solution now @chrisfinley - that's seven years now :)user2023370
@user2023370 - Ha! I did post it later that day...good thing too, because there's no way I'd remember it now if I hadn't ;-)Chris Finley

1 Answers

18
votes

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.