2011-02-26 26 views
6

supongo que esto tiene sentido alguna manera, pero no puedo entender por qué: En el siguiente código, consigo ambos advertencias (Tenga en cuenta que el código original fue una sangría con fichas):variables definidas * y * indefinidos

define variable-definition 
    ifndef $1 
     $(warning $1 is undefined) 
    else 
     $(warning $1 is defined) 
    endif 
endef 

PD: Quiero comprobar si existe la variable con el nombre pasado como $1, no si se pasó $1.

PPS: La dedentificación de todo no ayuda.

Respuesta

9

de Beta de la causa raíz es correcta, usted no está escapando sus $ en los $(warning) llamadas. Así es como lo arreglaría:

define variable-def 
    ifndef $1 
    $$(warning $1 is undefined) 
    else 
    $$(warning $1 is defined) 
    endif 
endef 
FOO=bar 
$(eval $(call variable-def,FOO)) 

Tenga en cuenta que estoy sangrando con espacios, no pestañas. Si aplica sangría con pestañas, obtendrá este error: *** commands commence before first target. Stop.

Esto usa GNUisms, pero también lo hace su muestra (creo).

+1

+1. Escapando de las advertencias ... Oh, eso es bueno. [* rechina los dientes *] – Beta

1

La razón por la que le da ambas advertencias es que cuando llama a esta función (es decir, expande esta variable), Make expande las variables dentro de ella, incluyendo ambas advertencias. Esto sucede antes si intenta evaluar el ifndef (y probablemente falle). Simplemente no maneja condicionales de la forma que desee.

Aquí hay una manera de hacerlo, ligeramente torpe, pero efectivo. (Para hacerlo sin problemas como una función probablemente requeriría una cantidad considerable de magia negra). Escribir un makefile separado llamado variable-definition:

# In makefile variable-definition 

ifndef $(FOO) 
$(warning $(FOO) is undefined) 
else 
$(warning $(FOO) is defined) 
endif 

Luego, en el makefile principal:

análisis
# In the main makefile 

bar = something 
FOO := bar 

include variable-definition 

FOO := baz 

include variable-definition 
+1

No diría una cantidad "considerable" - ver mi respuesta. –

+2

@Jack Kelly: Una vez más me has derrotado, pero nos encontraremos de nuevo, y la venganza será mía. – Beta

Cuestiones relacionadas