Я работаю над проектом среднего размера, который содержит несколько библиотек с взаимозависимостью, которые я недавно преобразовал для сборки с использованием нерекурсивного 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-файлов? В частности, как мне создать путь к каталогу объектного файла и имя цели (создать цель на основе цели)?