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?

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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.