コンパイルしたい(cmake)
$ cmake [options] <path-to-source>
$ cmake [options] -S <path-to-source> -B <path-to-build>
$ cmake --build <path-to-build> --parallel
$ cmake --install <path-to-build>
CMakeは、C++やCなどのプログラムを ビルドするための設定を自動化 するツールです。
CMakeLists.txtに記述されたビルド情報を元に、
makeやninjaなどのビルドツールに応じた設定ファイル(Makefileやninja.build)を
自動で生成してくれます。
また、クロスプラットフォーム対応しているため、 Linux、macOS、Windowsなどさまざまな環境で利用できます。
注釈
これまでのビルド&インストールで
./configureしていた部分で
cmakeします。
./configure
make
make install
インストールしたい
$ brew install cmake
$ brew install cmake-docs
$ cmake --version
cmake version 3.29.6
$ ccmake --version
ccmake version 3.29.6
CMakeはHomebrewでインストールできます。
オフラインでドキュメントを確認したい場合は、
cmake-docsも追加します。
注釈
以前はcmakeという名前で、formula(CLIツール)とcask(GUIアプリ)の両方が提供されていました。
2025年6月にCaskのほうがcmake-appにリネームされました。
GUIアプリを使いたい場合はbrew install --cask cmake-appしてください。
ビルド構成したい
$ mkdir <path-to-build>
$ cd <path-to-build>
$ cmake ..
cmakeでは「out-of-source build」が 推奨 されています。
ソースコードとビルド環境を分離することで、
ソースディレクトリ(やリポジトリ)を汚さずにすみます。
また、ビルド環境を完全に削除しやすくなります。
通常はbuildのようなビルド用ディレクトリを作成してcmake ..で
ビルド構成ファイルを生成(=configure)します。
必要なファイルはすべてbuildディレクトリの中に生成されます。
$ cmake -S source -B build
-Sと-Bオプションを使って、ビルド対象を明示できます。
ビルド作業をスクリプト化する場合には、
これらのオプションを使った方が可読性があがります。
ビルドしたい(--build)
$ cmake --build <path-to-build>
cmake --buildで、ビルド構成ファイルにしたがってビルドします。
$ cmake --build <path-to-build> --parallel <n>
--parallelオプションで並列ビルドできます。
数値を指定して並列ジョブ数を変更できます。
インストールしたい(--install)
$ cmake --install <path-to-build>
cmake --installでシステムにインストールできます。
インストール先はCMAKE_INSTALL_PREFIXです。
$ cmake --install <path-to-build> --prefix <path-to-install-binary>
--prefixオプションで、インストール先を一時的に変更できます。
注釈
$ cmake -DCMAKE_INSTALL_PREFIX=path-to-install -S source -B build
インストール先は、ビルド構成時のオプションで設定します。
デフォルトは/usr/local/です。
オプション設定したい(-Dオプション名)
$ cmake -Dオプション名 -S source -B build
// インストール先を変更
$ cmake -DCMAKE_INSTALL_PREFIX=$HOME/.local/bin -S source -B build
-Dオプション名=値でビルドオオプショを変更できます。
オプションは、CMakeの組み込みオプションもあれば、
ユーザー定義されたオプションもあります。
複数オプションしたい(--preset / CMakePresets.json)
$ cmake --preset=プリセット名 -S source -B build
複数のオプションを設定する場合は、CMakePresets.jsonを作成し、
--presetオプションでプリセット名を指定するとよいです。
{
"name": "プリセット名",
"displayName": "表示名",
"description": "ビルド内容の説明",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/install",
"...": "..."
}
}
Release用とDebug用のように、
ビルドタイプごとにプリセットを作成しておくのも便利です。
ビルドタイプしたい(-DCMAKE_BUILD_TYPE)
$ cmake -DCMAKE_BUILD_TYPE=Debug ..
$ cmake -DCMAKE_BUILD_TYPE=Release ..
$ cmake -DCMAKE_BUILD_TYPE=MinSizeRel ..
$ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
CMAKE_BUILD_TYPEオプションで、ビルドタイプを変更できます。
ビルドタイプの値は次の4種類があります。
Debug: 最適化なし、デバッグ情報ありRelease: 最適化あり、デバッグ情報なしRelWithDebugInfo: 最適化あり、デバッグ情報ありMinSizeRel: 最適化あり(サイズ最小化に特化)
注釈
カスタムなビルドタイプを使用可能ですが、一般的ではないようです。 特別な理由がなければ、標準的な値を使い分けるのがベストです。
$ cmake -DCMAKE_BUILD_TYPE=Debug -S ./source -B ./build-debug
$ cmake --build ./build
$ cmake -DCMAKE_BUILD_TYPE=Release -S ./source -B./build-release
$ cmake --build ./build
ジェネレーターしたい(-G)
$ cmake -G "Unix Makefiles"
$ cmake -G "Ninja"
$ cmake -G "Xcode"
-Gオプションで、ビルドツールを変更できます。
設定できる値には次のような値があります。
Unix Makefiles: 標準的なMakefileを生成Ninja:build.ninjaを生成Ninja Multi-Config:build-<Config>.ninjaを生成Xcode: Xcodeプロジェクトファイルを生成
注釈
ジェネレーターを変更しても、生成されるビルド結果は同じです。
$ cmake -G "Unix Makefiles" -Dオプション -S ./source -B ./build
$ cmake --build ./build
$ cmake -G "Ninja" -Dオプション -S ./source -B ./build
$ cmake --build ./build
ビルドの設定(CMakeLists.txt)
cmake_minimum_required(VERSION 3.16...3.27)
project(プロジェクト名)
add_executable(名前 名前.cc ${sources} ${headers})
target_link_libraries(名前 ライブラリ)
ビルドの設定はCMakeLists.txtに記述します。
このファイルは、CMake言語(もしくはCMake構文)で記述します。
変数したい(set)
set(変数名 値)
setコマンドで変数を定義できます。
メッセージしたい(message)
message(ログレベル "メッセージ")
message(STATUS "G4LIB=${G4LIB}")
messageコマンドを使ってログを出力できます。
ログレベルはSTATUSのほかに、DEBUG、NOTICE、WARNING、FATAL_ERRORなどがあります。
${変数名}で、CMake内で定義した変数の値を参照できます。
CMakeのバージョンしたい(cmake_minimum_required)
cmake_minimum_required(VERSION 最小値)
cmake_minimum_required(VERSION 最小値...最大値)
cmake_minimum_requiredコマンドで、CMakeのバージョンの最小値/最大値を指定できます。
プロジェクト名したい(project)
project(プロジェクト名)
project(プロジェクト名
VERSION 11.2.1
DESCRIPTION "プロジェクトの説明"
HOMEPAGE_URL "https://example.com"
)
message("Project Name: ${PROJECT_NAME}")
message("Version: ${PROJECT_VERSION}")
message(" Major: ${PROJECT_VERSION_MAJOR}")
message(" Minor: ${PROJECT_VERSION_MINOR}")
message(" Patch: ${PROJECT_VERSION_PATCH}")
message("Description: ${PROJECT_DESCRIPTION}")
message("Homepage URL: ${PROJECT_HOMEPAGE_URL}")
ライブラリを使いたい(find_package)
find_package(パッケージ名 REQUIRED)
find_packageコマンドで、インストール済みのライブラリ情報を取得できます。
注釈
ライブラリをどのように作成するかは調べていません。
外部リポジトリを使いたい(FetchContent)
include(FetchContent)
FetchContent_Declare(
名前
GIT_REPOSITORY "URL"
GIT_TAG "タグ名"
)
FetchContent_MakeAvailable(名前)
FetchContentモジュールで、外部リポジトリにあるライブラリを取得できます。
取得したファイルはbuild/_deps/にキャッシュされます。
具体的な使い方は、CMakeに対応したライブラリのREADMEなどに書いてあると思うので、個別に確認してください。
ビルド用ディレクトリを強制したい
if(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
message(STATUS "This package requires an out-of-source build.")
message(STATUS "Please remove these files from ${CMAKE_CURRENT_BINARY_DIR} first:")
message(STATUS "CMakeCache.txt")
message(STATUS "CMakeFiles")
message(STATUS "Once these files are removed, create a separate directory")
message(STATUS "and run CMake from there")
message(FATAL_ERROR "in-source build detected")
endif()
Out-of-source build を強制するための設定です。
CMakeLists.txtの冒頭に記述しておくとよいです。
組み込み変数したい
get_cmake_property(_vars VARIABLES)
foreach(v ${_vars})
message(STATUS "${v} = ${${v}}")
endforeach()
組み込み関数のget_cmake_propertyを使って、
プロジェクト内のすべての変数(VARIABLES)を出力できます。
VARIABLESの他に、
CACHE_VARIABLES、
COMMANDS、
MODULESのプロパティ名を指定できます。
プロジェクト情報したい
PROJECT_NAME:project()で定義したプロジェクト名PROJECT_SOURCE_DIR: プロジェクトのルートソースディレクトリPROJECT_BINARY_DIR: プロジェクトのルートビルドディレクトリCMAKE_PROJECT_NAME: 最初に読み込まれたプロジェクトの名前CMAKE_SOURCE_DIR: 最上位のCMakeLists.txtがあるディレクトリCMAKE_BINARY_DIR: 最上位のビルドディレクトリ
バージョン情報したい
PROJECT_VERSION:project()で定義したバージョン番号PROJECT_VERSION_MAJOR: メジャーバージョンPROJECT_VERSION_MINOR: マイナーバージョンPROJECT_VERSION_PATCH: パッチバージョン
CMake実行環境したい
CMAKE_VERSION: 実行中のCMakeのバージョンCMAKE_COMMAND:cmakeコマンドのパスCMAKE_ROOT: CMakeのモジュールファイルがあるディレクトリ
パスを確認したい
CMAKE_CURRENT_SOURCE_DIR: 現在処理しているCMakeLists.txtのあるディレクトリCMAKE_CURRENT_BINARY_DIR: 現在のビルド出力ディレクトリCMAKE_CURRENT_LIST_FILE: 現在処理中のファイル名CMAKE_CURRENT_LIST_DIR: 現在処理中のファイルがあるディレクトリ名
ビルド環境を確認したい
CMAKE_BUILD_TYPE: ビルドタイプの種類CMAKE_INSTALL_PREFIX: インストール先のパスCMAKE_RUNTIME_OUTPUT_DIRECTORY: 実行ファイルの出力先CMAKE_LIBRARY_OUTPUT_DIRECTORY: ライブラリの出力先CMAKE_SYSTEM_NAME: ターゲットOSの名前CMAKE_HOST_SYSTEM_NAME: ビルドを実行するマシンのOS名CMAKE_GENERATOR: ビルドシステムの種類CMAKE_CACHEFILE_DIR:CMakeCache.txtのディレクトリ名
コンパイラを確認したい
CMAKE_C_COMPILER: 使用するCコンパイラのパスCMAKE_C_FLAGS: Cコンパイル時のフラグCMAKE_CXX_COMPILER: 使用するC++コンパイラのパスCMAKE_CXX_FLAGS: C++コンパイル時のフラグ
VS Code したい
次の2つの拡張をVS Codeに追加してください。