2009-12-26 12 views
14

Quiero escribir un archivo make (gmake) para un compilador que, a diferencia de gcc, coloca todos los archivos de salida en un directorio específico. Lamentablemente, este comportamiento no se puede cambiar.Makefile, Pattern-Rules y Directories

Mis fuentes se encuentran en varios directorios. ¿Cómo escribo una regla de patrones que me permite compilar las fuentes?

Bien, eso es un poco confuso. Aquí hay un ejemplo. Mis fuentes miran pueden desea:

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

y los archivos de salida va a terminar de esta manera:

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

¿Cómo debe mi regla para compilar mis fuentes parecen?

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

no funcionará.

¿Alguna idea? Me gustaría evitar una regla implícita para cada archivo de origen ...

+0

Puede usar 'VPATH' para ese = o = puede crear' folder1/Makefile' y 'obj/Makefile' que' include ../ Makefile.inc', que debe contener las reglas comunes (ej. uno que has dado). –

Respuesta

23

extraído de alguna Makefile mío:

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

Dónde OBJECT_DIRECTORY puntos a la lista de objetos y SRCS es la lista de fuente archivos (que puedes llenar incluso usando $(wildcard)).

Luego, en el Makefile, que tienen:

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)))) 

Ver the $(eval) function.

+1

Las funciones eval y foreach son una característica severamente infrautilizada de gmake. – JesperE

+0

tal vez es debido a errores anteriores a GNU Make 3.81? –

+0

se ve bien. Voy a intentarlo ... –