automatic makefile rules

automatic - makefile $@



Makefile con multiples reglas compartiendo la misma receta (1)

Me gustaría saber si es posible escribir un Makefile con varias reglas, cada una definiendo sus propios requisitos previos y ejecutando todas ellas la misma receta sin duplicar la receta. Ejemplo:

TARGETS= file1 file2 file3 all: $(TARGETS) file1: dep1 dep2 file2: dep2 dep3 dep4 file3: dep2 dep1 cat $^ > $@

¡Gracias!


Sí, está escrito de una manera bastante obvia:

TARGETS= file1 file2 file3 all: $(TARGETS) file1: dep1 dep2 file2: dep2 dep3 dep4 file3: dep2 dep1 $(TARGETS): cat $^ > $@

UPD.

Solo para aclarar.

La regla de make genérica se ve así:

targets... : prerequisites... recipe ...

Cualquier parte de la regla puede ser omitida. Sin la receta, uno puede rellenar la lista de requisitos previos en cualquier lugar del archivo MAKE, un objetivo puede aparecer en el lado izquierdo de múltiples declaraciones de reglas.

Por ejemplo, lo siguiente es equivalente al ejemplo anterior (bueno, asumiendo que el Makefile está diseñado adecuadamente para que el orden de los requisitos previos no importe):

file1 file3 : dep1 file1 file2 file3 : dep2 file2 : dep3 dep4

A diferencia de los requisitos previos de la lista, puede haber como máximo una receta explícita para cada objetivo. Dentro de la receta puede usar variables automáticas para obtener el nombre del objetivo, la lista de requisitos previos, etc.

UPD. 2

Como @Calmarius menciona en los comentarios, esto no se aplica a las reglas de patrones , como %.txt: %.foo . Los patrones múltiples dentro de los objetivos significan que la regla produce todos estos objetivos a la vez .

Esta regla de patrón tiene dos objetivos:

%.tab.c %.tab.h: %.y bison -d $<

Esto indica que la receta bison -d xy hará tanto x.tab.c como x.tab.h Si el archivo foo depende de los archivos parse.tab.o y scan.o y el archivo scan.o depende del archivo parse.tab.h , cuando se cambie parse.y , la receta bison -d parse.y será ejecutado solo una vez, y se parse.tab.o los requisitos previos de parse.tab.o y scan.o

Sin embargo, uno puede definir múltiples requisitos previos en una regla de patrón (es decir, siempre que sus objetivos contengan un % raíz, de lo contrario sería una regla regular).