relacionadas: Target-specific Variables as Prerequisites in a Makefileobjetivo makefile variables específicas como requisitos previos
estoy tratando de diseñar un Makefile que utiliza un objetivo específico de variables para especificar el directorio de salida para los archivos objeto y el ejecutable final. La idea es mantener dos versiones binarias separadas, una versión 'versión' y una versión 'depuración' con información de depuración adicional.
Mi problema es que 'make' hace una compilación limpia cada vez, incluso si no he cambiado nada. Estoy bastante seguro de que es porque 'hacer' está evaluando los requisitos previos de las 'corewars' de destino antes de la declaración de la variable en los requisitos previos para el objetivo 'depurar' o 'liberar'.
El Makefile se presenta a continuación.
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 [email protected]
Debug:
mkdir -p [email protected]
%.o: %.cpp include/%.h
$(CXX) -c $(CXXFLAGS) $< -o $(OUTPUT_DIR)[email protected]
.PHONY: clean
clean:
$(RM) -r Release
$(RM) -r Debug
Esta es una excelente desinfección de mi sistema de construcción, gracias. Me pareció necesario agregar '| $ (OUTPUT_DIR) 'a la lista de requisitos previos para que la regla haga archivos' .o', y agregué un objetivo 'limpio', pero aparte de eso, esto funciona como se cita. Muchas gracias. –
@Chris, oh, sí, tienes razón, me olvidé de eso (arreglado). ¡Y eres bienvenido! ;-) –
¡Gracias por el aviso! Lo arreglaré ahora. –