217 votes

Comment abandonner makefile si la variable n'est pas définie ?

Comment puis-je abandonner une exécution make/makefile basée sur une variable makefile qui n'est pas définie/valorisée ?

J'ai trouvé cela, mais cela ne fonctionne que si l'appelant n'exécute pas explicitement une cible (c'est-à-dire qu'il exécute make seulement).

ifeq ($(MY_FLAG),)
abort:   ## This MUST be the first target :( ugly
    @echo Variable MY_FLAG not set && false
endif

all:
    @echo MY_FLAG=$(MY_FLAG)

Je pense que quelque chose comme ça serait une bonne idée, mais n'a rien trouvé dans le manuel de make :

ifndef MY_FLAG
.ABORT
endif

56voto

Messa Points 5988

Utilisez la fonction shell test :

foo:
    test $(something)

Utilisation :

$ make foo
test 
Makefile:2: recipe for target 'foo' failed
make: *** [foo] Error 1
$ make foo something=x
test x

19voto

raittes Points 2947

Vous pouvez utiliser un FI pour tester :

check:
        @[ "${var}" ] || ( echo ">> var is not set"; exit 1 )

Résultat :

$ make check
>> var is not set
Makefile:2: recipe for target 'check' failed
make: *** [check] Error 1

9voto

bsimpson53 Points 103

Pour plus de simplicité et de brièveté :

$ cat Makefile
check-%:
        @: $(if $(value $*),,$(error $* is undefined))

bar:| check-foo
        echo "foo is $$foo"

Avec sorties :

$ make bar
Makefile:2: *** foo is undefined. Stop.
$ make bar foo="something"
echo "foo is $$foo"
foo is something

8voto

kesselborn Points 158

Utilisez la gestion des erreurs shell pour les variables non définies (notez le double $) :

$ cat Makefile
foo:
        echo "something is set to $${something:?}"

$ make foo
echo "something is set to ${something:?}"
/bin/sh: something: parameter null or not set
make: *** [foo] Error 127


$ make foo something=x
echo "something is set to ${something:?}"
something is set to x

Si vous avez besoin d'un message d'erreur personnalisé, ajoutez-le après le ? :

$ cat Makefile
hello:
        echo "hello $${name:?please tell me who you are via \$$name}"

$ make hello
echo "hello ${name:?please tell me who you are via \$name}"
/bin/sh: name: please tell me who you are via $name
make: *** [hello] Error 127

$ make hello name=jesus
echo "hello ${name:?please tell me who you are via \$name}"
hello jesus

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X