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.
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!) –
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
Si vous voulez connaître la raison de '.out' vous auriez à demander soit Roland McGrath ou RMS :) – MadScientist