Выход из файла make, если состояние двух переменных оболочки определенное - PullRequest
13 голосов
/ 10 сентября 2010

Так что мне нужно убедиться, что, если я кросс-компилирую для конкретной цели, переменная оболочки установлена. Если переменная не установлена, 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-файлах)

Ответы [ 2 ]

15 голосов
/ 13 сентября 2010

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

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

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

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

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

3 голосов
/ 23 сентября 2010

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

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

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

PS Если вы запустили свой оригинальный 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.
...