[gull] Makefile pour projet avec sous-dossiers

patrick jayet jayetp at student.ethz.ch
Fri May 6 11:53:02 CEST 2005


Bonjour à tous,

Petite question au sujet d'un Makefile pour un projet comprenant des
sous-dossiers. J'essaie de rédiger un makefile unique permettant d'aller
chercher les sources et object files dans un sous dossier.

Quelques extraits du Makefile:

  SUBDIRS = GRN
  # searchpath include folder GRN as well
  VPATH = GRN

La définition de VPATH permet d'inclure dans le chemin de recherche le
dossier GRN

  ### Build targets
  GRN_O = foo.o bar.o

  # $^ is the list of prerequisite
  all: $(GRN_O)
  	$(CC) $(FLAGS) $^ -o Devomorph

la variable automatique $^ permet de récupérer le nom de toutes les
dépendances de all (c-à-d foo.o et bar.o avec le chemin complet où ils
ont été trouvé)

  ### GRN
  # $< is the first file of the depends
  # $(<D) is the dir part corresponding to $<
  foo.o: foo.cpp foo.h
	$(CC) $(FLAGS) -c -o $(<D)/$@ $<

  bar.o: bar.cpp bar.h
	$(CC) $(FLAGS) -c -o $(<D)/$@ $<

la variable $@ récupère le nom de la cible (ex. foo.o) et la variable
$(<D) récupère le nom du dossier dans lequel a été trouvé le premier
fichier des dépendences (ex. foo.cpp). Le but de la directive
"-o $(<D)/$@" est de compiler l'objet foo.o directement dans le dossier
où foo.cpp a été trouvé.


Mon problème: lorsque je modifie un fichier source, p.ex. foo.cpp, après
qu'il soit compilé, au linkage, le nom du fichier s'affiche sans le
dossier, ce qui produit une erreur. Si je réexecute make, le linkage se
produit correctement. Exemple:

pat at minilab devomorph $ make
g++ -g -Wall -c -o GRN/foo.o GRN/foo.cpp
g++ -g -Wall foo.o GRN/bar.o -o Devomorph
g++: foo.o: No such file or directory
make: *** [all] Error 1

pat at minilab devomorph $ make
g++ -g -Wall GRN/foo.o GRN/bar.o -o Devomorph


La version de make est la 3.80, de gcc 3.3.5. L'arborescence de mon file
system serait dans ce cas:

- current dir
|- GRN
 |- foo.cpp
 |- foo.h
 |- bar.cpp
 |- bar.h
|- Makefile

Quelqu'un a-t'il une idée pourquoi le nom du fichier au linkage, si
celui-ci viens d'être compilé, ne comporte pas la mention du dossier,
tandis qu'à la 2e exécution de make, tout se passe normallement?

Bonne journée. ;-o

Pat



More information about the gull mailing list