2009-05-29 15 views
10

Qualcuno può spiegare il significato di $< e [email protected] in un Makefile?

+2

Che fine ha fatto la buona vecchia tradizione di leggere il bel manuale? – Jens

+1

Chi legge documenti di 200 pagine per solo alcune semplici domande? – MarcusJ

+1

Cercare questo in un documento lungo 200 pagine sarebbe facile se GNU Make non lo rendesse difficile. Sul mio sistema, viene fornito con una pagina * man * (si sa, * man * per * manual *) che non spiega nulla di ciò, ma si riferisce a * The GNU Make Manual * senza dirmi come trovarlo. Quindi, in sostanza, Google è la risposta, e l'invio di '$ @' a Google fornisce effettivamente la risposta (con mia sorpresa). – reinierpost

risposta

20

$< valuta il primo "prerequisito" nella regola di creazione e [email protected] valuta il "target" nella regola di creazione.

Ecco un esempio:

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

In questo caso, $< saranno sostituiti con file.c e [email protected] sarà file.o.

Questi sono più utili in regole generiche come questo:

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

Vedi this manual per maggiori informazioni.

+2

Si noti che mentre i due esempi precedenti funzioneranno con GNU Make, non sono portatili. POSIX non definisce le regole% e definisce $ adl

+2

D'altra parte, scrivere Makefile diventa molto più semplice se ti limiti a Fare GNU. (che è portabile a più o meno tutte le piattaforme esistenti) – JesperE

+0

(... in attesa che qualcuno mi dica quali piattaforme GNU rendono non è disponibile su ...) – JesperE

6

[email protected] è l'obiettivo della regola corrente. $< è il nome del primo prerequisito ("origine") della regola corrente.

Così, per esempio:

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

Questo si espanderà ad un qualcosa di comando come:

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

Vedi anche il GNU make manual § 10.5.3, "Automatic Variables".

+0

Cosa succede se si dispone di più file sorgente per un singolo target? – MarcusJ

+1

@MarcusJ Come menzionato nella risposta, '$ <' è il nome del * primo * prerequisito. Puoi seguire il link nella risposta per altre variabili automatiche ('$?', '$ ^', '$ +', '$ |') Che ti daranno qualcosa in più del semplice prerequisito. –

Problemi correlati