Makefile GNU: plusieurs sorties à partir d'une seule règle + empêcher la suppression des fichiers intermédiaires
C'est une sorte de continuation de la question de ici. Le problème est qu'il y a une règle de générer plusieurs sorties à partir d'une seule entrée, et la commande est consommatrice de temps, donc nous préférons éviter de recalcul. Maintenant, il ya un supplément de torsion, que nous tenons à conserver des fichiers supprimés comme les fichiers intermédiaires, et les règles comportent des caractères génériques pour accepter les paramètres.
La solution suggérée est que nous avons mis en place la règle suivante:
file-a.out: program file.in
./program file.in file-a.out file-b.out file-c.out
file-b.out: file-a.out
@
file-c.out: file-b.out
@
Puis, appelant make file-c.out
crée à la fois et nous éviter des problèmes avec l'exécution de la make
en parallèle avec -j
commutateur. Tout va bien jusqu'à présent.
Le problème est le suivant. Parce que la solution ci-dessus met en place une chaîne du groupe, make
considère différemment; les fichiers file-a.out
et file-b.out
sont traités comme des fichiers intermédiaires, et ils par défaut supprimé comme inutile dès que file-c.out
est prêt.
Un moyen d'éviter ce qui a été mentionné quelque part ici, et consiste en l'ajout d' file-a.out
et file-b.out
comme des dépendances d'une cible .SECONDARY
ce qui les empêche d'être supprimé. Malheureusement, cela ne résout pas mon cas car mes règles, utilisez les caractères génériques des modèles; plus précisément, mes règles ressembler à ceci:
file-a-%.out: program file.in
./program $* file.in file-a-$*.out file-b-$*.out file-c-$*.out
file-b-%.out: file-a-%.out
@
file-c-%.out: file-b-%.out
@
de sorte que l'on peut passer un paramètre qui est inclus dans le nom de fichier, par exemple en exécutant
make file-c-12.out
La solution que make
suggère la documentation est d'ajouter ces règles implicites à la liste des dépendances de .PRECIOUS
par conséquent, de garder ces fichiers soient supprimés.
La solution avec .PRECIOUS
fonctionne, mais il empêche également que ces fichiers soient supprimés lors d'un échec de la règle et les fichiers sont incomplets. Est-il un autre moyen de faire ce travail?
Un hack pour résoudre ce problème est de définir une cible .SECONDARY
avec pas de pré-requis, c'est à dire,
.SECONDARY:
qui informe make
que tous les fichiers doivent être traités comme secondaire et n'est donc pas retiré, sauf lorsque make
est interrompu ou d'un échec de la règle. Malheureusement, cela ne permet pas de sélectionner un sous-ensemble de règles avec des caractères génériques pour travailler de cette façon, donc, je considère qu'un hack (même si c'est utile).
source d'informationauteur makesaurus
Vous devez vous connecter pour publier un commentaire.
La Chose La Plus Simple
permettra de faire exactement ce que vous voulez.
(Modèle de règles avec plusieurs cibles sont différentes de la règle normale avec plusieurs cibles que vous posiez des questions sur ici. Voir les bisons exemple dans le de le faire manuellement.)
Si, au lieu d'un seul fichier.dans, vos sorties ont été générées à partir d'une condition préalable fichier inclus la tige, c'est à dire
vous pouvez ensuite créer une liste de toutes les cibles possibles correspond à:
De même, si la tige est livré à partir d'un ensemble fini:
Puis il suffit d'ajouter ces prereqs à l' .Cible SECONDAIRE