2012-08-16 17 views
9

El siguiente es un archivo MAKE muy simple que no parece funcionar correctamente.Makefile ifeq: ¿cuándo se evalúan?

TEST=ON 

buildbegin: 
ifeq ($(TEST),ON)   
    @echo TEST PASSED 
else 
    @echo TEST FAILED 
endif 

No importa a qué establezca la variable TEST, mi sentencia ifeq es aprobada. Siempre veo TEST PASSED. ¿Alguien ve lo que estoy haciendo mal aquí?

EDITAR:

ok. mi ejemplo no era exactamente exacto. Lo que realmente tengo es la siguiente:

SHELL = /bin/sh 

DEFAULT_TARGS:= all all_debug 
DEBUG_TARGS:= all_debug 
ALL_TARGS:= $(DEFAULT_TARGS) $(DEBUG_TARGS) 

.PHONY: $(ALL_TARGS) 
.PHONY: buildbegin 

$(ALL_TARGS): buildbegin 

TEST=ON 

$(DEBUG_TARGS): TEST=OFF 

buildbegin: 
    @echo $(TEST) 
ifeq ($(TEST),ON) 
    @echo PASSED 
else 
    @echo FAILED 
endif 

Correr o bien hacer todo o hacer all_debug dará lugar a "pasado" que se está imprimiendo. Si echo $ (PRUEBA) antes de la condición, parece que mis reglas están cambiando la variable, pero el ifeq solo ve el valor predeterminado.

+0

funciona para mí -. 'GNU Make 3.82' – plaes

+0

hmmm tengo 3,81 – kalden

+0

trabaja aquí también -.. GNU 3,81 – Thor

Respuesta

24

make evalúa condicionales cuando lee un archivo MAKE (como usted sabe, usa 2 pases), consulte: Conditional Parts of Makefiles. Simplemente puede comprobar esto mediante el uso de advertencia (que es bueno para los archivos make debug): Comandos

buildbegin: 
    @echo $(TEST) 
$(warning now we reached ifeq TEST=$(TEST)) 
ifeq ($(TEST),ON) 
    @echo PASSED 
else 
    @echo FAILED 
endif 

Debe utilizar la cáscara en su lugar e incluirlos en regla:

buildbegin: 
     @if [ "$(TEST)" = "ON" ]; then echo "PASSED"; else echo "FAILED"; fi 
+2

gracias. esto explica todo – kalden

+1

@ user1604180 ¡Bienvenido a SO! Si esta respuesta es la correcta (y definitivamente lo es), debe [aceptar] (http://stackoverflow.com/faq#howtoask). –

+0

¿No debería escaparse el '$' en '$ TEST'? Es decir, '$$ TEST' ... – kralyk

3

Aquí es un limpiador (Creo que, de todos modos) manera de hacer lo que quiera:

all: 
    $(MAKE) TEST=ON buildbegin 

all_debug: 
    $(MAKE) TEST=OFF buildbegin 

buildbegin: 
    @echo $(TEST) 
ifeq ($(TEST),ON) 
    @echo PASSED 
else 
    @echo FAILED 
endif 
+0

@pmod Sub-make hereda el entorno de la matriz padre, por lo que no es necesario replicar las variables explícitamente. –

+0

Tienes razón ... – pmod

1

Parametrizar el comando shell mediante hacen variables. Esto evita hacer recursivo e incluso la concha (que se bifurcará el comando directamente y no ir a través de una concha si el comando no contiene metacaracteres de shell (<>" &; y similares))

Algo así como:.

result<ON> := PASSED 
result<OFF> := FAILED 

buildbegin: 
    @echo ${result-<${TEST}>} 

El <...> es simplemente una convención para indicar algún tipo de indirección

Cuestiones relacionadas