Связанные: Целевые переменные как предпосылки в Makefile
Я пытаюсь создать Makefile, который использует целевую переменную для укажите выходной каталог для объектных файлов и конечного исполняемого файла. Идея состоит в том, чтобы поддерживать две отдельные бинарные версии: «выпускную» версию и «отладочную» версию с дополнительной отладочной информацией.
Моя проблема в том, что 'make' каждый раз выполняет чистую сборку, даже если я ничего не менял. Я почти уверен, что это потому, что «сделать» оценивает предварительные условия цели «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