2009-05-29 5 views
10

Quelqu'un peut-il s'il vous plaît expliquer la signification de $< et [email protected] dans un Makefile?

+2

Qu'est devenue la bonne vieille tradition de lire le bon manuel? – Jens

+1

Qui lit 200 pages de documents pour quelques questions simples? – MarcusJ

+1

La recherche dans un document de 200 pages serait facile si GNU Make ne le rendait pas difficile. Sur mon système, il s'agit d'une page * man * (vous savez, * man * pour * manual *) qui n'explique rien de tout cela, mais fait référence à * The GNU Make Manual * sans me dire comment le trouver. Donc, Google est la réponse, et le fait de donner '$ @' à Google fournit la réponse (à ma grande surprise). – reinierpost

Répondre

20

$< évalue à la première "prérequis" dans la règle make, et [email protected] évalue à la "cible" dans la règle make.

Voici un exemple:

file.o : file.c 
     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected] 

Dans ce cas, $< sera remplacé par file.c et [email protected] sera file.o.

Ce sont plus utiles dans les règles génériques comme ceci:

%.o : %.c 
     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected] 

Voir this manual pour plus d'informations.

+2

Notez que bien que les deux exemples ci-dessus fonctionnent avec GNU Make, ils ne sont pas portables. POSIX ne définit pas% de règles et définit $ adl

+2

D'autre part, écrire Makefiles devient tellement plus facile si vous vous limitez à GNU make. (qui est portable à plus ou moins toutes les plates-formes existantes) – JesperE

+0

(... en attendant que quelqu'un me dise quelles plates-formes GNU font ne sont pas disponibles sur ...) – JesperE

6

[email protected] est la cible de la règle actuelle. $< est le nom du premier prérequis ("source") de la règle actuelle.

Ainsi, par exemple:

.c.o: 
     $(CC) -c $(CFLAGS) -o [email protected] $< 

Cela permettra d'élargir à une commande quelque chose comme:

gcc -c -Wall -o foo.o foo.c 

Voir aussi la GNU make manual § 10.5.3, "Automatic Variables".

+0

Que faire si vous avez plusieurs fichiers source pour une seule cible? – MarcusJ

+1

@MarcusJ Comme mentionné dans la réponse, '$ <' est le nom du * premier * pré-requis. Vous pouvez suivre le lien dans la réponse pour les autres variables automatiques ('$?', '$ ^', '$ +', '$ |') Qui vous donneront plus que le premier pré-requis. –