条件付き変数とデバッグ/リリースビルド
条件付き変数代入、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 debugとmake releaseは条件ディレクティブなしで異なるフラグを使用します。
主要なパターン
?=ユーザーが上書き可能なデフォルトifeq/ifneq文字列比較ifdef/ifndef変数の存在チェック- ターゲット固有の変数 ターゲットごとの設定
ユースケース
デバッグとリリースの個別設定、プラットフォーム固有のフラグ、CI環境向けの詳細出力制御が必要なC/C++プロジェクト用Makefileを作成する場合に使用します。