2010-09-10 17 views
12

Por lo tanto, debo asegurarme de que si estoy compilando de forma cruzada para un objetivo específico, se establece una variable de shell. Si la variable no está configurada, make debe mostrar un mensaje y luego salir.Salir de un archivo make si el estado de dos variables de shell es un determinado estado

tengo la siguiente regla en mi 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 se ajusta a lo que sea:

$> echo $CROSS_COMPILE 
whatever 
$> 

y $ variable no está definida:

$> echo $VARIABLE 
$> 

Lo hace no sale de la marca y se genera el objetivo predeterminado. De acuerdo, sé que podría usar el ifeq anidado para hacer esto, pero quiero hacerlo bonito (y aprender un poco más sobre los archivos MAKE).

Respuesta

13

No existe tal cosa como $(ifeq). Todavía pienso que debe hacer la comprobación en el propio archivo MAKE, no como uno de los objetivos:

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

Y si ya estás en evitar anidada ifeq:

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

Pero no veo cómo eso es una mejora. Si desea hacerlo en un objetivo, sólo tiene que utilizar la cáscara y no se moleste con funciones Marca:

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

Todavía gustaría ir con la primera opción, porque se puede dejar de hacer antes de que stat es todo los nombres de los archivos en Makefile y decide comenzar a ejecutar checksource.

3

Hacerlo en make es siempre mejor que usar el shell (ya sea a través de $(shell) o una receta). Si haces el control en una receta, significa que el Makefile puede contener otros objetivos que no necesitan esta afirmación en particular.

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

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

P.S. Si ejecutó su marca original con --warn-undefined-variables, puede tener alguna pista de por qué sus macros no se expandieron correctamente:

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