CMake は Makefile を自動生成し、make コマンドでビルドできるようにするメタビルドシステムです。以下では、CMake の主要変数と基本的な書き方、そして手書き Makefile の最小構成を紹介します。
CMake が提供する代表的なディレクトリ変数
| 変数名 | 意味 |
|---|---|
CMAKE_SOURCE_DIR | 最上位ソースディレクトリ |
CMAKE_CURRENT_SOURCE_DIR | 現在処理中のソースディレクトリ(サブプロジェクト利用時) |
PROJECT_SOURCE_DIR | 現在の CMake プロジェクトのソースディレクトリ |
CMAKE_BINARY_DIR | 最上位ビルドディレクトリ(cmake を実行した場所) |
CMAKE_CURRENT_BINARY_DIR | 現在処理中のビルドディレクトリ |
PROJECT_BINARY_DIR | 現在のプロジェクトのビルドディレクトリ |
最小構成の CMakeLists.txt
# 要求する CMake の最低バージョン
cmake_minimum_required(VERSION 3.16)
# プロジェクト名と使用言語を宣言
project(hello_headers LANGUAGES CXX)
# ビルド対象のソースファイルをまとめる
set(APP_SRC
src/hello.cpp
src/main.cpp
)
# 実行ファイルを生成
add_executable(hello_bin ${APP_SRC})
# インクルードパスを追加
target_include_directories(hello_bin
PRIVATE
${PROJECT_SOURCE_DIR}/include
)
ビルド手順(アウト・オブ・ソース)
mkdir build && cd buildcmake ..# ビルドシステムを生成cmake --build .# または単にmake
手書き Makefile の最小例
# 変数定義
CXX := g++
SRC_DIR := src
INC_DIR := include
OBJ_DIR := obj
BIN := app
# 全ソースとオブジェクト
SOURCES := $(wildcard $(SRC_DIR)/*.cpp)
OBJECTS := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SOURCES))
# デフォルトターゲット
$(BIN): $(OBJECTS)
$(CXX) $^ -o $@
# オブジェクト生成ルール
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp | $(OBJ_DIR)
$(CXX) -I$(INC_DIR) -c $< -o $@
# 出力ディレクトリ作成
$(OBJ_DIR):
mkdir -p $@
# クリーンアップ
.PHONY: clean
clean:
rm -rf $(OBJ_DIR) $(BIN)
上記 Makefile のポイント
$@: ターゲット名(appやobj/main.o)$^: 依存ファイルの一覧$<: 最初の依存ファイル.PHONY: 同名ファイルを無視して必ず実行wildcard / patsubst: ファイルリストの自動展開と変換
CMake を使えば、プラットフォーム固有の生成物(Visual Studio ソリューション、Ninja ファイルなど)も同じ設定で出力できるため、大規模プロジェクトでは CMake を採用するのが一般的です。