[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