コンパイルしたい(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
も追加します。
ビルド構成したい
$ 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に追加してください。