OVH Cloud OVH Cloud

Makefile

4 réponses
Avatar
daniel
Bonjour,

J'ai un petit probl=E8me de comprehension avec le make et Makefile.
all: hello
hello: hello.o main.o OK.o
$(CC) -o hello hello.o main.o
hello.o:
$(CC) -o hello.o -c hello.c
main.o:
$(CC) -o main.o -c main.c

tous se passe bien j'ai:

gcc -o hello.o -c hello.c
gcc -o main.o -c main.c
gcc -o hello hello.o main.o

maintetnant j'ajoute des dependances pour hello.o

all: hello
hello: hello.o main.o
$(CC) -o hello hello.o main.o
hello.o: hello.c hello.h
$(CC) -o hello.o -c hello.c
main.o:
$(CC) -o main.o -c main.c

j'ai le resultat:
make: *** Pas de r=E8gle pour fabriquer la cible `hello.c', n=E9cessaire =

pour `hello.o'. Arr=EAt.

Comment faire ? je pensais qu'il fallait mettre les dependances pour les =

analyses de fichiers modifi=E9s ?

Merci

Daniel

4 réponses

Avatar
no_spam
On Fri, 27 Aug 2004 17:38:43 +0200, daniel wrote:

Bonjour,

J'ai un petit problème de comprehension avec le make et Makefile.
all: hello
hello: hello.o main.o OK.o
$(CC) -o hello hello.o main.o
hello.o:
$(CC) -o hello.o -c hello.c
main.o:
$(CC) -o main.o -c main.c

tous se passe bien j'ai:

gcc -o hello.o -c hello.c
gcc -o main.o -c main.c
gcc -o hello hello.o main.o

maintetnant j'ajoute des dependances pour hello.o

all: hello
hello: hello.o main.o
$(CC) -o hello hello.o main.o
hello.o: hello.c hello.h
$(CC) -o hello.o -c hello.c
main.o:
$(CC) -o main.o -c main.c

j'ai le resultat:
make: *** Pas de règle pour fabriquer la cible `hello.c', nécessaire
pour `hello.o'. Arrêt.

Comment faire ? je pensais qu'il fallait mettre les dependances pour les
analyses de fichiers modifiés ?


Effectivement.
En général, on met plutôt des règles génériques du style:
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<

Et on rajoute des dépendances spécifiques, dans ton cas:
hello.o: hello.h
Ou, encore mieux, on fait générer les dépendances par gcc avec les
options -M dans des fichiers de type .d et on rajoute dans le Makefile:
-include *.d
Le '-' en début de ligne évite d'avoir des erreurs à la première
exécution puisque les fichiers de dépendance n'ont pas encore été créés.

Enfin, tu devrais rajouter une dépendance:
.PHONY: all
puisque la règle all ne correspond à aucun fichier généré.
Ce n'est pas obligatoire, c'est juste plus propre et cohérent.


Mais tout ceci n'a rien de spécifique à Linux et n'a aucun rapport avec
la configuration du système...

Avatar
Nicolas George
no_spam wrote in message :
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<


Attention, cette forme de règle générique est une extension GNU. Il n'y a
rien de mal à s'en servir, mais il convient d'en être conscient.

Avatar
no_spam
On Fri, 27 Aug 2004 23:22:59 +0000, Nicolas George wrote:

no_spam wrote in message :
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<


Attention, cette forme de règle générique est une extension GNU. Il n'y a
rien de mal à s'en servir, mais il convient d'en être conscient.


Oui, l'autre forme est:
.c.o:
$(CC) $(CFLAGS) -c -o $@ $<
mais je la trouve peu logique et il me semble qu'elle prête à confusion.
Toujours à propos de l'extension GNU, il semble y avoir des bugs dans
l'implémentation. J'ai déjà essayé de faire des règles du genre:
%: $(%_OBJS)

Pour compiler un programme à partir d'une variable contenant la liste de
ces objets. D'après la doc, ça devrait pouvoir marcher, dans les faits,
il faut générer au vol un bout de Makefile qu'on inclut dans le Makefile
principal. Il y a d'autres exemples de "stems" qui ne marchent pas et
nécesssitent des includes, je ne me souviens plus des exemples précis
(mais ce sont des formes qui sont documentés comme devant marcher).
Enfin, il faut se méfier particulièrement de make 3.79 de la RedHat qui
est buggé et ne reconnait pas un certain nombre de constructions.


Avatar
daniel
no_spam wrote:
On Fri, 27 Aug 2004 23:22:59 +0000, Nicolas George wrote:


no_spam wrote in message :

%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<


Attention, cette forme de règle générique est une extension GNU. Il n'y a
rien de mal à s'en servir, mais il convient d'en être conscient.



Oui, l'autre forme est:
.c.o:
$(CC) $(CFLAGS) -c -o $@ $<
mais je la trouve peu logique et il me semble qu'elle prête à confu sion.
Toujours à propos de l'extension GNU, il semble y avoir des bugs dans
l'implémentation. J'ai déjà essayé de faire des règles du gen re:
%: $(%_OBJS)

Pour compiler un programme à partir d'une variable contenant la liste de
ces objets. D'après la doc, ça devrait pouvoir marcher, dans les fa its,
il faut générer au vol un bout de Makefile qu'on inclut dans le Mak efile
principal. Il y a d'autres exemples de "stems" qui ne marchent pas et
nécesssitent des includes, je ne me souviens plus des exemples préc is
(mais ce sont des formes qui sont documentés comme devant marcher).
Enfin, il faut se méfier particulièrement de make 3.79 de la RedHat qui
est buggé et ne reconnait pas un certain nombre de constructions.

Merci pour vos reponses,


J'ai en effet la version 3.79.1 mandrake.

Daniel