Bonne méthode pour générique cibles dans GNU Make

Je suis en train d'écrire un Makefile avec ma source et les fichiers objets séparés et je n'arrive pas à trouver le bon moyen pour y parvenir. J'ai deux méthodes de travail, mais je suis en espérant que quelqu'un peut le point la "bonne" façon de le faire est.

Mon projet est séparé en un src et obj dossier avec le Makefile au même niveau que ces.

La première méthode utilise le caractère générique de la fonction pour trouver les fichiers source dans src utilise ensuite le texte de remplacement afin de déterminer l'objet correspondant fichiers.

SRC = $(wildcard src/*.cpp)
OBJ = $(SRC:.cpp=.o)

prog: $(OBJ)
       $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o prog $(patsubst src/,obj/,$(OBJ))

%.o: %.cpp
     $(CC) $(CFLAGS) -c $< -o $(COMPILE)/$(@F)  

Cela semble fonctionner, cependant, chaque fois que je lance make prog il recompile tous les fichiers de l'objet. Le OBJ variable doit avoir le src/ en face de tous les objets ou autre chose-je obtenir le "pas de règle pour faire de cible". Sur le côté positif, je peux facilement utiliser la patsubst dans le prog cible pour spécifier des fichiers de l'objet.

La deuxième méthode est similaire, mais utilise vpaths et de remplacement de texte sur la OBJ variable:

 vpath = %.cpp src
 vpath = %.o obj

 SRC = $(wildcard src/*.cpp)
 OBJ = $(subst src/,,$(SRC:.cpp=.o))
 POBJ = $(patsubst src/,obj/$(SRC:.cpp=.o))

 prog: $(OBJ)
       $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o prog $(POBJ)

 %.o: %.cpp
     $(CC) $(CFLAGS) -c $< -o $(COMPILE)/$(@F)  

Ceci élimine la recompilation des fichiers de l'objet, mais m'oblige à ajouter une autre variable POJB pour la prog cible (puisque je ne peux pas faire tout patsubst sur des fichiers de l'objet sans basedir).

Les deux méthodes de travail et chacun a ses avantages par rapport à l'autre, mais dont l'une est la "bonne" approche et si aucun des deux, quelle est la bonne façon de parvenir à ce type de bâtiment?

InformationsquelleAutor nhmood | 2012-12-25