makefile
Variabelen
Zoeken…
Verwijzen naar een variabele
Als u de waarde wilt gebruiken die in een variabele is opgeslagen, gebruikt u het dollarteken gevolgd door de naam van de variabele tussen haakjes of accolades.
x = hello
y = $(x)
# y now contains the value "hello"
y = ${x}
# parentheses and curly braces are treated exactly the same
Als de naam van een variabele slechts één teken lang is, kunnen de haakjes / accolades worden weggelaten (bijvoorbeeld $x
). Deze praktijk wordt gebruikt voor automatische variabelen (zie hieronder), maar wordt niet aanbevolen voor algemene variabelen.
Eenvoudig uitgebreide variabelen
Eenvoudig uitgebreide variabelen gedragen zich als variabelen uit traditionele programmeertalen. De uitdrukking aan de rechterkant wordt geëvalueerd en het resultaat wordt opgeslagen in de variabele. Als de rechterkant een verwijzing naar een variabele bevat, wordt die variabele uitgevouwen voordat de toewijzing plaatsvindt.
x := hello
y := $(x)
# Both $(x) and $(y) will now yield "hello"
x := world
# $(x) will now yield "world", and $(y) will yield "hello"
Een alternatief formulier is om dubbele dubbele punttoewijzing te gebruiken:
x ::= hello
Een enkele en dubbele dubbele punt zijn gelijkwaardig. De POSIX-maakstandaard vermeldt alleen het ::=
formulier, dus implementaties met strikte naleving van normen ondersteunen mogelijk de versie met één dubbele punt niet.
Recursief uitgebreide variabelen
Bij het definiëren van een recursief uitgebreide variabele wordt de inhoud van de rechterkant als zodanig opgeslagen. Als een variabele referentie aanwezig is, wordt de referentie zelf opgeslagen (niet de waarde van de variabele). Wacht totdat de variabeleferenties zijn uitgevouwen totdat de variabele daadwerkelijk wordt gebruikt.
x = hello
y = $(x)
# Both $(x) and $(y) will now yield "hello"
x = world
# Both $(x) and $(y) will now yield "world"
In dit voorbeeld is de definitie van y
recursief. De verwijzing naar $(x)
wordt pas uitgebreid als $(y)
wordt uitgebreid. Dit betekent dat wanneer de waarde van x
verandert, ook de waarde van y
verandert.
Recursief uitgebreide variabelen zijn een krachtig maar gemakkelijk te begrijpen hulpmiddel. Ze kunnen worden gebruikt om constructies te maken die lijken op sjablonen of functies, of zelfs om automatisch delen van een makefile te genereren. Ze kunnen ook de oorzaak zijn van moeilijk te debuggen problemen. Zorg ervoor dat u alleen recursief uitgebreide variabelen gebruikt wanneer dat nodig is.
Automatische variabelen
Binnen de context van een individuele regel definieert Make automatisch een aantal speciale variabelen. Deze variabelen kunnen voor elke regel in een makefile een andere waarde hebben en zijn ontworpen om schrijfregels eenvoudiger te maken. Deze variabelen kunnen alleen worden gebruikt in het receptgedeelte van een regel.
veranderlijk | Beschrijving |
---|---|
$@ | Bestandsnaam van het doel van de regel |
$% | De naam van het doellid, als het doel van de regel een archief is |
$< | Bestandsnaam van de eerste vereiste |
$^ | Lijst met alle vereisten |
$? | Lijst met alle vereisten die nieuwer zijn dan het doel |
$* | De "stam" van een impliciete of patroonregel |
In het volgende voorbeeld worden automatische variabelen gebruikt om een generieke regel te genereren. Hierin wordt uitgelegd hoe u een .o-bestand kunt samenstellen uit een .c-bestand met dezelfde naam. Omdat we de specifieke naam van de getroffen bestanden niet kennen, gebruiken we $@
als tijdelijke aanduiding voor de naam van het uitvoerbestand en $^
als tijdelijke aanduiding voor de vereiste lijst (in dit geval de lijst met invoerbestanden).
%.o: %.c
cc -Wall $^ -c $@
Voorwaardelijke variabele toewijzing
De operator ?=
Is een extensie die zich gedraagt als =
, behalve dat de toewijzing alleen plaatsvindt als de variabele nog niet is ingesteld.
x = hello
x ?= world
# $(x) will yield "hello"
Tekst toevoegen aan een bestaande variabele
De operator +=
is een algemene extensie die de opgegeven inhoud toevoegt aan het einde van de variabele, gescheiden door een spatie.
x = hello
x += world
Variabele verwijzingen aan de rechterkant worden uitgebreid als en alleen als de oorspronkelijke variabele als een eenvoudig uitgebreide variabele werd gedefinieerd.