次の方法で共有


Visual Studio で CMake プリセットを使用して構成およびビルドする

CMake でサポートされている 2 つのファイル CMakePresets.jsonCMakeUserPresets.json を使用すると、ユーザーは一般的な構成、ビルド、テストのオプションを指定し、他のユーザーと共有できます。 これらのファイルを使用して、Visual Studio と Visual Studio Code、継続的インテグレーション (CI) パイプライン、およびコマンド ラインから CMake を実行します。

CMakePresets.json は、プロジェクト全体のビルドの保存用です。 CMakeUserPresets.json は、開発者が独自のローカル ビルドを保存するためのものです。 どちらのファイルも Visual Studio 2019 バージョン 16.10 以降でサポートされています。

この記事には、Visual Studio と CMakePresets.json の統合に関する情報が含まれています。 役に立つリンクを次に示します。

CMakeSettings.json の代わりとして CMakePresets.json をお勧めします。 Visual Studio に CMakePresets.jsonCMakeSettings.json の両方から同時に読み込みが行われることはありません。 Visual Studio で CMakePresets.json 統合を有効または無効にするには、Visual Studio 2019 での CMakePresets.json の有効化に関するページを参照してください。

サポートされている CMake と CMakePresets.json のバージョン

サポートされている CMakePresets.jsonCMakeUserPresets.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.jsonCMakeUserPresets.json の読み取りと評価は Visual Studio 自体によって行われ、--preset オプションを使用して CMake が直接呼び出されることはありません。 そのため、Visual Studio 内で CMakePresets.json を使用してビルドするときに CMake バージョン 3.20 以降は厳密には必要ありません。

CMake バージョン 3.14 以降を使用することをお勧めします。

Visual Studio CMakePresets.json 統合を有効にする

CMakePresets.json 統合は、既定では Visual Studio で有効になっていません。 [ツール]>[オプション]>[CMake]>[全般] で有効にすることができます。

[常にCMakePresets.jsonを使用する] が選択されていることを示すスクリーンショット。

この画面は、Visual Studio 2022 メニューの [ツール] > [オプション] > [CMake > 全般] から表示されます。 このオプションは、CMake の [ファイルの構成] セクションにあります。

重要

統合をアクティブにするには、Visual Studio でフォルダーを閉じ、再度開きます。

一部の古いバージョンの Visual Studio では、 Tools>Options>CMake>General には、 CMakePresets.json 統合を有効にするオプションが 1 つだけ用意されています。

以前のバージョンの Visual Studio のスクリーンショット。[C Make Presets .jsonを使用して CMake の構成、ビルド、テストを実行する] というラベルのチェックボックスがあります。

次の表は、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 ドロップダウンがあります。

ターゲット システムがローカル コンピューターに設定され、構成が windows-arm64 に設定され、ビルド プリセットが既定値に設定されているドロップダウンを示すスクリーンショット。

ターゲット システムを選択する

左側のドロップダウン リストには、アクティブな "ターゲット システム" が示されます。 これは、プロジェクトを構成してビルドするために CMake が呼び出されるシステムです。 このドロップダウン リストには、ローカル コンピューター、接続マネージャーのすべての SSH 接続 (ホスト名別)、Visual Studio で検索できるすべての Linux 用 Windows サブシステム (WSL) のインストールが含まれます。

[ターゲット システム] ドロップダウン リストのスクリーンショット

ドロップダウン リストには、ローカル コンピューター、IP アドレス 192.168.0.5、WSL: ubuntu2004、WSL: debian、接続の管理など、いくつかのエントリが含まれています。

前の例の場合:

  • 192.168.0.5 は、接続マネージャーに追加されたリモートの Linux システムです。
  • ubuntu2004debian は 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 を右クリックし、ショートカット メニューから [構成の追加] を選択します。 構成プリセット テンプレートを選択するためのダイアログが表示されます。

[構成プリセットの JSON ファイルへの追加] ダイアログのスクリーンショット。これには、Linux デバッグ、macOS デバッグ、x64 デバッグなどのエントリが含まれています。

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_COMPILERcacheVariables.CMAKE_CXX_COMPILER を使用することで設定できます。 これは、コマンド ラインから -D CMAKE_C_COMPILER=<value>-D CMAKE_CXX_COMPILER=<value> を CMake に渡すことと同じです。 詳細については、CMAKE_<LANG>_COMPILERを参照してください。

Visual Studio から cl.execlang-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.strategytoolset.strategyset に設定します。 詳細については、「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.strategyexternal に、また architecture.valueunspecified に設定します。 次のいずれかの理由で環境を調達しない方が便利な場合があります。

  • 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 に設定することによって設定を解除できます。

構成プリセットに設定された環境変数は、inheritConfigureEnvironmentfalse に設定されていない限り、関連付けられたビルド プリセットおよびテスト プリセットにも自動的に反映されます。 詳細については、構成プリセットの一覧を参照してください。

$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 リモート設定ベンダー マップの copyBuildOutputtrue に設定されている場合、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.jsonVCPKG_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_LEVELnull に設定しています: "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.jsonaddressSanitizerEnabled オプションによって 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.jsonASAN_OPTIONS フィールドを使用して、ランタイム フラグを AddressSanitizer に渡します。 LeakSanitizer は Visual Studio でサポートされていないため、ASAN_OPTIONS は、その他のランタイム オプションが指定されていない場合は既定で detect_leaks=0 になります。

コマンド ラインまたは CI パイプラインから CMake を実行する

同じ CMakePresets.json および CMakeUserPresets.json ファイルを使用して、Visual Studio とコマンド ラインで CMake を呼び出すことができます。 CMakeCTest のドキュメントは、--preset での CMake と CTest の呼び出しに関する最良のリソースです。 CMake バージョン 3.20 以降が必要です。

Windows でコマンド ライン ジェネレーターを使用してビルドする場合の環境の供給

コマンド ライン ジェネレーターを使用したビルドにおいて CMake が呼び出される前に環境を構成することは、ユーザーの責任です。 Windows で Ninja と Visual C++ ツールセットを使用してビルドする場合は、CMake を呼び出してビルド システムを生成する前に、環境を設定します。 vcvarsall.batarchitecture 引数を付けて呼び出すことで、これを行うことができます。 architecture 引数には、使用するホストおよびターゲット アーキテクチャが指定されます。 詳細については、「vcvarsall 構文」を参照してください。 Linux または Windows 上で Visual Studio ジェネレーターを使用してビルドする場合は、この手順を実行する必要はありません。

これは、IDE によって CMake が呼び出されたときに Visual Studio で実行される手順と同じです。 Visual Studio によって、toolsetarchitecture で指定したホストおよびターゲット アーキテクチャについてアクティブな構成プリセットが解析されます。 その後、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.batPATH に追加できます。

コマンドライン ワークフローの例

次のコマンドを使用すると、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-liteCMakePresets.json ファイルに、構成プリセット、ビルド プリセット、テスト プリセットの例が含まれています。 この例の詳細については、「CMakePresets.jsonの概要」プレゼンテーションを参照してください。 DirectXTK プロジェクトには、configurePresets セクションに多数のビルド ターゲットが表示されている別の例があります。

次のステップ

Visual Studio での CMake プロジェクトの構成とデバッグについてさらに学習します。