1台のPCでCMakeを実行すると、CMakeはデフォルトでNMakeファイルを生成します。もう1つは、VisualStudioプロジェクトを生成します。
CMakeステートメントの最後に追加することでデフォルトをオーバーライドできることは知っていますが、デフォルト-G "NMake Makefiles"
で1つのVisual Studioプロジェクトと、別のNMakeファイルにデフォルト設定される理由を知りたいです。
1台のPCでCMakeを実行すると、CMakeはデフォルトでNMakeファイルを生成します。もう1つは、VisualStudioプロジェクトを生成します。
CMakeステートメントの最後に追加することでデフォルトをオーバーライドできることは知っていますが、デフォルト-G "NMake Makefiles"
で1つのVisual Studioプロジェクトと、別のNMakeファイルにデフォルト設定される理由を知りたいです。
以下は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の特定のバージョンに関係している可能性があります(たとえば、Visual C ++の「Express」バージョンはこのエントリを追加しないようです)。
-G {Generator Name}
もちろん、 CMakeコマンドの最後に追加することで、デフォルト設定を上書きすることができます。
後世のために。
TLDR:CMake 3.15以降では、環境変数CMAKE_GENERATOR
がデフォルトのジェネレーターとして使用されます。オプションが指定されcmake
ていない場合に使用され-G
ます。または、それが無効なジェネレーターであった場合、CMakeは内部のデフォルトジェネレーターを選択します。
CMAKE_GENERATOR
CMakeは、バージョン3.15でデフォルトのジェネレーターを制御する環境変数を導入しました。このCMake3.15リリースノートを参照してください。
そして、環境変数CMAKE_GENERATORのドキュメント。