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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow