2017-10-14 9 views
0

Si vous lisez la section Catalog of Rules du Manuel GNU Make, il se trouve que l'un des suffixes qu'il reconnaît est .out et il y a une règle intégrée:Pourquoi GNU Make a-t-il une règle par défaut pour créer file.out à partir du fichier?

%.out: % 
# commands to execute (built-in): 
    @rm -f [email protected] 
    cp $< [email protected] 

Cela signifie que si vous avez un fichier xyz dans un répertoire, vous pouvez créer xyz.out en tapant simplement make xyz.out.

Ma question est (deux variantes de la même question):

  • Qui profite de cette règle?
  • Dans quelles circonstances cela est-il utilisé par les gens?

De toute évidence, je demande parce que je réussi à courir faute de la règle. J'ai eu quelques règles comme:

test.01: ${PROGRAM} ${DRIVER} test.01.tst test.01.out ${DATA.01} 
    ${DRIVER} ${D_FLAGS} [email protected] 

où le nom test.01 est une cible fausse, mais l'une des dépendances est test.01.out. Lors de l'exécution active (ne pas utiliser make -n, qui fonctionne très bien), cela me donne beaucoup d'erreurs comme:

make[1]: Circular test.01 <- test.01.out dependency dropped. 

J'ai aussi essayé laisser tomber le suffixe .out avec:

.SUFFIXES: 
.SUFFIXES: .sh 

et qui ne semble pas pour neutraliser la règle .out comme je m'y attendais. Est-ce une fonctionnalité attendue de GNU Make?

Je suppose que je vais devoir contourner ce bug caractéristique de GNU Make en changeant mon suffixe .req ou quelque chose de similaire, mais il est une nuisance et je reste perplexe quant à la raison pour laquelle la règle est .out partie de l'ensemble de règles GNU Make standard.

Répondre

1

Je ne connais pas la réponse à vos questions sur l'utilisation de cette règle. Tout ce que je peux dire c'est que cette règle existait déjà quand GNU make a été vérifiée pour la première fois dans le contrôle de la source, en janvier 1992. Elle n'est mentionnée dans aucun ChangeLog donc probablement elle remonte aux toutes premières versions. La règle actuelle est définie comme une règle de modèle. Par conséquent, la modification de .SUFFIXES n'aidera pas. Pour vous en débarrasser, vous pouvez utiliser:

%.out : % 

(aucune recette) qui supprimera la règle de motif.

+0

Merci. Donc, la réponse (s'il y en a une) est perdue dans la nuit des temps - J'aimerais pouvoir dire que je suis surpris, mais je ne le suis pas. Les informations sur la façon de supprimer la règle de motif sont utiles. Merci pour ça. La confirmation que futzing avec '.SUFFIXES' n'aidera pas à supprimer les règles de pattern est également utile. (Et je suppose, par déduction, que vous n'utilisez pas vous-même la règle pour créer des fichiers - pas de surprise là non plus!) –

+0

Personnellement, je n'utilise pas de règles intégrées dans mes makefiles. Dans mon expérience, ils ne sont utiles que pour les environnements les plus simples. En général, je trouve toujours que j'ai besoin de redéfinir les modèles de compilation pour ajouter de nouvelles variables, et que les autres perdent du temps. Ainsi, mes makefiles contiennent généralement des strophes pour supprimer toutes les règles intégrées. – MadScientist

+1

Si vous voulez connaître la raison de '.out' vous auriez à demander soit Roland McGrath ou RMS :) – MadScientist