Подтвердить что ты не робот

Выход из файла make, если состояние двух переменных оболочки является определенным состоянием

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

В моем Makefile есть следующее правило:

.PHONY: checksource

all: checksource default

checksource:
    $(if $(and $(ifeq ($(CROSS_COMPILE), whatever)), $(ifeq ($(VARIABLE),))), \
    ($(shell echo "Error! VARIABLE not defined!") \
     $(shell exit 2)))

Если для параметра $CROSS_COMPILE установлено значение:

$> echo $CROSS_COMPILE
whatever
$>

и $VARIABLE не определены:

$> echo $VARIABLE
$>

Он не выходит из make и создается цель по умолчанию. Хорошо, я знаю, что я мог бы просто использовать вложенные ifeq, чтобы сделать это, но хочу сделать это красиво (и немного узнать о make файлах).

4b9b3361

Ответ 1

Нет такой вещи, как $(ifeq). Я все еще думаю, что вы должны сделать чек в самом файле makefile, а не как одну из целей:

ifeq ($(CROSS_COMPILE),whatever)
ifeq ($(VARIABLE),)
$(error Variables not set correctly.)
endif
endif

И если вы хотите избежать вложенных ifeq:

ifeq ($(or $(subst whatever,,$(CROSS_COMPILE)),$(VARIABLE)),)
$(error Variables not set correctly.)
endif

Но я не вижу, как это улучшение. Если вы хотите сделать это целиком, просто используйте оболочку и не мешайте делать функции:

checksource:
    @if [ "$(CROSS_COMPILE)" = whatever -a -z "$(VARIABLE)" ]; then \
        echo "Error: Variables not set correctly"; exit 2; \
    else true; fi

Я по-прежнему буду использовать первый вариант, потому что вы можете остановить до него stat все имена файлов в Makefile и решает начать выполнение checksource.

Ответ 2

Выполнение этого в make всегда лучше, чем использование оболочки (через $(shell) или рецепт). Если вы делаете чек в рецепте, то это означает, что Makefile может содержать другие цели, которые не нуждаются в этом конкретном утверждении.

assert = $(if $(filter whatever,${CROSS_COMPILE}),$(if ${VARIABLE},,$(error Urk! Variable problem)))

checksource:
        ${assert}some shell commands...

P.S. Если вы запустили свой оригинальный make с помощью --warn-undefined-variables, возможно, у вас есть подсказка, почему ваши макросы не расширялись должным образом:

$ make -f 1.mak CROSS_COMPILE=whatever --warn-undefined-variables
1.mak:6: warning: undefined variable `ifeq (whatever, whatever)'
make: *** No rule to make target `default', needed by `all'.  Stop.