Какой генератор по умолчанию для CMake в Windows? - PullRequest
18 голосов
/ 21 июня 2011

При запуске CMake на одном ПК CMake генерирует файлы NMake по умолчанию.С другой стороны, он генерирует проект Visual Studio.

Я знаю, что могу переопределить значение по умолчанию, добавив -G "NMake Makefiles" в конец моего оператора CMake, но я хочу знать, почему он по умолчанию используется в проектах Visual Studio на одноми NMake файлы на другом.

1 Ответ

17 голосов
/ 22 июня 2011

Следующее из источника CMake (версия 2.8.4: cmake.cxx: начальная строка 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";

Похоже, что CMake смотрит в реестр Windows, чтобы определить, какой генератор использовать.Он ищет в подразделах реестра Visual Studio (6.0, 7.0 и т. Д.) В [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\ запись с именем InstallDir.Если он найден, он использует соответствующий генератор.(Он будет использовать новейшую версию Visual Studio.) В противном случае он использует генератор NMake.

Обратите внимание, что запись InstallDir присутствует не всегда, даже если установлена ​​определенная версия Visual Studio.Это может быть связано с настройками установки или конкретной версией Visual Studio (например, кажется, что «Express» версии Visual C ++ не добавляют эту запись.)

Конечно, можно переопределитьнастройка по умолчанию, добавив -G {Generator Name} в конец вашей команды CMake.

...