2009-12-26 3 views
14

Je veux écrire un makefile (gmake) pour un compilateur qui, contrairement à gcc, place tous les fichiers de sortie dans un répertoire spécifique. Malheureusement, ce comportement ne peut pas être modifié.Makefile, Pattern-Rules et Annuaires

Mes sources sont dans plusieurs répertoires. Comment écrire une règle-modèle qui me permet de compiler les sources.

D'accord, c'est un peu flou. Voici un exemple. Mes sources ressemblent peut, comme ceci:

./folder1/foo.c 
./folder2/bar.c 

et les fichiers de sortie finiras comme ceci:

./obj/foo.obj 
./obj/bar.obj 

Comment ma règle de compiler mes sources ressemblent?

%.obj : %.c 
    $(COMPILER) -c $< 

ne fonctionnera pas.

Des idées? Je voudrais éviter une règle implicite pour chaque fichier source ...

+0

Vous pouvez utiliser le 'VPATH' pour cela = ou = vous pouvez créer' folder1/Makefile' et 'obj/Makefile' qui incluront ../ Makefile.inc, qui devrait contenir les règles communes (par ex. celui que vous avez donné). –

Répondre

23

Extrait de certains de mes Makefile:

OBJS := $(sort $(patsubst %.cpp,$(OBJECT_DIRECTORY)/%.o,$(patsubst %.c,$(OBJECT_DIRECTORY)/%.o,$(notdir $(SRCS)))))

OBJECT_DIRECTORY des points dans le répertoire d'objets et SRCS est la liste des sources fichiers (que vous pouvez même remplir en utilisant $(wildcard)).

Ensuite, dans le Makefile, j'ai:

define define_compile_rules 
$(OBJECT_DIRECTORY)/%.o: $(1)%.c 
    @echo " + Compiling '$$<'" 
    @mkdir -p $$(@D) 
    $(CC) $$(CFLAGS) -o [email protected] -c $$< 
endef 

$(foreach directory,$(sort $(dir $(SRCS))),$(eval $(call define_compile_rules,$(directory)))) 

Voir the $(eval) function.

+1

Les fonctions eval et foreach sont une fonctionnalité gravement sous-utilisée de gmake. – JesperE

+0

peut-être c'est à cause de bugs avant GNU Make 3.81? –

+0

semble bon. Je vais essayer ... –