Dans le makefile- :
mycommand || (echo "mycommand failed $$?"; exit 1)
Chaque ligne de l'action makefile invoque un nouveau shell - l'erreur doit être vérifiée dans la ligne d'action où la commande a échoué.
Si macommande échoue, la logique se branche sur l'instruction echo, puis quitte.
Si tout ce que vous voulez est pour le make
à abandonner si l'outil sort avec un état différent de zéro, make
le fera déjà par défaut.
Exemple Makefile
:
a: b
@echo making [email protected]
b:
@echo making [email protected]
@false
@echo already failed
.C'est ce qui se passe avec mon make
:
$ make
making b
make: *** [Makefile:6: b] Error 1
Assurez-vous que les cibles partiellement ou entièrement créées sont supprimées en cas d'échec. Par exemple, cela
a: b
@gena $+ > [email protected]
b:
@genb > [email protected]
est incorrect :si au premier essai, genb
échoue, il laissera probablement un b
incorrect , qui, au deuxième essai, make
supposera est correct. Vous devez donc faire quelque chose comme
a: b
@gena $+ > [email protected] || { rm [email protected]; exit 1; }
b:
@genb > [email protected]
Voici quelques autres approches :
shell
&.SHELLSTATUS
some_recipe:
@echo $(shell echo 'doing stuff'; exit 123)
@echo 'command exited with $(.SHELLSTATUS)'
@exit $(.SHELLSTATUS)
Sortie :
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:4: some_recipe] Error 123
Il a la mise en garde que le shell
la sortie de la commande n'est pas diffusée, vous vous retrouvez donc avec un vidage vers stdout lorsqu'il se termine.
$?
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123';\
EXIT_CODE=$$?;\
echo "command exited with $$EXIT_CODE";\
exit $$EXIT_CODE
Ou, un peu plus facile à lire :
.ONESHELL:
some_recipe:
@echo 'doing stuff'; sh -c 'exit 123'
@EXIT_CODE=$$?
@echo "command exited with $$EXIT_CODE"
@exit $$EXIT_CODE
Sortie :
$ make some_recipe
doing stuff
command exited with 123
make: *** [Makefile:2: some_recipe] Error 123
Il s'agit essentiellement d'une chaîne de commandes, exécutées dans le même shell.