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 .SECONDARYce 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 .PRECIOUSpar 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