2008-10-07 13 views
48

¿Alguien puede explicar cómo usar declaraciones if-then y para bucles en Makefiles? Parece que no puedo encontrar ninguna buena documentación con ejemplos.Makefile If-Then Else y Loops

+0

Agrego "con ejemplos simples". La documentación está bien, pero ¡hombre son los ejemplos abstractos! Para mí, esta sigue siendo una pregunta válida. – Quickredfox

Respuesta

51

las formas condicionales

simple

conditional-directive 
text-if-true 
endif 

de complejidad moderada

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

más complejo

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

directivas condicionales

si es igual Sintaxis

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

si no igual Sintaxis

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

Si sintaxis definida

ifdef variable-name 

Si no se define la sintaxis

ifndef variable-name 

foreach función

foreach FUNCTION

$(foreach var, list, text) 

Semántica foreach
Para cada palabra espacios en blanco se separó en "lista", la variable llamada por "var" se ponga en esa palabra y el texto se ejecuta.

13

He aquí un ejemplo si:

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

Tenga en cuenta que esto viene con una advertencia de que diferentes versiones de make tienen sintaxis ligeramente diferente, ninguno de los cuales parece estar documentado muy bien.

+1

¿'$ (OS)' es una variable de make GNU predefinida? Si es así, entonces quizás debería agregarlo [aquí] (http://stackoverflow.com/q/714100/912144). – Shahbaz

3

Puede ver bucles muchas veces, pero generalmente no son necesarios. Aquí hay un ejemplo de cómo se podría realizar un bucle for sin recurrir al shell

LIST_OF_THINGS_TO_DO = do_this do_that 
$(LIST_OF_THINGS_TO_DO): 
     run [email protected] > [email protected] 

SUBDIRS = snafu fubar 
$(SUBDIRS): 
    cd [email protected] && $(MAKE)