web-dev-qa-db-fra.com

Makefile If-Then Else and Loops

Quelqu'un peut-il expliquer comment utiliser les instructions if-then et les boucles for Makefiles? Je n'arrive pas à trouver de bonne documentation avec des exemples.

56
GavinR

Formulaires conditionnels

Simple

conditional-directive
text-if-true
endif

Modérément complexe

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

Plus complexe

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

Directives conditionnelles

Si la syntaxe est égale

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

Si la syntaxe n'est pas égale

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

Si la syntaxe est définie

ifdef variable-name

Si la syntaxe n'est pas définie

ifndef variable-name  

pour chaque fonction

syntaxe de la fonction foreach

$(foreach var, list, text)  

foreach Semantics
Pour chaque mot séparé par des espaces dans "liste", la variable nommée par "var" est définie sur ce mot et le texte est exécuté.

61
John Mulder

Voici un exemple si:

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

Notez que cela vient avec un mot d'avertissement que les différentes versions de Make ont une syntaxe légèrement différente, dont aucune ne semble très bien documentée.

16
Mark Roddy

Avez-vous essayé la documentation GNU make ? Il a une section entière sur les conditions avec des exemples.

8
Jeremy Ruten

Vous voyez souvent des boucles, mais elles ne sont généralement pas nécessaires. Voici un exemple de la façon dont on pourrait effectuer une boucle for sans avoir recours au Shell

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

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