¿Qué significa el símbolo% en Makefile?

10

Estoy jugando con makefiles y me encontré con % .o o % .c . Por lo que entendí, especifica todos los archivos c o o . Pero por qué este trabajo:

%.o: %.c
        $(CC) -c $^  -o $@  

y esto no funciona

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

Ambas expresiones especifican todos los archivos. Entonces, ¿qué hace % .o: símbolo en el archivo make?

Mero
fuente

Respuestas:

9

Ambas expresiones especifican todos los archivos.

No, la primera regla dice makecómo obtener un .oarchivo dado el .carchivo correspondiente . Tenga en cuenta el singular: un solo archivo.

La segunda regla (dice) dice makecómo obtener un grupo de .oarchivos, dado otro grupo de .carchivos correspondientes . Tenga en cuenta el plural: todos los .carchivos resultantes del *.cglobbing.

En una nota al margen, %.o: %ces una extensión GNU.

En otra nota al margen, no aprenderá cómo usar makeStackOverflow. Deberías considerar leer un libro en su lugar.

Satō Katsura
fuente
11

El constructo:

%.o: %.c
        $(CC) -c $^  -o $@  

es una regla de patrón , que es un tipo de regla implícita. Especifica un objetivo y una dependencia, y provoca una invocación de $(CC)para cada objetivo. Mientras esto:

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

es una regla estándar pero tiene (posiblemente) muchos objetivos y muchas dependencias. Sin embargo, por todo eso, solo invocará $(CC)una vez.

Stephen Rauch
fuente