2009-08-24 15 views
20

Sto leggendo il documento di GNU Make. Ecco un esempioQuattro segni di dollaro nel Makefile

% .d:% .c

@set -e; rm -f [email protected]; \ 

    $(CC) -M $(CPPFLAGS) $< > [email protected]$$$$; \ 

    sed ’s,\($*\)\.o[ :]*,\1.o [email protected] : ,g’ < [email protected]$$$$ > [email protected]; \ 

    rm -f [email protected]$$$$ 

ho provato questo su un programma C++, ed ha ottenuto l'elenco dei file

init3d.d init3d .d.18449 input.d input.d.18444 main.d main.d.18439

Ecco quello che ho trovato, ma non do u nderstand nella stessa document

Se è stata attivata l'espansione secondaria e si desidera il simbolo del dollaro letterale nella lista prerequisiti, si deve effettivamente scrivere quattro segni di dollaro (‘$$$$’).

Mi chiedo cosa significano in realtà i quattro dollari "$$$$"? Come fanno 18449, 18444 o 18439?

Grazie e saluti!

risposta

21

Se si abilita "espansione secondaria", è necessario $$$$ per generare un singolo $ nell'output effettivo. $ viene normalmente utilizzato per espandere variabili, richiamare funzioni di creazione, ecc. $$ con espansione secondaria abilitata fa qualcos'altro, ma altrimenti genera un valore effettivo di $ nell'output.

La shell che consente di eseguire righe di comando su sistemi Unix normalmente interpreta $$ come espandibile nell'ID processo shell. Quindi, senza espansione secondaria abilitata, $$$$ si trasformerà in $$ nell'output, che verrà espanso dall'ID di processo.

(Utilizzando l'ID di processo della shell come suffisso è un modo semplice per cercare di garantire l'unicità del nome del file per un file temporaneo.)

+0

espansione secondaria non influisce sui contenuti ricetta. Solo la lista dei prerequisiti. Quindi '$$$$' produrrà sempre '$$' nel contesto della ricetta. Hai solo bisogno di '$$$$' nella lista dei prerequisiti per ottenere un singolo' $ 'quando l'espansione secondaria è attiva (quando non si usa' $$ 'questo ti darà la possibilità). –

+0

Questa non è la risposta. L'espansione secondaria è irrilevante. – reinierpost

+0

@reinierpost sembra che tu abbia le stesse difficoltà di comprensione di Etan Reisner :) Il poster originale parlava di espansione secondaria, ecco perché ne ho scritto. La spiegazione effettiva è nel secondo paragrafo e la ragione più probabile per usare quel costrutto è nel terzo paragrafo tra parentesi. –

2

18449, 18444 o 18439 sembrano identificativi di processo quindi forse un ID di processo?

16

$$ verrà convertito in $, ma nelle regole Makefile (che sono shell espressioni) dovrai anche sfuggire allo $ risultante utilizzando un \ o utilizzando le virgolette singole ' attorno all'espressione.

Ecco un esempio che lo dimostra:

DOLLAR:=$$ 
dollar: 
    echo '$$' > [email protected] 
    echo "\$$" >> [email protected] 
    echo '$(DOLLAR)' >> [email protected] 
    echo "\$(DOLLAR)" >> [email protected] 
    cat dollar 
+1

Dio, ti amo. Ho cercato intorno e intorno perché '$$' si espande nel nulla per me. – Profpatsch

Problemi correlati