Ricerca…


Riferimento a una variabile

Per utilizzare il valore memorizzato in una variabile, utilizzare il simbolo del dollaro seguito dal nome della variabile racchiuso tra parentesi o parentesi graffe.

x = hello
y = $(x)
# y now contains the value "hello"
y = ${x}
# parentheses and curly braces are treated exactly the same

Se il nome di una variabile è lungo un solo carattere, è possibile omettere le parentesi / parentesi (ad es. $x ). Questa pratica è utilizzata per le variabili automatiche (vedi sotto), ma non è raccomandata per variabili generiche.

Variabili semplicemente espanse

Le variabili semplicemente espanse si comportano come variabili dai linguaggi di programmazione tradizionali. L'espressione sul lato destro viene valutata e il risultato viene archiviato nella variabile. Se il lato destro contiene un riferimento variabile, tale variabile viene espansa prima che l'assegnazione abbia luogo.

x := hello
y := $(x)
# Both $(x) and $(y) will now yield "hello"
x := world
# $(x) will now yield "world", and $(y) will yield "hello"

Una forma alternativa è quella di utilizzare l'assegnazione di due punti:

x ::= hello

Assegnazione di un singolo e doppio colon sono equivalenti. Il POSIX make standard menziona solo il modulo ::= , quindi le implementazioni con una rigorosa conformità agli standard potrebbero non supportare la versione a singolo punto.

Variabili ricorsivamente espanse

Quando si definisce una variabile espansa in modo ricorsivo, i contenuti del lato destro vengono memorizzati così come sono. Se è presente un riferimento variabile, il riferimento stesso viene memorizzato (non il valore della variabile). Fai in attesa di espandere i riferimenti delle variabili fino a quando la variabile non viene effettivamente utilizzata.

x = hello
y = $(x)
# Both $(x) and $(y) will now yield "hello"
x = world
# Both $(x) and $(y) will now yield "world"

In questo esempio, la definizione di y è ricorsiva. Il riferimento a $(x) non viene espanso fino $(y) quando $(y) viene espanso. Ciò significa che ogni volta che cambia il valore di x , cambierà anche il valore di y .

Le variabili ricorsivamente espanse sono uno strumento potente ma facilmente frainteso. Possono essere utilizzati per creare costrutti che assomigliano a modelli o funzioni, o anche per generare automaticamente parti di un makefile. Possono anche essere la fonte di problemi difficili da debugare. Fai attenzione a utilizzare solo variabili ricorsivamente espanse quando necessario.

Variabili automatiche

Nel contesto di una singola regola, Make definisce automaticamente un numero di variabili speciali. Queste variabili possono avere un valore diverso per ogni regola in un makefile e sono progettate per semplificare le regole di scrittura. Queste variabili possono essere utilizzate solo nella parte della ricetta di una regola.

Variabile Descrizione
$@ Nome del file della destinazione della regola
$% Il nome del membro di destinazione, se la destinazione della regola è un archivio
$< Nome file del primo prerequisito
$^ Elenco di tutti i prerequisiti
$? Elenco di tutti i prerequisiti più recenti della destinazione
$* La "radice" di una regola implicita o di modello

Nell'esempio seguente vengono utilizzate le variabili automatiche per generare una regola generica. Questo indica come costruire un file .o da un file .c con lo stesso nome. Poiché non conosciamo il nome specifico dei file interessati, utilizziamo $@ come segnaposto per il nome del file di output e $^ come segnaposto per l'elenco dei prerequisiti (in questo caso, l'elenco dei file di input).

%.o: %.c
    cc -Wall $^ -c $@

Assegnazione variabile condizionale

L'operatore ?= È un'estensione che si comporta come = , tranne che l'assegnazione avviene solo se la variabile non è già impostata.

x = hello
x ?= world
# $(x) will yield "hello"

Aggiunta di testo a una variabile esistente

L'operatore += è un'estensione comune che aggiunge il contenuto specificato alla fine della variabile, separato da uno spazio.

x = hello
x += world

I riferimenti variabili nella parte destra verranno espansi se e solo se la variabile originale è stata definita come una variabile espansa semplicemente.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow