Использование GNU Make для одновременного создания целей отладки и выпуска

Я работаю над проектом среднего размера, который содержит несколько библиотек с взаимозависимостью, которые я недавно преобразовал для сборки с использованием нерекурсивного make-файла. Моя следующая цель - сделать возможным одновременное создание сборок отладки и выпуска из одного и того же дерева исходных текстов (make debug; make release). Моим первым шагом было создание целей отладки и выпуска, которые содержали правильные флаги сборки. Я сделал это, используя целевые переменные, например: CXXFLAGS = -Wall -Wextra -Werror -DLINUX

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

Это работало нормально, но вы могли только построить отладку или выпустить, а не то и другое одновременно. И под тем же временем я не имею в виду, что во время одной сборки я имею в виду спиной к одному и тому же исходному дереву (make debug; make release). Для этого мне нужно поместить объектные файлы в каталог для отладки / выпуска, чтобы они не перезаписывали друг друга, и мне нужно изменить двоичное имя отладочной цели с помощью буквы «D». Я подумал, что это будет легко, так как я мог бы снова использовать целевые переменные, например: 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)

Вы заставляете экспертов, уже читающих это, знать, что это не сработает, потому что вы не можете использовать целевые переменные для создания реальных целей. Они отлично работали с моей переменной CXXFLAGS, потому что переменная не использовалась в целевом имени.

Есть ли шаблон проектирования и / или передовой метод управления сборками отладки / выпуска с использованием нерекурсивных make-файлов? В частности, как мне создать путь к каталогу объектного файла и имя цели (создать цель на основе цели)?

18
задан Richard 27 October 2010 в 15:38
поделиться