2010-12-01 6 views
1

J'ai un fichier de faire comme ceci ....... certains fichiers sont dans le répertoire principal et quelques autres dans le répertoire tests ..aide Makefile

VPATH = tests 

objects = main.o script.o factory.o serve.o enter.o\ 
      login.o notify.o check.o 
script : $(objects) 
    g++ $(objects) -lcurl -o script 

main.o : script.h 
script.o : enter.h login.h factory.h 
factory.o : check.h notify.h serve.h 
check.o : 
serve.o : check.h 
notify.o : 
enter.o : check.h 
login.o : check.h 

.PHONY : clean 
clean : 
    -rm *.o script 

je veux faire à enregistrer les fichiers d'objet dans le répertoire d'où vient son fichier cpp .. ie si script.cpp était dans le dossier des tests, alors je veux que le script.o soit également dans le dossier des tests .. maintenant il enregistre simplement le fichier dans le dossier principal ..

Merci à l'avance ..

EDIT 1: Je dois ajouter fichiers lateron dans le dossier de tests .. est-il un moyen de rendre le makefile reconnaître que de nouveaux fichiers ont été ajoutés et de les compiler aussi?

+0

L'utilisation de VPATH est-elle essentielle pour vous? Si vous préférez explicitement les tests/aux noms de fichiers d'objets appropriés, les choses devraient simplement fonctionner. – wolfgang

Répondre

2

Au lieu de coder en dur une liste de fichiers à build, vous pouvez utiliser un caractère générique pour trouver les fichiers source. Vous pouvez également utiliser une substitution pour convertir cela en une liste de fichiers objets. Fournissez une règle générique pour créer un fichier .c dans un fichier .o et vous devriez tous être définis.

FILES_TO_BUILD := $(wildcard *.c) $(wildcard tests\*.c) 
OBJECTS_FILES := $(patsubst %.c,%.o,$(FILES_TO_BUILD)) 

%.o: %.c 
    $(CC) $(COPTS) $^ # or whatever your compiler line is 

script: $(OBJECT_FILES) 
    g++ $^ -lcurl -o [email protected] 

Je ne l'ai pas testé ce makefile (il est juste à côté du haut de ma tête), mais il devrait vous donner quelque chose pour commencer.

+0

Accordé, ce makefile ne tient pas compte des dépendances du fichier d'en-tête. Étant donné le petit nombre de fichiers dans le projet exemple, il est probablement plus facile d'utiliser 'HEADERS: = $ (wildcard * .h)' pour localiser tous les fichiers d'en-tête et d'utiliser '% .o:% .c $ (HEADERS)' pour votre cible générique pour que tout dépende de tout le reste. Vous devrez tout reconstruire si quelque chose change, mais avec seulement 14 fichiers, une reconstruction complète ne devrait pas être trop mauvaise. Si vous aviez un projet plus important, vous voudriez probablement une solution plus efficace. – bta

+0

c'était wat je cherchais ... –

0

Vous pouvez ajouter quelque chose comme

mv *.d $(VPATH)/ 

dans votre makefile, être quelque chose comme:

... 
script : $(objects) 
    g++ $(objects) -lcurl -o script 
    mv *.d $(VPATH)/ 
...

Vous devrez peut-être ajouter @ devant mv, "@ mv ... "