Visual Studio で CMake プリセットを使用して構成およびビルドする
CMake でサポートされている 2 つのファイル CMakePresets.json
と CMakeUserPresets.json
を使用すると、ユーザーは一般的な構成、ビルド、テストのオプションを指定し、他のユーザーと共有できます。 これらのファイルを使用して、Visual Studio と Visual Studio Code、継続的インテグレーション (CI) パイプライン、およびコマンド ラインから CMake を実行します。
CMakePresets.json
は、プロジェクト全体のビルドの保存用です。 CMakeUserPresets.json
は、開発者が独自のローカル ビルドを保存するためのものです。 どちらのファイルも Visual Studio 2019 バージョン 16.10 以降でサポートされています。
この記事には、Visual Studio と CMakePresets.json
の統合に関する情報が含まれています。 役に立つリンクを次に示します。
CMakePresets.json
の形式の詳細については、公式な CMake のドキュメントを参照してください。- Microsoft ベンダー マップとマクロ展開の詳細については、「
CMakePresets.json
およびCMakeUserPresets.json
の Microsoft ベンダー マップ」を参照してください。 - Visual Studio Code で
CMakePresets.json
を使用する方法の詳細については、CMake プリセットを使用した構成とビルドに関するページを参照してください。
CMakeSettings.json
の代わりとして CMakePresets.json
をお勧めします。 Visual Studio に CMakePresets.json
と CMakeSettings.json
の両方から同時に読み込みが行われることはありません。 Visual Studio で CMakePresets.json
統合を有効または無効にするには、Visual Studio 2019 での CMakePresets.json
の有効化に関するページを参照してください。
サポートされている CMake と CMakePresets.json
のバージョン
サポートされている CMakePresets.json
と CMakeUserPresets.json
スキーマのバージョンは、Visual Studio のバージョンによって異なります。
- Visual Studio 2019 バージョン 16.10 以降では、スキーマ バージョン 2 と 3 がサポートされています。
- Visual Studio 2022 バージョン 17.4 プレビュー 1 では、スキーマ バージョン 4 のサポートが追加されています。
- Visual Studio 2022 バージョン 17.5 プレビュー 1 では、スキーマ バージョン 5 のサポートが追加されています。
ルート オブジェクトの "version"
フィールドを変更することで、バージョンを更新できます。 例と詳細については、CMakePresets.json
の形式を参照してください。
CMake バージョン 3.20 以降は、コマンド ラインから CMakePresets.json
を使用して CMake を呼び出すときに必要です。 ただし、CMakePresets.json
と CMakeUserPresets.json
の読み取りと評価は Visual Studio 自体によって行われ、--preset
オプションを使用して CMake が直接呼び出されることはありません。 そのため、Visual Studio 内で CMakePresets.json
を使用してビルドするときに CMake バージョン 3.20 以降は厳密には必要ありません。
CMake バージョン 3.14 以降を使用することをお勧めします。
Visual Studio CMakePresets.json
統合を有効にする
CMakePresets.json
統合は、既定では Visual Studio で有効になっていません。 [ツール]>[オプション]>[CMake]>[全般] で有効にすることができます。
この画面は、Visual Studio 2022 メニューの [ツール] > [オプション] > [CMake > 全般] から表示されます。 このオプションは、CMake の [ファイルの構成] セクションにあります。
重要
統合をアクティブにするには、Visual Studio でフォルダーを閉じ、再度開きます。
一部の古いバージョンの Visual Studio では、 Tools>Options>CMake>General には、 CMakePresets.json
統合を有効にするオプションが 1 つだけ用意されています。
次の表は、Visual Studio 2022 および Visual Studio 2019 バージョン 16.10 以降で、CMakeSettings.json
ではなく CMakePresets.json
を使用して CMake の構成とビルドを実行する場合を示しています。 構成ファイルが存在しない場合は、既定の構成プリセットが使用されます。
表で、"[ツール]>[オプション] が有効" は、[Use CMakePresets.json to drive CMake configure, build, and test]\(CMakePresets.json を使用して CMake で構成、ビルド、テストを実行する\) が [ツール]>[オプション]>[CMake]>[全般] で選択されていることを意味します。
構成ファイル | [ツール] > [オプション] が無効 | [ツール] > [オプション] が有効 |
---|---|---|
構成ファイルが存在しない | CMakeSettings.json |
CMakePresets.json |
CMakeSettings.json が存在する |
CMakeSettings.json |
CMakePresets.json |
CMakePresets.json が存在する |
CMakePresets.json |
CMakePresets.json |
両方の構成ファイルが存在する | CMakePresets.json |
CMakePresets.json |
自動構成とキャッシュ通知を変更する
既定では、アクティブなターゲット システムまたは構成プリセットが変更されるたびに、Visual Studio によって自動的に configure
が呼び出されます。 この動作は、[ツール]>[オプション]>[CMake]>[全般] で [構成ステップを自動的に実行しない] を選択することで変更できます。 また、[CMake キャッシュ通知を表示する] をオフにすることで、すべての CMake キャッシュ通知 (金色のバー) を無効にすることができます。
既定の構成プリセット
CMakePresets.json
または CMakeUserPresets.json
ファイルが存在しないか、CMakePresets.json
または CMakeUserPresets.json
が無効な場合は、Visual Studio で次の既定の構成プリセットが使用されます。
Windows の場合の例
{
"name": "windows-default",
"displayName": "Windows x64 Debug",
"description": "Sets Ninja generator, compilers, x64 architecture, build and install directory, debug build type",
"generator": "Ninja",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"architecture": {
"value": "x64",
"strategy": "external"
},
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
},
"vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": {
"hostOS": [ "Windows" ]
}
}
},
Linux の場合の例
{
"name": "linux-default",
"displayName": "Linux Debug",
"description": "Sets Ninja generator, compilers, build and install directory, debug build type",
"generator": "Ninja",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
},
"vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": {
"hostOS": [ "Linux" ]
},
"microsoft.com/VisualStudioRemoteSettings/CMake/1.0": {
"sourceDir": "$env{HOME}/.vs/$ms{projectDirName}"
}
}
}
存在しない CMakePresets.json
ファイルを開いたり、変更したりしようとすると、既定の構成プリセットを含む CMakePresets.json
ファイルが Visual Studio によってプロジェクトのルートに自動的に作成されます。
構成とビルド
Visual Studio ツール バーには、統合が有効になっている場合に、ターゲット システム、プリセットの構成、ビルド プリセット CMakePresets.json
ドロップダウンがあります。
ターゲット システムを選択する
左側のドロップダウン リストには、アクティブな "ターゲット システム" が示されます。 これは、プロジェクトを構成してビルドするために CMake が呼び出されるシステムです。 このドロップダウン リストには、ローカル コンピューター、接続マネージャーのすべての SSH 接続 (ホスト名別)、Visual Studio で検索できるすべての Linux 用 Windows サブシステム (WSL) のインストールが含まれます。
ドロップダウン リストには、ローカル コンピューター、IP アドレス 192.168.0.5、WSL: ubuntu2004、WSL: debian、接続の管理など、いくつかのエントリが含まれています。
前の例の場合:
- 192.168.0.5 は、接続マネージャーに追加されたリモートの Linux システムです。
- ubuntu2004 と debian は WSL のインストールです。
[接続の管理] を選択して、接続マネージャーを開きます。
構成プリセットの選択
中央のドロップダウン リストには、アクティブな "構成プリセット" が示されます。 これは、プロジェクトのビルド システムを生成するために CMake が呼び出されたときに使用される configurePreset
値です。 このドロップダウン リストには、CMakePresets.json
および CMakeUserPresets.json
で定義されている非表示でない構成プリセットの和集合が含まれます。
Visual Studio では、Microsoft Visual Studio 設定ベンダー マップにある hostOS
の値が使用され、アクティブなターゲット システムに適用されない構成プリセットが非表示になります。 詳細については、「Visual Studio 設定ベンダー マップ」にある表の hostOS
のエントリを参照してください。
[構成の管理] を選択して、プロジェクトのルートにある CMakePresets.json
ファイルを開きます。 CMakePresets.json
がまだ存在しない場合は、作成されます。
ビルド プリセットの選択
右側のドロップダウン リストには、アクティブな "ビルド プリセット" が示されます。 これは、プロジェクトをビルドするために CMake が呼び出されたときに使用される buildPreset
値です。 このドロップダウン リストには、CMakePresets.json
および CMakeUserPresets.json
で定義されている非表示でないビルド プリセットの和集合が含まれます。
すべてのビルド プリセットには、関連付けられた configurePreset
値が指定されている必要があります。 アクティブな構成プリセットに適用されないビルド プリセットは、Visual Studio で非表示になります。 詳細については、ビルド プリセットの一覧を参照してください。
アクティブな構成プリセットに関連付けられているビルド プリセットがない場合、Visual Studio に既定のビルド プリセットが表示されます。 既定のビルド プリセットは、コマンド ラインから他の引数を指定せずに cmake --build
を渡すことと同じです。
構成
Visual Studio で CMake キャッシュが古くなったことが検出されると、自動的にプロジェクトの構成が試みられます。 構成を手動で呼び出すには、メイン メニューから [プロジェクト]>[<project-name> の構成] を選択します。 これは、コマンド ラインから cmake --preset <configurePreset>
を実行するのと同じです。ここで、<configurePreset>
はアクティブな構成プリセットの名前です。
自動キャッシュ生成を無効にするには、自動構成とキャッシュ通知に関する記事を参照してください。
ビルド
プロジェクト全体をビルドするには、メイン メニューから [ビルド]>[すべてビルド] を選択します。 これは、コマンド ラインから cmake --build --preset <buildPreset>
を実行するのと同じです。ここで、<buildPreset>
はアクティブなビルド プリセットの名前です。
1 つのターゲットをビルドするには、ソリューション エクスプローラーで [CMake ターゲット ビュー]に切り替えます。 次に、任意のターゲットを右クリックし、ショートカット メニューの [ビルド] を選択します。
Note
CMakePresets.json
で指定されたターゲットのサブセットをビルドする buildPresets.targets
オプションは、Visual Studio 2019 でサポートされていません。
CTest の実行
CMakePresets.json
では、Visual Studio 2019 の 2 つメニュー オプションがサポートされています。
- [テスト]>[<プロジェクト名> に CTests を実行] によって CTest が呼び出され、アクティブな構成プリセットとビルド プリセットに関連付けられているすべてのテストが実行されます。CTest に他の引数は渡されません。
- <configurePreset> に対して [テスト]>[テスト プリセットの実行] を展開すると、アクティブな構成プリセットに関連付けられたすべてのテスト プリセットが表示されます。 1 つのテスト プリセットを選択することは、コマンド ラインから
ctest --preset <testPreset>
を実行するのと同じです。ここで、<testPreset>
は選択したテスト プリセットの名前です。 アクティブな構成プリセットに対してテスト プリセットが定義されていない場合、このオプションは利用できません。
Visual Studio 2019 では、テスト エクスプローラーは CMakePresets.json
と統合されていません。
新しいプリセットの追加
Visual Studio 2019 のすべてのコマンドとプリセット テンプレートで CMakePresets.json
が変更されます。 CMakeUserPresets.json
を直接編集することで、ユーザー レベルの新しいプリセットを追加できます。
CMakePresets.json
および CMakeUserPresets.json
では、パスにスラッシュ (/
) を使用します。
新しい構成プリセットの追加
CMakePresets.json
に新しい構成プリセットを追加するには、ソリューション エクスプローラーのフォルダー ビューで CMakePresets.json
を右クリックし、ショートカット メニューから [構成の追加] を選択します。 構成プリセット テンプレートを選択するためのダイアログが表示されます。
Windows システムで構成するには、[Windows x64 Debug]\(Windows x64 デバッグ\) テンプレートを選択します。 WSL およびリモートの Linux システムで構成するには、[Linux Debug]\(Linux デバッグ\) テンプレートを選択します。 CMakePresets.json
の編集の詳細については、「プリセットの編集」を参照してください。
選択したテンプレートは、CMakePresets.json
が存在する場合は、それに追加されます。 それ以外の場合、そのテンプレートは新しい CMakePresets.json
ファイルにコピーされます。
新しいビルド プリセットとテスト プリセットの追加
Visual Studio 2019 に新しいビルド プリセットとテスト プリセット用のテンプレートは用意されていません。 ビルド プリセットとテスト プリセットは、CMakePresets.json
を直接編集することによって追加できます。 詳細については、ビルド プリセットの一覧、テスト プリセットの一覧、または「CMakePresets.json
ファイルの例」を参照してください。
プリセットの編集
公式な CMake のドキュメントは、構成プリセット、ビルド プリセット、テスト プリセットの編集に関する最良のリソースです。 次に示す情報は、Visual Studio 開発者に特に関連する CMake ドキュメントのサブセットです。
コンパイラの選択
C および C++ コンパイラは、構成プリセットで cacheVariables.CMAKE_C_COMPILER
と cacheVariables.CMAKE_CXX_COMPILER
を使用することで設定できます。 これは、コマンド ラインから -D CMAKE_C_COMPILER=<value>
と -D CMAKE_CXX_COMPILER=<value>
を CMake に渡すことと同じです。 詳細については、CMAKE_<LANG>_COMPILER
を参照してください。
Visual Studio から cl.exe
と clang-cl.exe
を使用してビルドするには、次の例を使用します。 clang-cl
を使用してビルドするには、Windows コンポーネント用の C++ Clang ツールがインストールされている必要があります。
cl.exe
でビルドする:
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
"CMAKE_C_COMPILER": "cl",
"CMAKE_CXX_COMPILER": "cl"
},
clang
でビルドする:
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
"CMAKE_C_COMPILER": "clang-cl",
"CMAKE_CXX_COMPILER": "clang-cl"
},
"vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": {
"intelliSenseMode": "windows-clang-x64"
}
}
ジェネレーターとして Visual Studio 16 2019
または Visual Studio 17 2022
を使用する場合は、toolset
構成プリセットを使用して ClangCL
ツールセットを指定できます。
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
},
"toolset": "ClangCL",
"vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": {
"intelliSenseMode": "windows-clang-x64"
}
}
toolset
仕様をサポートするジェネレーターの詳細については、CMake のドキュメントの「CMAKE_GENERATOR_TOOLSET
」を参照してください。
重要
Visual Studio 2019 の場合、clang
または clang-cl
を使用してビルドするときは、Clang IntelliSense モードを明示的に指定する必要があります。
Visual Studio の外部でこれらのビルドを再現するには、「コマンド ラインまたは CI パイプラインから CMake を実行する」を参照してください。
Linux 上でビルドする場合、または Visual C++ ツールセットを使用せずにビルドする場合は、PATH
インスタンスでコンパイラの名前を指定するか、コンパイラの完全なパスと評価される環境変数を指定します。 ファイルを共有可能に維持できるように、完全なパスは使用しないことをお勧めします。 GCC バージョン 8 でビルドするプリセットは次のようになります。
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
"CMAKE_C_COMPILER": "gcc-8",
"CMAKE_CXX_COMPILER": "g++-8"
},
CMake ツールチェーン ファイルを使用してコンパイラを設定することもできます。 cacheVariables.CMAKE_TOOLCHAIN_FILE
を使用してツールチェーン ファイルを設定できます。これは、コマンド ラインから -D CMAKE_TOOLCHAIN_FILE=<value>
を CMake に渡すことと同じです。 CMake のツールチェーン ファイルは、多くの場合、クロスコンパイルに使用されます。 CMake ツールチェーン ファイルの作成の詳細については、CMake ツールチェーンに関するページを参照してください。
ジェネレーターの選択
Windows と Linux の両方の構成プリセット テンプレートで、既定のジェネレーターとして Ninja が指定されています。 その他の一般的なジェネレーターは、Windows の場合は Visual Studio ジェネレーター、Linux および macOS の場合は Unix Makefiles です。 generator
オプションを使用して構成プリセットに新しいジェネレーターを指定できます。 これは、コマンド ラインから -G
を CMake に渡すことと同じです。
Visual Studio ジェネレーターでビルドするときは、architecture.strategy
と toolset.strategy
を set
に設定します。 詳細については、「CMake generators」(CMake ジェネレーター) を参照してください。
構成の種類の選択
cacheVariables.CMAKE_BUILD_TYPE
を使用して、単一構成ジェネレーターの構成の種類 (Debug
または Release
) を設定できます。 これは、コマンド ラインから -D CMAKE_BUILD_TYPE=<value>
を CMake に渡すことと同じです。 詳細については、CMAKE_BUILD_TYPE
を参照してください。
Visual C++ ツールセットを使用したビルド時にターゲットとホストのアーキテクチャを選択する
ターゲット アーキテクチャ (x64、Win32、ARM64、または ARM) は、architecture.value
を使用して設定できます。 これは、コマンド ラインから -A
を CMake に渡すことと同じです。 詳細については、「Platform Selection」(プラットフォームの選択) を参照してください。
Note
現在、x86 用にビルドするときに、Visual Studio ジェネレーターでは Win32 の構文が、コマンド ライン ジェネレーター (Ninja など) では x86 の構文が想定されています。
ホスト アーキテクチャ (x64 または x86) とツールセットは、toolset.value
を使用して設定できます。 これは、コマンド ラインから -T
を CMake に渡すことと同じです。 詳細については、「Toolset Selection」(ツールセットの選択) を参照してください。
architecture.strategy
および toolset.strategy
の値により、アーキテクチャとツールセットのフィールドの処理方法を CMake に指示します。 set
は CMake でそれぞれの値を設定することを意味し、external
は CMake でそれぞれの値を設定しないことを意味します。
Visual Studio ジェネレーターなどの IDE ジェネレーターで set
を使用することをお勧めします。 Ninja のようなコマンド ライン ジェネレーターでは external
を使用します。 これらの値により、CMake が呼び出される前に、Visual Studio などのベンダーで必要な環境を供給することができます。 アーキテクチャとツールセットのフィールドの詳細については、構成プリセットの一覧を参照してください。
環境を調達しない場合、architecture.strategy
を external
に、また architecture.value
を unspecified
に設定します。 次のいずれかの理由で環境を調達しない方が便利な場合があります。
- MSVC 以外のツールセットを使用している。
- 埋め込みシナリオなどでカスタム ツールチェーンを使用している。
- ビルドに特定の環境が必要ない。
アーキテクチャのフィールドをサポートする IDE ジェネレーターの完全な一覧については、「CMAKE_GENERATOR_PLATFORM
」を参照してください。 ツールセットのフィールドをサポートする IDE ジェネレーターの完全な一覧については、「CMAKE_GENERATOR_TOOLSET
」を参照してください。
Ninja ジェネレーターで ARM64 をターゲットにする、または Visual Studio 16 2019 ジェネレーターで Win32 (x86) をターゲットにするには、次の例を使用します。
"generator": "Ninja",
"architecture": {
"strategy": "external",
"value": "arm64"
},
"generator": "Visual Studio 16 2019",
"architecture": {
"strategy": "set",
"value": "Win32"
},
環境変数の設定と参照
環境マップを使用して環境変数を設定できます。 環境変数は inherits
フィールドを通じて継承されますが、必要に応じてオーバーライドできます。
プリセットの環境は、それ独自の環境とすべての親の環境との和集合になります。 inherits
の複数のプリセットで同じ変数に対して競合する値が提供されている場合は、inherits
内で先に出現するプリセットが優先されます。 別のプリセットから継承された変数は、null
に設定することによって設定を解除できます。
構成プリセットに設定された環境変数は、inheritConfigureEnvironment
が false
に設定されていない限り、関連付けられたビルド プリセットおよびテスト プリセットにも自動的に反映されます。 詳細については、構成プリセットの一覧を参照してください。
$env{<variable-name>}
および $penv{<variable-name>}
の構文を使用すると、環境変数を参照できます。 詳細については、「Macro Expansion」(マクロ展開) を参照してください。
クロスコンパイラ用 IntelliSense の構成
既定では、指定したツールセットとターゲット アーキテクチャに一致する IntelliSense モードが Visual Studio で使用されます。 クロスコンパイルを行う場合は、Visual Studio 設定ベンダー マップで intelliSenseMode
オプションを使用して、正しい IntelliSense モードを手動で指定することが必要になる場合があります。 詳細については、「Visual Studio 設定ベンダー マップ」にある表の intelliSenseMode
のエントリを参照してください。
リモート システムまたは Linux 用 Windows サブシステムで構成およびビルドする
Visual Studio での CMakePresets.json
のサポートにより、Windows、WSL、リモート システムで簡単にプロジェクトを構成し、ビルドすることができます。 プロジェクトを構成してビルドする手順は、Windows、リモート システム、WSL のいずれでも同じです。 ただし、いくつかの動作はリモート開発に固有です。
リモート コピー シナリオにおける ${sourceDir}
の動作
ローカル シナリオ (WSL1 を含む) においては、${sourceDir}
は、Visual Studio で開かれているプロジェクト ソース ディレクトリへのパスと評価されます。 リモート コピー シナリオの場合、${sourceDir}
は、ローカル コンピューター上のプロジェクト ソース ディレクトリではなく、ターゲット システム上のプロジェクト ソース ディレクトリへのパスと評価されます。
ターゲット システム上のプロジェクト ソース ディレクトリは、Visual Studio リモート設定ベンダー マップの sourceDir
の値によって決まります (既定値は $env{HOME}/.vs/$ms{projectDirName}
)。 詳細については、「Visual Studio 設定ベンダー マップ」にある表の sourceDir
のエントリを参照してください。
リモート出力用のローカル フォルダー
リモート コピーのシナリオでは、Visual Studio リモート設定ベンダー マップの copyBuildOutput
が true
に設定されている場合、CMake File API 応答ファイルやビルド ファイルなどの一部のリモート ファイルをコピーするために、ローカル ディレクトリが必要です。 これらのファイルは、自動的に <local-source-directory>/out/<remote-connection-ID>/build/${presetName}
にコピーされます。
Windows と WSL1 での同じ構成プリセットの呼び出し
Windows と WSL1 で同じ構成プリセットを使用しようとすると、エラーが表示されます。 Windows と WSL1 の両方に Windows ファイル システムが使用されているため、Windows と WSL1 の両方のビルド ツリーに同じ出力ディレクトリ (binaryDir
) を使用することが CMake によって試みられます。
Windows と WSL1 の両方のツールセットで同じ構成プリセットを使用する場合は、元のプリセットから継承して新しい binaryDir
値を指定する 2 つ目の構成プリセットを作成します。 次の例では、Windows の場合は windows-preset
を使用でき、WSL1 の場合は base-preset
を使用できます。
{
"name": "windows-preset",
"inherits": "base-preset",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": {
"hostOS": "Windows"
}
}
}
Note
Visual Studio 2019 でサポートされているのは、WSL1 ツールセットのみです。 この動作は、Windows と WSL の両方で configure
を呼び出すと常に確認されます。
vcpkg の統合を有効にする
vcpkg は、Windows、Linux、macOS で C および C++ ライブラリを管理するのに役立ちます。 vcpkg 統合を有効にするには、vcpkg ツールチェーン ファイル (vcpkg.cmake
) を CMake に渡す必要があります。 詳細については、vcpkg のドキュメントを参照してください。
CMakePresets.json
統合が有効になっている場合、Visual Studio で vcpkg ツールチェーン ファイルが自動的に CMake に渡されることはなくなりました。 この変更により、Visual Studio 固有の動作がなくなり、コマンド ラインからビルドを確実に再現できるようになります。
代わりに、CMakePresets.json
で VCPKG_ROOT
環境変数を使用して vcpkg.cmake
へのパスを設定します。
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": {
"value": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"type": "FILEPATH"
}
},
VCPKG_ROOT
は、vcpkg のインストール先のルートに設定する必要があります。 詳細については、vcpkg の環境変数のページを参照してください。
既に CMake ツールチェーン ファイルを使用していて、vcpkg 統合を有効にする場合は、「複数のツールチェーン ファイルの使用」を参照してください。 これらの手順に従って、vcpkg を使用することでプロジェクトで外部のツールチェーン ファイルを使用します。
launch.vs.json
および tasks.vs.json
での変数置換
launch.vs.json
および tasks.vs.json
での変数置換が CMakePresets.json
でサポートされています。 次にいくつかの考慮事項を示します。
アクティブな構成プリセットに設定されている環境変数は、
launch.vs.json
およびtasks.vs.json
構成に自動的に反映されます。launch.vs.json
およびtasks.vs.json
内の個々の環境変数は、null
に設定することによって設定を解除できます。 次の例では、launch.vs.json
で変数DEBUG_LOGGING_LEVEL
をnull
に設定しています:"env": { "DEBUG_LOGGING_LEVEL": null }
。launch.vs.json
およびtasks.vs.json
で構文${cmake.<KEY-NAME>}
を使用して、アクティブな構成プリセットに設定されているキー値を使用できます。 たとえば、${cmake.binaryDir}
を使用して、アクティブな構成プリセットの出力ディレクトリを参照します。launch.vs.json
およびtasks.vs.json
で構文${env.<VARIABLE-NAME>}
を使用して、アクティブな構成プリセットの環境マップに設定されている個々の環境変数を使用できます。
ご自分の launch.vs.json
および task.vs.json
ファイルを、CMakeSettings.json
構文ではなく CMakePresets.json
構文を参照するように更新します。 CMakeSettings.json
がアクティブな構成ファイルであるときに以前の CMakePresets.json
構文を参照するマクロは、今後のリリースで非推奨化される予定です。 たとえば、CMakePresets.json
には binaryDir
構文が使用されるため、アクティブな構成プリセットの出力ディレクトリを参照するには、${cmake.buildRoot}
ではなく ${cmake.binaryDir}
を使用します。
トラブルシューティング
想定どおり動作にしない場合は、いくつかのトラブルシューティング手順を試すことができます。
CMakePresets.json
または CMakeUserPresets.json
のいずれかが無効である場合、Visual Studio は既定の動作に戻り、既定の構成プリセットのみが表示されます。 Visual Studio の IntelliSense は、これらの JSON エラーの多くをキャッチするのに役立ちますが、inherits
または configurePreset
で間違った名前を使用してプリセットを参照しているかどうかはわかりません。
プリセット ファイルが有効かどうかを確認するには、コマンド ラインからプロジェクト ディレクトリのルートで cmake --list-presets
を実行します。 (CMake 3.20 以降が必要です。) いずれかのファイルが無効な場合は、次のエラーが表示されます。
CMake Error: Could not read presets from
C:/Users/<user>/source/repos/<project-name>: JSON parse error
その他に次のようなトラブルシューティングの手順があります。
- キャッシュを削除し、プロジェクトを再構成します (CMake: [キャッシュの削除] と [プロジェクト]>[<プロジェクト名> の構成])。
- Visual Studio でフォルダーを閉じ、再度開きます ([ファイル]>[フォルダーを閉じる])。
- プロジェクトのルートにある
.vs
フォルダーを削除します。
問題を特定した場合、それを報告する最善の方法は、Visual Studio の右上隅にある [フィードバックの送信] ボタンを選択することです。
リモート接続のログを有効にする
リモート システムへの接続またはファイルのコピーに問題が発生している場合は、リモート接続のログ記録を有効にすることができます。 詳細については、「リモート接続のログを記録する」を参照してください。
Windows および Linux で AddressSanitizer を有効にする
Visual Studio では、Windows と Linux 両方の開発向けの C および C++ ランタイム メモリ エラー検出機能である AddressSanitizer (ASAN) がサポートされています。 CMakeSettings.json
の addressSanitizerEnabled
オプションによって AddressSanitizer が有効になります。 CMakePresets.json
では、この動作はサポートされていません。
代わりに、必要なコンパイラとリンカーのフラグを自分で設定して、AddressSanitizer を有効または無効にします。 これらを設定することにより、Visual Studio 固有の動作がなくなり、同じ CMakePresets.json
ファイルでコマンド ラインからビルドを確実に再現できるようになります。
次のサンプルを CMakeLists.txt
に追加して、ターゲットに対して AddressSanitizer を有効または無効にすることができます。
option(ASAN_ENABLED "Build this target with AddressSanitizer" ON)
if(ASAN_ENABLED)
if(MSVC)
target_compile_options(<target> PUBLIC /fsanitize=address)
else()
target_compile_options(<target> PUBLIC -fsanitize=address <additional-options>)
target_link_options(<target> PUBLIC -fsanitize=address)
endif()
endif()
<additional-options>
の部分には、"-fno-omit-frame-pointer"
など、他のコンパイル フラグが列挙されます。 Linux 向け AddressSanitizer の詳細については、「AddressSanitizer の使用」を参照してください。 MSVC での AddressSanitizer の使用の詳細については、「開発者コマンド プロンプトから AddressSanitizer を使用する」を参照してください。
launch.vs.json
の ASAN_OPTIONS
フィールドを使用して、ランタイム フラグを AddressSanitizer に渡します。 LeakSanitizer は Visual Studio でサポートされていないため、ASAN_OPTIONS
は、その他のランタイム オプションが指定されていない場合は既定で detect_leaks=0
になります。
コマンド ラインまたは CI パイプラインから CMake を実行する
同じ CMakePresets.json
および CMakeUserPresets.json
ファイルを使用して、Visual Studio とコマンド ラインで CMake を呼び出すことができます。 CMake と CTest のドキュメントは、--preset
での CMake と CTest の呼び出しに関する最良のリソースです。 CMake バージョン 3.20 以降が必要です。
Windows でコマンド ライン ジェネレーターを使用してビルドする場合の環境の供給
コマンド ライン ジェネレーターを使用したビルドにおいて CMake が呼び出される前に環境を構成することは、ユーザーの責任です。 Windows で Ninja と Visual C++ ツールセットを使用してビルドする場合は、CMake を呼び出してビルド システムを生成する前に、環境を設定します。 vcvarsall.bat
に architecture
引数を付けて呼び出すことで、これを行うことができます。 architecture
引数には、使用するホストおよびターゲット アーキテクチャが指定されます。 詳細については、「vcvarsall
構文」を参照してください。 Linux または Windows 上で Visual Studio ジェネレーターを使用してビルドする場合は、この手順を実行する必要はありません。
これは、IDE によって CMake が呼び出されたときに Visual Studio で実行される手順と同じです。 Visual Studio によって、toolset
と architecture
で指定したホストおよびターゲット アーキテクチャについてアクティブな構成プリセットが解析されます。 その後、Visual Studio によって、vcvarsall.bat
から指定された環境がソーシングされます。 Ninja を使用して Windows コマンド ラインからビルドする場合は、この手順を自分で実行する必要があります。
vcvarsall.bat
は、Build Tools for Visual Studio と共にインストールされます。 vcvarsall.bat
は、既定で C:\Program Files (x86)\Microsoft Visual Studio\2019\<edition>\VC\Auxiliary\Build
にインストールされます。 コマンドライン ワークフローを頻繁に使用する場合は、vcvarsall.bat
を PATH
に追加できます。
コマンドライン ワークフローの例
次のコマンドを使用すると、Ninja を使用して x64 ビルド ツールで ARM64 をターゲットにする CMake プロジェクトを構成し、ビルドすることができます。 CMake バージョン 3.20 以降が必要です。 CMakePresets.json
ファイルが配置されているディレクトリからこれらのコマンドを実行します。
/path/to/vcvarsall.bat x64_arm64
cmake --list-presets=all .
cmake --preset <configurePreset-name>
cmake --build --preset <buildPreset-name>
CMakePresets.json
ファイルの例
box2d-lite の CMakePresets.json
ファイルに、構成プリセット、ビルド プリセット、テスト プリセットの例が含まれています。 この例の詳細については、「CMakePresets.jsonの概要」プレゼンテーションを参照してください。 DirectXTK プロジェクトには、configurePresets
セクションに多数のビルド ターゲットが表示されている別の例があります。
次のステップ
Visual Studio での CMake プロジェクトの構成とデバッグについてさらに学習します。