makefile
Reglas de patrón de GNU
Buscar..
Regla de patrón básico
Una regla de patrón se indica mediante un único carácter %
en el objetivo. El %
coincide con una cadena no vacía llamada raíz . El vástago se sustituye por cada %
que aparece en la lista de requisitos previos.
Por ejemplo, esta regla:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Coincidirá con cualquier objetivo que termine en .o
. Si el objetivo era foo.o
, el vástago sería foo
y compilaría foo.c
a foo.o
Se puede acceder a los objetivos y requisitos previos mediante variables automáticas.
Objetivos que coinciden con múltiples reglas de patrón
Si un objetivo coincide con varias reglas de patrón, make utilizará aquella cuyos requisitos previos existen o se pueden crear. Por ejemplo:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.s
$(AS) $(ASFLAGS) $< -o $@
Compilará foo.c
a foo.o
o ensamblará foo.s
a foo.o
, dependiendo de cuál de foo.c
o foo.s
exista.
Si varias reglas tienen requisitos previos que existen o se pueden crear, make utilizará la regla que coincida con la raíz más corta. Por ejemplo:
f%r:
@echo Stem is: $*
fo%r:
@echo Stem is: $*
Utilizará la segunda regla para hacer que el foo.bar
objetivo, haciendo eco del Stem is: o.ba
Si varias reglas coinciden con la raíz más corta, make utilizará la primera en Makefile.
Directorios en reglas de patrón
Si el patrón de destino no contiene barras diagonales, make eliminará la parte del directorio del objetivo que está tratando de construir antes de hacer coincidir. El directorio se colocará delante del vástago. Cuando se usa el vástago para crear el nombre de destino y los requisitos previos, la parte del directorio se elimina de él, el vástago se sustituye en lugar del %
y, finalmente, el directorio se coloca delante de la cadena. Por ejemplo:
foo%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
lib/foobar.o
con lib/foobar.o
, con:
- Tallo (
$*
):lib/bar
- Nombre de destino (
$@
):lib/foobar.o
- Prerrequisitos (
$<
,$^
):lib/foobar.c
En este ejemplo, una regla lib/foo%.o
tendría prioridad sobre la regla foo%.o
porque coincide con una raíz más corta.
Reglas de patrón con múltiples objetivos
Las reglas de patrón pueden tener múltiples objetivos pero, a diferencia de las reglas normales, la receta es responsable de hacer todos los objetivos. Por ejemplo:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS_DEBUG) -c $< -o debug/$*.o
$(CC) $(CFLAGS_RELEASE) -c $< -o release/$*.o
Es una regla válida, que construirá objetos tanto de depuración como de liberación cuando uno de ellos deba construirse. Si escribimos algo como:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Funcionaría cuando solo se debug/*.o
uno de debug/*.o
o release/*.o
, pero solo generaría el primer objetivo (y consideraría que el segundo está actualizado) cuando ambos deben construirse.