2010-09-10 15 views
12

Donc, je dois m'assurer que si je compile plusieurs fois pour une cible spécifique, une variable shell est définie. Si la variable n'est pas définie, make doit afficher un message, puis quitter.Sortir d'un fichier make si l'état de deux variables shell est un certain état

J'ai la règle suivante dans mon Makefile:

.PHONY: checksource 

all: checksource default 

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

Si $CROSS_COMPILE est réglé sur tout:

$> echo $CROSS_COMPILE 
whatever 
$> 

et VARIABLE $ ne définit pas:

$> echo $VARIABLE 
$> 

Il fait pas quitter la marque et la cible par défaut est construite. Ok, je sais que je pourrais juste utiliser ifeq imbriqué pour le faire mais je veux le rendre joli (et en apprendre un peu plus sur makefiles).

Répondre

13

Il n'existe pas de code $(ifeq). Je pense toujours que vous devriez faire le chèque dans le makefile lui-même, non pas comme l'une des cibles:

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

Et si vous définissez à éviter imbriqué ifeq:

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

Mais je ne vois pas comment c'est une amélioration. Si vous voulez le faire dans une cible, il suffit d'utiliser le shell et ne vous embêtez pas avec les fonctions de marque:

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

Je serais toujours aller avec la première option, parce que vous pouvez arrêter faire avant qu'il est tout stat les noms de fichiers dans Makefile et décide de commencer à exécuter checksource.

3

Le faire en make est toujours préférable à l'utilisation du shell (que ce soit via $(shell) ou une recette). Si vous faites la vérification dans une recette, cela signifie que le Makefile peut contenir d'autres cibles qui n'ont pas besoin de cette assertion particulière.

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

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

P.S. Si vous avez exécuté votre marque originale avec --warn-undefined-variables, vous avez peut-être compris pourquoi vos macros ne se développaient pas correctement:

$ 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.