Estoy trabajando en un proyecto de tamaño medio que contiene varias bibliotecas con interdependencia que he convertido recientemente para compilar utilizando un archivo make no recursivo. Mi próximo objetivo es habilitar la creación de compilaciones tanto de depuración como de liberación del mismo árbol fuente al mismo tiempo (make debug; make release). Mi primer paso fue crear los objetivos de depuración y liberación que contenían los indicadores de compilación correctos. Hice esto usando variables específicas de destino, así: CXXFLAGS = -Wall -Wextra -Werror -DLINUXUsar GNU Make para compilar objetivos de depuración y liberación al mismo tiempo
CXX_DEBUG_FLAGS=-g3 -DDEBUG_ALL
CXX_RELEASE_FLAGS=-O3
.PHONY: debug
debug: CXXFLAGS+=$(CXX_DEBUG_FLAGS)
debug: build
.PHONY: release
release: CXXFLAGS+=$(CXX_RELEASE_FLAGS)
release: build
Esto funcionó bien, pero sólo se podría construir de depuración, o liberación, no ambas al mismo tiempo. Y al mismo tiempo, no me refiero a que durante la misma construcción me refiero a una copia de seguridad en el mismo árbol de fuentes (make debug; make release). Para hacer esto, necesito ubicar los archivos del objeto en un directorio específico de depuración/liberación para que no se sobrescriban entre sí y necesito modificar el nombre binario del objetivo de depuración con una 'D'. I aunque esto sería fácil ya que sólo pudiera utilizar variables específicas de destino una vez más, como esto: CXXFLAGS = -Wall -Wextra -Werror -DLINUX
CXX_DEBUG_FLAGS=-g3 -DDEBUG_ALL
CXX_RELEASE_FLAGS=-O3
.PHONY: debug
debug: CXXFLAGS+=$(CXX_DEBUG_FLAGS)
debug: MODULE_BLD_TYPE=D
debug: OUT_DIR=debug_obj
debug: build
.PHONY: release
release: CXXFLAGS+=$(CXX_RELEASE_FLAGS)
release: MODULE_BLD_TYPE:=
release: OUT_DIR=release_obj
release: build
.PHONY: build
build: TARGET_NAME=HelloWorld$(MODULE_BLD_TYPE)
build: TARGET_BUILD_DIR=$(PROJECT_ROOT_DIR)/$(OUT_DIR)
build: TARGET_BUILD_OBJS=$(addprefix $(TARGET_BUILD_DIR)/,$(SOURCES:.cpp=.o))
build: $(TARGET_NAME)
Haces expertos leyendo esto ya sé que esto no va a funcionar porque no puede usar variables específicas del objetivo para crear objetivos reales. Funcionaron bien para mi CXXFLAGS var porque la variable no se usó en un nombre de destino.
¿Existe un patrón de diseño y/o la mejor práctica para gestionar compilaciones de depuración/liberación utilizando makefiles no recursivos? Específicamente, ¿cómo construyo la ruta del directorio del archivo objeto y el nombre del objetivo (construyo un objetivo basado en un objetivo)?
¿Qué es esta asignación de una variable en un requisito previo? – Michael
Como era de esperar, la documentación tiene una respuesta para eso: https://www.gnu.org/software/make/manual/html_node/Target_002dspecific.html –