Que signifie le symbole% dans Makefile

11

Je joue avec des makefiles et je suis tombé sur % .o ou % .c . D'après ce que j'ai compris, il précise tous les fichiers c ou o . Mais pourquoi ce travail:

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

et ça ne marche pas

SOURCE := $(wildcard *.c)

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

Les deux expressions spécifient tous les fichiers. alors que fait % .o: le symbole dans le fichier make?

Mero
la source

Réponses:

9

Les deux expressions spécifient tous les fichiers.

Non, la première règle indique makecomment obtenir un .ofichier étant donné le .cfichier correspondant . Notez le singulier: un seul fichier.

La deuxième règle (prétend) indique makecomment obtenir un groupe de .ofichiers, étant donné un autre groupe de .cfichiers correspondants . Notez le pluriel: tous les .cfichiers résultant du *.cglobbing.

Sur une note secondaire, %.o: %cest une extension GNU.

D'un autre côté, vous n'apprendrez pas à utiliser makesur StackOverflow. Vous devriez plutôt envisager de lire un livre.

Satō Katsura
la source
RTFM, vraiment? Je pensais que le point d'échange de pile était de purger cette mentalité.
daknowles
12

La construction:

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

est une règle de modèle , qui est un type de règle implicite. Il spécifie une cible et une dépendance et provoque une invocation de $(CC)pour chaque cible. Alors que ce:

SOURCE := $(wildcard *.c)

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

est une règle standard mais elle a (éventuellement) de nombreuses cibles et de nombreuses dépendances. Pourtant, pour tout cela, il ne sera invoqué $(CC)qu'une seule fois.

Stephen Rauch
la source