makefile
Zmienne
Szukaj…
Odwoływanie się do zmiennej
Aby użyć wartości przechowywanej w zmiennej, użyj znaku dolara, a następnie nazwy zmiennej w nawiasach lub nawiasach klamrowych.
x = hello
y = $(x)
# y now contains the value "hello"
y = ${x}
# parentheses and curly braces are treated exactly the same
Jeśli nazwa zmiennej ma tylko jeden znak, nawiasy / nawiasy klamrowe można pominąć (np. $x
). Ta praktyka jest stosowana w przypadku zmiennych automatycznych (patrz poniżej), ale nie jest zalecana w przypadku zmiennych ogólnego przeznaczenia.
Po prostu rozszerzone zmienne
Po prostu rozszerzone zmienne zachowują się jak zmienne z tradycyjnych języków programowania. Wyrażenie po prawej stronie jest oceniane, a wynik jest przechowywany w zmiennej. Jeśli prawa strona zawiera odwołanie do zmiennej, zmienna ta jest rozwijana przed przypisaniem.
x := hello
y := $(x)
# Both $(x) and $(y) will now yield "hello"
x := world
# $(x) will now yield "world", and $(y) will yield "hello"
Alternatywną formą jest użycie przypisania dwukropka:
x ::= hello
Przypisanie pojedynczego i dwukropka jest równoważne. Standard POSIX wymienia tylko formę ::=
, więc implementacje zgodne ze ścisłymi standardami mogą nie obsługiwać wersji z pojedynczym dwukropkiem.
Zmienne rozszerzane rekurencyjnie
Podczas definiowania zmiennej rozszerzanej rekurencyjnie zawartość prawej strony jest przechowywana w niezmienionej postaci. Jeśli obecne jest odwołanie do zmiennej, samo odwołanie jest przechowywane (nie wartość zmiennej). Czekaj, aby rozwinąć odwołania do zmiennych, aż zmienna zostanie faktycznie użyta.
x = hello
y = $(x)
# Both $(x) and $(y) will now yield "hello"
x = world
# Both $(x) and $(y) will now yield "world"
W tym przykładzie definicja y
jest rekurencyjna. Odniesienie do $(x)
nie zostanie rozwinięte, dopóki $(y)
zostanie rozwinięte. Oznacza to, że ilekroć zmienia się wartość x
zmienia się również wartość y
.
Zmienne rozszerzane rekurencyjnie są potężnym, ale łatwo zrozumiałym narzędziem. Można ich używać do tworzenia konstrukcji przypominających szablony lub funkcje, a nawet do automatycznego generowania fragmentów makefile. Mogą być również źródłem trudnych do debugowania problemów. Uważaj, aby używać rekursywnie rozszerzonych zmiennych tylko w razie potrzeby.
Automatyczne zmienne
W kontekście pojedynczej reguły Make automatycznie definiuje wiele specjalnych zmiennych. Zmienne te mogą mieć inną wartość dla każdej reguły w pliku makefile i mają na celu uproszczenie pisania reguł. Zmiennych tych można używać tylko w części przepisu dotyczącej reguły.
Zmienna | Opis |
---|---|
$@ | Nazwa pliku celu reguły |
$% | Nazwa członka docelowego, jeśli celem reguły jest archiwum |
$< | Nazwa pliku pierwszego wymagania wstępnego |
$^ | Lista wszystkich wymagań wstępnych |
$? | Lista wszystkich wymagań wstępnych, które są nowsze niż cel |
$* | „Trzon” zasady ukrytej lub wzorca |
W poniższym przykładzie zastosowano zmienne automatyczne do wygenerowania ogólnej reguły. To instruuje, jak zbudować plik .o z pliku .c o tej samej nazwie. Ponieważ nie znamy konkretnej nazwy plików, których dotyczy problem, używamy $@
jako symbolu zastępczego dla nazwy pliku wyjściowego i $^
jako symbolu zastępczego dla listy wymagań wstępnych (w tym przypadku listy plików wejściowych).
%.o: %.c
cc -Wall $^ -c $@
Warunkowe przypisanie zmiennej
Operator ?=
Jest rozszerzeniem, które zachowuje się jak =
, z tym wyjątkiem, że przypisanie występuje tylko wtedy, gdy zmienna nie jest jeszcze ustawiona.
x = hello
x ?= world
# $(x) will yield "hello"
Dołączanie tekstu do istniejącej zmiennej
Operator +=
jest wspólnym rozszerzeniem, które dodaje określoną treść na końcu zmiennej, oddzieloną spacją.
x = hello
x += world
Odwołania do zmiennych po prawej stronie zostaną rozwinięte tylko wtedy, gdy pierwotna zmienna została zdefiniowana jako zmienna po prostu rozwinięta.