Вы на самом деле не описываете, как вы хотите использовать эти правила, поэтому могут быть более простые решения, такие как использование рекурсивного make. Однако, если вы хотите получить самый простой c ответ именно на тот вопрос, который вы задали, тогда ответ будет eval
.
Сначала вы напишите переменную, содержащую ваше правило:
define RULE
$(BUILD_DIR_$(BUILD_TYPE))/args.o: \
$(SRC)/args.c \
$(SRC)/args.h \
$(SRC)/something_else.h
$$(CC) $$(CFLAGS) $$(CFLAGS_$(BUILD_TYPE)) -c -o $$@ $$<
endef
$(foreach BUILD_TYPE,DEBUG RELEASE,$(eval $(RULE)))
Обратите внимание на экранированный $$
в рецепте переменной правила. Это необходимо, потому что эта переменная раскрывается один раз перед анализом с помощью eval
, и вы не хотите, чтобы эти переменные рецепта расширялись там, вы хотите отложить их расширение до фактического запуска рецепта.
Вы можете найти набор постов в блоге здесь (начните с последнего в списке, который был первым написанным), чтобы узнать больше об этом: http://make.mad-scientist.net/category/metaprogramming/