arrêt sur erreur lors de la cible de makefile règle est une fonction foreach
J'ai un fichier "makefile" qui définit plusieurs règles lorsque la cible est une fonction foreach.
$(foreach var,$(list), $($(var)_stuff) $($(var)_more_stuff)):
@echo Building $@ from $^...
$(CC) $(FLAGS) ...
Est-il possible de faire pour quitter lorsque vous rencontrez une erreur, sans passer par l'ensemble de la liste.
Ne serait pas
Pas quand il est fait de cette façon apparemment. Le forloop continue. Je ne suis pas sûr que ce format est encore une "RÈGLE". Mais il fonctionne
Je suis... ne sais pas quoi dire. Pourriez-vous nous donner un exemple complet minimal afin que nous puissions voir ce que
C'est incroyablement complexe, et doit être pas à la question. l' $(CC) compile un fichier avec des options étendu à partir de la foreach texte. Seulement lorsque l'un de ces compilations échoue, il continue sur. il ne s'arrêtera pas automatiquement je PENSE que, car il n'existe pas de liste des dépendances. Je suis à la recherche d'un moyen de le faire arrêter.
Qu'est-ce que cette première ligne censé faire? Vous attendez-vous la
make
sortie sur la première erreur, sauf si vous avez passé -k
option de ligne de commande?Pas quand il est fait de cette façon apparemment. Le forloop continue. Je ne suis pas sûr que ce format est encore une "RÈGLE". Mais il fonctionne
Je suis... ne sais pas quoi dire. Pourriez-vous nous donner un exemple complet minimal afin que nous puissions voir ce que
$($(var)_stuff)
est censé faire? Et peut-être expliquer ce genre d'erreur que vous envisagez?C'est incroyablement complexe, et doit être pas à la question. l' $(CC) compile un fichier avec des options étendu à partir de la foreach texte. Seulement lorsque l'un de ces compilations échoue, il continue sur. il ne s'arrêtera pas automatiquement je PENSE que, car il n'existe pas de liste des dépendances. Je suis à la recherche d'un moyen de le faire arrêter.
Qu'est-ce que cette première ligne censé faire? Vous attendez-vous la
foreach
déclaration pour l'agrandir dans une liste de cibles?OriginalL'auteur 8bitwide | 2012-06-29
Vous devez vous connecter pour publier un commentaire.
La
foreach
est complètement évalués et remplacé avant tout les règles sont exécutées. Ainsi, le comportement de cette doit être identique, comme si vous aviez codé en dur la règle sans l'aide de laforeach
. En d'autres termes, ce n'est pas directement pertinents pour le problème.Il y a seulement quelques explications possibles de ce que vous avez vu, pour la plupart décrites dans le manuel ici:
-k
ou--keep-going
-i
ou--ignore-errors
.IGNORE
cible-
Je vais essayer de créer un exemple plus simple que je peux poster le code complet.
Cool. Si vous créez un exemple plus simple, je serai heureux de mettre à jour ma réponse si je peux repérer quelque chose de nouveau.
OriginalL'auteur Oliver Charlesworth
Une solution de contournement consiste à "manuellement" invoquer
exit
en cas d'échec.Par exemple, supposons que nous avons un répertoire appelé
scripts
avec un certain nombre de scripts shell (avec des noms de fichiers qui se terminent par.sh
) que nous voulons exécuter.Alors une déclaration de variable comme ceci:
va nous donner une liste de ces scripts, et un objectif comme celui-ci:
va exécuter toutes ces scripts, mais comme vous le notez, la boucle foreach va continuer ou non l'un des scripts renvoie un code d'erreur. L'ajout d'un
|| exit
à la commande de la force de la sous-commande de sortie en cas d'erreur, qui Font ensuite traiter comme un échec.E. g.,
à faire ce que vous voulez (je crois).
Plus précisément, à l'aide de votre pseudo-code de l'exemple, je pense que vous voulez quelque chose comme ceci:
(où tout ce que j'ai changé, c'est d'emballer la
(CC) $(FLAGS) ...
peu dans les parenthèses et en ajoutant|| exit
à le faire échouer en cas d'erreur).OriginalL'auteur Rod
Pas sûr au sujet de votre exemple, mais peut-être que le problème est dans
;
- regarder Makefile : afficher et exécuter:produire:
Afin de faire vérifier le code de sortie uniquement pour la dernière commande:
echo utils
.OriginalL'auteur Oleg Mazko