it-swarm.dev

Makefile If-then Else y Loops

¿Puede alguien explicar cómo usar sentencias if-then y para bucles en Makefiles? Parece que no puedo encontrar ninguna buena documentación con ejemplos.

54
GavinR

Formas condicionales

Sencillo

conditional-directive
text-if-true
endif

Moderadamente complejo

conditional-directive
text-if-true
else
text-if-false
endif

Mas complejo

conditional-directive
text-if-one-is-true
else
conditional-directive
text-if-true
else
text-if-false
endif
endif

Directivas condicionales

Si la sintaxis es igual

ifeq (arg1, arg2)
ifeq 'arg1' 'arg2'
ifeq "arg1" "arg2"
ifeq "arg1" 'arg2'
ifeq 'arg1' "arg2"

Si no es igual la sintaxis

ifneq (arg1, arg2)
ifneq 'arg1' 'arg2'
ifneq "arg1" "arg2"
ifneq "arg1" 'arg2'
ifneq 'arg1' "arg2"

Si se define la sintaxis

ifdef variable-name

Si no se define sintaxis

ifndef variable-name  

Función Foreach

sintaxis de la función foreach

$(foreach var, list, text)  

foreach semantics
Para cada palabra separada por espacios en blanco en "lista", la variable nombrada por "var" se establece en esa palabra y se ejecuta el texto.

60
John Mulder

Aquí hay un ejemplo si:

ifeq ($(strip $(OS)),Linux)
        PYTHON = /usr/bin/python
        FIND = /usr/bin/find
endif

Tenga en cuenta que esto viene con una palabra de advertencia de que las diferentes versiones de Make tienen una sintaxis ligeramente diferente, ninguna de las cuales parece estar bien documentada.

16
Mark Roddy

¿Has probado el GNU hacer documentación ? Tiene toda una sección sobre condicionales con ejemplos.

8
Jeremy Ruten

Usted ve para los bucles muchas veces, pero generalmente no son necesarios. Aquí hay un ejemplo de cómo se podría realizar un bucle for sin tener que recurrir al Shell

LIST_OF_THINGS_TO_DO = do_this do_that 
$(LIST_OF_THINGS_TO_DO): 
       run $@ > $@.out

SUBDIRS = snafu fubar
$(SUBDIRS):
     cd $@ && $(MAKE)
4
Kramer