我正在尝试制作一个 Makefile,它使用特定于目标的变量来指定目标文件和最终可执行文件的输出目录。这个想法是维护两个独立的二进制版本,一个“发布”版本和一个带有额外调试信息的“调试”版本。
我的问题是'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