関連:Makefileの前提条件としてのターゲット固有の変数
ターゲット固有の変数を使用してオブジェクトファイルと最終的な実行可能ファイルの出力ディレクトリを指定するMakefileを作成しようとしています。アイデアは、2つの別々のバイナリバージョン、「リリース」バージョンと「デバッグ」バージョンを維持し、追加のデバッグ情報を提供することです。
私の問題は、「make」は、何も変更していなくても、毎回クリーンビルドを実行することです。'make'が'debug'または'release'ターゲットの前提条件の変数宣言の前に、ターゲット'corewars'の前提条件を評価しているためだと確信しています。
Makefileを以下に示します。
CXX=g++
LD=g++
LDFLAGS=
CXXFLAGS=-Iinclude -Wall -Wextra
OBJECTS=main.o Machine.o Core.o ProcessQueue.o Instruction.o
OUTPUT_DIR:=Test/
.PHONY: default
.PHONY: all
.PHONY: release
default: release
all: release
release: OUTPUT_DIR:=Release/
release: corewars
.PHONY: debug
debug: CXXFLAGS+=-DDEBUG -g
debug: OUTPUT_DIR:=Debug/
debug: corewars
corewars: $(OUTPUT_DIR) $(addprefix $(OUTPUT_DIR),$(OBJECTS))
$(LD) -o $(addprefix $(OUTPUT_DIR),corewars) $(addprefix $(OUTPUT_DIR),$(OBJECTS))
Release:
mkdir -p $@
Debug:
mkdir -p $@
%.o: %.cpp include/%.h
$(CXX) -c $(CXXFLAGS) $< -o $(OUTPUT_DIR)$@
.PHONY: clean
clean:
$(RM) -r Release
$(RM) -r Debug