Sujet : Re: Make écrase mes fichiers !
De : alain (at) *nospam* universite-de-strasbourg.fr.invalid (Alain Ketterlin)
Groupes : fr.comp.os.unixDate : 17. Oct 2021, 15:14:23
Autres entêtes
Organisation : Université de Strasbourg
Message-ID : <87sfwz68n4.fsf@universite-de-strasbourg.fr.invalid>
References : 1 2
User-Agent : Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)
Je réponds ici à (l'autre message de) Olivier pour garder un peu de
contexte.
Olivier Miakinen <om+
news@miakinen.net> writes:
# --------
name: name.tab.o name.o
name.tab.c: name.y
bison name.y
# --------
Bon, déjà on pourrait argüer que ce n'est pas une bonne idée d'avoir
deux fichiers sources qui ne diffèrent que par une extension connue
de make. Mais voyons plus loin.
On pourrait, mais d'une part c'est un projet où j'ai plusieurs sources
yacc/bison et je suis allé au plus simple, d'autre part la règle make
"%.y: %.c" est contraire aux conventions de yacc (qui produit par défaut
y.tab.c) ou de bison (qui produit %.tab.c). D'où ma surprise.
[...]
| yacc name.y
| mv -f y.tab.c name.c
| cc -c -o name.o name.c
| bison name.y
| ...
>
Donc oui, c'est clairement une règle implicite pour faire un fichier .c
à partir d'un fichier .y -- implicite puisque dans ton makefile tu ne
définis qu'une règle avec bison et aucune avec yacc.
>
Si tu veux conserver name.y et name.c comme deux fichiers *sources*
indépendants, alors je vois ceci :
>
man make
...
-r, --no-builtin-rules
Eliminate use of the built-in implicit rules. Also clear
out the default list of suffixes for suffix rules.
...
Ben oui, mais les règles implicites pour C sont bien pratiques (avec
CFLAGS etc.) J'ai finalement changé mes conventions de nommage.
Je me demande si on ne pourrait pas imaginer une contrainte qui
empêcherait make d'utiliser une règle implicite quand les prérequis sont
mentionnés explicitement dans une règle avec une commande... Bref.
(Au passage, j'ai été piégé par une autre règle implicite, parce que
j'avais la règle suivante :
name.lex.c: name.lex
flex -o $@ $<
mais là make m'indique une circularité, à cause de sa règle "%: %.c". Ma
cible s'appelle maintenant name.dfa.c.)
Merci en tout cas pour ta réponse.
-- Alain.