CMakePresets.jsonで最初に設定しておくべきこと

CMakeのコマンドを毎回手で打っていると、オプションが増えた時点でつらくなります。

cmake -S . -B build/debug -DCMAKE_BUILD_TYPE=Debug -DENABLE_TESTS=ON
cmake --build build/debug

個人で使うだけならまだよいですが、チームやCIで同じ設定を使うなら CMakePresets.json に寄せる方が扱いやすいです。

公式ドキュメントでは、共通のconfigure方法を共有する仕組みとして CMakePresets.jsonCMakeUserPresets.json が説明されています。

https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html

CMakePresets.jsonに書くもの

最小構成はこんな感じです。

{
  "version": 6,
  "cmakeMinimumRequired": {
    "major": 3,
    "minor": 25,
    "patch": 0
  },
  "configurePresets": [
    {
      "name": "debug",
      "displayName": "Debug",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build/debug",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug",
        "ENABLE_TESTS": "ON"
      }
    }
  ],
  "buildPresets": [
    {
      "name": "debug",
      "configurePreset": "debug"
    }
  ]
}

使う側はこうなります。

cmake --preset debug
cmake --build --preset debug

コマンドが短くなるだけでなく、設定名として残るのが便利です。

configurePresets

configurePresets は、cmake -S . -B build ... に相当する設定です。

よく設定するのはこのあたりです。

項目 内容
name コマンドで使う名前
displayName 表示用の名前
generator Ninjaなどのジェネレータ
binaryDir ビルドディレクトリ
cacheVariables -D で渡す値

binaryDir はpresetごとに分けておきます。

"binaryDir": "${sourceDir}/build/debug"

DebugとReleaseで同じbuildディレクトリを使い回すと、キャッシュが混ざって分かりにくくなります。

クロスコンパイル用のtoolchain fileを毎回指定する場合も、presetに寄せると扱いやすくなります。toolchain file側の基本は CMakeでクロスコンパイルするときのtoolchain fileの書き方 にまとめています。

buildPresets

buildPresets は、cmake --build に相当する設定です。

"buildPresets": [
  {
    "name": "debug",
    "configurePreset": "debug"
  }
]

configurePreset で、どのconfigure設定に対応するbuildなのかを指定します。

これで次のコマンドが使えます。

cmake --build --preset debug

DebugとReleaseを分ける

よく使う形は、DebugとReleaseを分ける構成です。

{
  "version": 6,
  "configurePresets": [
    {
      "name": "debug",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build/debug",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug"
      }
    },
    {
      "name": "release",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build/release",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Release"
      }
    }
  ],
  "buildPresets": [
    {
      "name": "debug",
      "configurePreset": "debug"
    },
    {
      "name": "release",
      "configurePreset": "release"
    }
  ]
}

CMAKE_BUILD_TYPE は、MakefileやNinjaのようなsingle-config generatorで使うビルドタイプです。

https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html

Visual StudioやNinja Multi-Configを使う場合は考え方が少し変わりますが、まずはNinja前提ならこの形で十分です。

CMakeUserPresets.jsonとの使い分け

公式ドキュメントでは、CMakePresets.json はプロジェクト共有用、CMakeUserPresets.json は各開発者のローカル設定用と説明されています。

https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html

リポジトリに入れるのは CMakePresets.json

個人の環境だけで使うパスやオプションは CMakeUserPresets.json に入れて、Git管理から外します。

CMakePresets.json      # commitする
CMakeUserPresets.json  # commitしない

まとめ

ビルドコマンドが長くなってきたら、CMakePresets.json に寄せます。

  • configurePresets にconfigure設定を書く
  • buildPresets にbuild設定を書く
  • binaryDir はpresetごとに分ける
  • cacheVariables-D オプションを書く
  • 共有設定は CMakePresets.json、個人設定は CMakeUserPresets.json

CIやREADMEに長いCMakeコマンドを書く前に、preset化しておくと後から扱いやすくなります。

参考