Sök…


Referera till en variabel

Om du vill använda värdet som är lagrat i en variabel använder du dollartecknet följt av variabelnamnet omslutet av parenteser eller lockiga hängslen.

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

Om en variabelns namn bara är ett tecken långt kan parenteser / hängslen utelämnas (t.ex. $x ). Denna praxis används för automatiska variabler (se nedan), men rekommenderas inte för allmänna variabler.

Enkelt utvidgade variabler

Enkelt utvidgade variabler uppför sig som variabler från traditionella programmeringsspråk. Uttrycket på höger sida utvärderas och resultatet lagras i variabeln. Om den högra sidan innehåller en variabelreferens utvidgas den variabeln innan tilldelningen sker.

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

En alternativ form är att använda tilldelning med dubbel kolon:

x ::= hello

En- och dubbelkolonntilldelning är likvärdiga. POSIX-standarden nämner endast ::= -formuläret, så implementeringar med strikt standardkrav kanske inte stöder versionen med en enda kolon.

Rekursivt utvidgade variabler

När man definierar en rekursivt utvidgad variabel lagras innehållet på höger sida som det är. Om en variabelreferens finns, lagras själva referensen (inte värdet på variabeln). Vänta på att utöka variabelreferenser tills variabeln faktiskt används.

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

I det här exemplet är definitionen av y rekursiv. Hänvisningen till $(x) utvidgas inte förrän $(y) har utökats. Detta innebär att när värdet på x ändras också kommer värdet på y att förändras.

Rekursivt utvidgade variabler är ett kraftfullt men lätt missförstått verktyg. De kan användas för att skapa konstruktioner som liknar mallar eller funktioner, eller till och med för att automatiskt generera delar av en makefil. De kan också vara källan till svåra att felsöka problem. Var noga med att bara använda rekursivt utvidgade variabler vid behov.

Automatiska variabler

Inom ramen för en enskild regel definierar Make automatiskt ett antal specialvariabler. Dessa variabler kan ha ett annat värde för varje regel i en makefil och är utformade för att göra skrivregler enklare. Dessa variabler kan endast användas i receptdelen av en regel.

Variabel Beskrivning
$@ Filnamn för regelens mål
$% Målmedlemmens namn, om regelens mål är ett arkiv
$< Filnamn på den första förutsättningen
$^ Lista över alla förutsättningar
$? Lista över alla förutsättningar som är nyare än målet
$* "Stammen" av en implicit eller mönsterregel

Följande exempel använder automatiska variabler för att generera en generisk regel. Detta instruerar hur man konstruerar en .o-fil ur en .c-fil med samma namn. Eftersom vi inte känner till det specifika namnet på de berörda filerna, använder vi $@ som en platshållare för utdatafilens namn och $^ som en platshållare för förutsatt lista (i detta fall listan med inputfiler).

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

Villkorlig variabel tilldelning

Operatören ?= Är ett tillägg som uppträder som = , förutom att tilldelningen endast sker om variabeln inte redan är inställd.

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

Lägga till text till en befintlig variabel

Operatören += är ett vanligt tillägg som lägger till det angivna innehållet i slutet av variabeln, separerad med ett mellanslag.

x = hello
x += world

Variabla referenser på höger sida kommer att utvidgas om och bara om den ursprungliga variabeln definierades som en helt enkelt expanderad variabel.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow