как сжать этот шаблон Makefile? - PullRequest
0 голосов
/ 13 апреля 2020

Как переписать пары абзацев Makefile, как это, в один абзац? У меня есть:

$(BUILD_DIR_DEBUG)/args.o: \
        $(SRC)/args.c \
        $(SRC)/args.h \
        $(SRC)/something_else.h
    $(CC) $(CFLAGS) $(CFLAGS_DEBUG) -c -o $@ $<

$(BUILD_DIR_RELEASE)/args.o: \
        $(SRC)/args.c \
        $(SRC)/args.h \
        $(SRC)/something_else.h
    $(CC) $(CFLAGS) $(CFLAGS_RELEASE) -c -o $@ $<

Я был бы рад получить что-то подобное (не предполагайте правильный синтаксис), но я не знаю, как определить такое:

# ${BUILD_TYPE} to be iterated as "DEBUG" and "RELEASE" to get two current
# runtime rules from one actually written rule.
$(BUILD_DIR_$(BUILD_TYPE))/args.o: \
        $(SRC)/args.c \
        $(SRC)/args.h \
        $(SRC)/something_else.h
    $(CC) $(CFLAGS) $(CFLAGS_$(BUILD_TYPE)) -c -o $@ $<

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Вы на самом деле не описываете, как вы хотите использовать эти правила, поэтому могут быть более простые решения, такие как использование рекурсивного 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/

0 голосов
/ 13 апреля 2020

краткий ответ:

ifeq ($(DEBUG), 1)
BUILD_DIR = $(BUILD_DIR_DEBUG)
CFLAGS = $(CFLAGS_DEBUG)
else
BUILD_DIR = $(BUILD_DIR_RELEASE)
CFLAGS = $(CFLAGS_RELEASE)
endif

$(BUILD_DIR)/args.o: \
        $(SRC)/args.c \
        $(SRC)/args.h \
        $(SRC)/something_else.h
    $(C) $(CFLAGS) -c -o $@ $<

и установите переменную DEBUG, как считаете нужным. например, make DEBUG=1

см. также:

Как настроить мой make-файл для сборок отладки и выпуска?

https://www.gnu.org/software/make/manual/html_node/Conditional-Example.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...