条件付き変数とデバッグ/リリースビルド

条件付き変数代入、ifdef/ifeqディレクティブ、ターゲット固有の変数を使用して、Makefileにデバッグとリリースのビルド設定を作成します。

Build Patterns

詳細な説明

Makefileにおける条件分岐ロジック

Makefileは環境、プラットフォーム、またはユーザー提供のオプションに基づいて動作を変えるための条件分岐をサポートしています。これはデバッグ/リリースビルドとクロスプラットフォームサポートに不可欠です。

デバッグ vs リリース

BUILD ?= release

ifeq ($(BUILD),debug)
  CFLAGS += -g -O0 -DDEBUG -fsanitize=address
  LDFLAGS += -fsanitize=address
else
  CFLAGS += -O2 -DNDEBUG
endif

ユーザーはmake BUILD=debugでビルドを切り替えます。ifeqディレクティブは文字列を比較します。?=演算子はデフォルトをreleaseに設定しますが、上書きを許可します。

プラットフォーム検出

UNAME_S := $(shell uname -s)

ifeq ($(UNAME_S),Linux)
  LDLIBS += -lrt -lpthread
  INSTALL_DIR = /usr/local/bin
endif
ifeq ($(UNAME_S),Darwin)
  LDLIBS += -framework CoreFoundation
  INSTALL_DIR = /usr/local/bin
endif

uname -sコマンドはカーネル名を返します。このパターンはオペレーティングシステムに基づいてリンカフラグとインストールパスを調整します。

変数の存在チェック

ifdef VERBOSE
  Q =
else
  Q = @
endif

build:
	$(Q)$(CC) $(CFLAGS) -o $(TARGET) $(SRCS)

VERBOSEが設定されていない場合、コマンドは@で接頭辞が付けられ、エコーが抑制されます。make VERBOSE=1を実行するとすべてのコマンドが表示されます。これはLinuxカーネルのMakefileで一般的なパターンです。

ターゲット固有の変数

debug: CFLAGS += -g -O0 -DDEBUG
debug: $(TARGET)

release: CFLAGS += -O2 -DNDEBUG -flto
release: $(TARGET)

ターゲット固有の変数は、そのターゲットとその前提条件をビルドする場合にのみ適用されます。make debugmake releaseは条件ディレクティブなしで異なるフラグを使用します。

主要なパターン

  • ?= ユーザーが上書き可能なデフォルト
  • ifeq/ifneq 文字列比較
  • ifdef/ifndef 変数の存在チェック
  • ターゲット固有の変数 ターゲットごとの設定

ユースケース

デバッグとリリースの個別設定、プラットフォーム固有のフラグ、CI環境向けの詳細出力制御が必要なC/C++プロジェクト用Makefileを作成する場合に使用します。

試してみる — Makefile Generator

フルツールを開く