CMake と Makefile による C++ ビルドの実践ガイド

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
)

ビルド手順(アウト・オブ・ソース)

  1. mkdir build && cd build
  2. cmake ..  # ビルドシステムを生成
  3. 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 のポイント

  • $@ : ターゲット名(appobj/main.o
  • $^ : 依存ファイルの一覧
  • $< : 最初の依存ファイル
  • .PHONY : 同名ファイルを無視して必ず実行
  • wildcard / patsubst : ファイルリストの自動展開と変換

CMake を使えば、プラットフォーム固有の生成物(Visual Studio ソリューション、Ninja ファイルなど)も同じ設定で出力できるため、大規模プロジェクトでは CMake を採用するのが一般的です。

タグ: CMake Makefile C++ ビルドシステム ターゲット

7月2日 18:06 投稿