2010-09-10 17 views
12

Muszę więc upewnić się, że jeśli kompiluję krzyżowo dla określonego obiektu docelowego, dla którego ustawiona jest zmienna powłoki. Jeśli zmienna nie jest ustawiona, make powinna wyświetlić komunikat, a następnie wyjść.Wyjście z pliku make, jeśli stan dwóch zmiennych powłoki jest określonym stanem.

Mam następującą regułę w moim Makefile:

.PHONY: checksource 

all: checksource default 

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

Jeśli $CROSS_COMPILE jest ustawiony na cokolwiek:

$> echo $CROSS_COMPILE 
whatever 
$> 

i $ zmienna nie jest zdefiniowana:

$> echo $VARIABLE 
$> 

Czyni nie wychodzić z marki i budowany jest domyślny cel. Okay Wiem, że mogłem po prostu użyć zagnieżdżonego ifeq, aby to zrobić, ale chcę sprawić, że będzie ładny (i dowiedzieć się nieco więcej o plikach Makefile).

Odpowiedz

13

Nie ma czegoś takiego jak $(ifeq). Nadal uważam, że należy zrobić czek w samej makefile, a nie jako jeden z celów:

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

A jeśli jesteś ustawiony na uniknięcie zagnieżdżony ifeq:

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

Ale nie widzę jak to poprawić. Jeśli chcesz zrobić to w celu, wystarczy użyć powłoki i nie przejmuj się z make funkcji:

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

bym nadal iść z pierwszej opcji, ponieważ można zatrzymać zrobić zanim stat wszystko nazwy plików w Makefile i postanawia rozpocząć wykonywanie checksource.

3

Robiąc to w make jest zawsze lepiej niż przy użyciu powłoki (czy przez $(shell) lub przepis). Jeśli sprawdzisz przepis w recepturze, oznacza to, że Makefile może zawierać inne cele, które nie wymagają tego konkretnego potwierdzenia.

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

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

P.S. Jeśli uruchomiłeś oryginalną wersję z --warn-undefined-variables, być może masz pewną wskazówkę, dlaczego Twoje makra nie rozwijały się prawidłowo:

$ 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. 
Powiązane problemy