Что такое генератор по умолчанию для CMake в Windows?
При запуске CMake на одном ПК, CMake генерирует файлы NMake по умолчанию. С другой стороны, он генерирует проект Visual Studio.
Я знаю, что могу переопределить значение по умолчанию, добавив -G "NMake Makefiles"
до конца моего заявления CMake, но я хочу знать, почему он по умолчанию использует проекты Visual Studio для одного и файлы NMake для другого.
2 ответа
Следующее из источника 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.
Для потомков.
TLDR: CMake 3.15 и более поздние версии используют переменную среды в качестве генератора по умолчанию, она будет использоваться
cmake
если нет
-G
предусмотрен вариант. Или, если это был недопустимый генератор, CMake выберет свой внутренний генератор по умолчанию.
CMake представил переменную окружения
CMAKE_GENERATOR
управление генератором по умолчанию в версии 3.15 см . в примечаниях к выпуску CMake 3.15 .
И документ для переменной окружения CMAKE_GENERATOR .