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á tantox.tab.c
comox.tab.h
Si el archivo foo depende de los archivosparse.tab.o
yscan.o
y el archivo scan.o depende del archivoparse.tab.h
, cuando se cambieparse.y
, la recetabison -d parse.y
será ejecutado solo una vez, y separse.tab.o
los requisitos previos deparse.tab.o
yscan.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).