Makefile - dyrektywy
Istnieje wiele dyrektyw dostępnych w różnych formach. Plikmakeprogram w twoim systemie może nie obsługiwać wszystkich dyrektyw. Więc sprawdź, czy twójmake popiera dyrektywy, które tutaj wyjaśniamy. GNU make popiera te dyrektywy.
Dyrektywy warunkowe
Dyrektywy warunkowe to -
Plik ifeqDyrektywa rozpoczyna warunek i określa warunek. Zawiera dwa argumenty oddzielone przecinkiem i otoczone nawiasami. Zastępowanie zmiennych jest wykonywane na obu argumentach, a następnie są one porównywane. Linie pliku makefile następujące po ifeq są przestrzegane, jeśli oba argumenty są zgodne; w przeciwnym razie są ignorowane.
Plik ifneqDyrektywa rozpoczyna warunek i określa warunek. Zawiera dwa argumenty oddzielone przecinkiem i otoczone nawiasami. Zastępowanie zmiennych odbywa się na obu argumentach, a następnie są one porównywane. Wiersze makefile następujące po ifneq są przestrzegane, jeśli te dwa argumenty nie są zgodne; w przeciwnym razie są ignorowane.
Plik ifdefDyrektywa rozpoczyna warunek i określa warunek. Zawiera pojedynczy argument. Jeśli podany argument jest prawdziwy, warunek staje się prawdziwy.
Plik ifndefDyrektywa rozpoczyna warunek i określa warunek. Zawiera pojedynczy argument. Jeśli podany argument jest fałszywy, warunek staje się prawdziwy.
Plik elsedyrektywy powoduje, że następujące wiersze są przestrzegane, jeśli poprzedni warunek zawiódł. W powyższym przykładzie oznacza to, że drugie alternatywne polecenie łączenia jest używane zawsze, gdy pierwsza alternatywa nie jest używana. Posiadanie else w warunku jest opcjonalne.
Plik endifDyrektywa kończy warunek. Każdy warunek musi kończyć się końcówką endif.
Składnia dyrektyw warunkowych
Składnia prostego warunku bez innego jest następująca -
conditional-directive
text-if-true
endif
Tekst-jeśli-prawda może być dowolnymi wierszami tekstu, które należy traktować jako część pliku makefile, jeśli warunek jest prawdziwy. Jeśli warunek jest fałszywy, zamiast tego nie jest używany żaden tekst.
Składnia złożonego warunku jest następująca -
conditional-directive
text-if-true
else
text-if-false
endif
Jeśli warunek jest prawdziwy, używany jest tekst-jeśli-prawda; w przeciwnym razie używany jest tekst-jeśli-fałsz. Tekst-jeśli-fałsz może być dowolną liczbą wierszy tekstu.
Składnia dyrektywy warunkowej jest taka sama, niezależnie od tego, czy warunek jest prosty, czy złożony. Istnieją cztery różne dyrektywy, które testują różne warunki. Są takie, jak podano -
ifeq (arg1, arg2)
ifeq 'arg1' 'arg2'
ifeq "arg1" "arg2"
ifeq "arg1" 'arg2'
ifeq 'arg1' "arg2"
Przeciwne dyrektywy powyższych warunków są następujące -
ifneq (arg1, arg2)
ifneq 'arg1' 'arg2'
ifneq "arg1" "arg2"
ifneq "arg1" 'arg2'
ifneq 'arg1' "arg2"
Przykład dyrektyw warunkowych
libs_for_gcc = -lgnu
normal_libs =
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
Dyrektywa obejmuje
Plik include directive pozwala makeaby zawiesić czytanie bieżącego pliku makefile i przeczytać jeden lub więcej innych plików makefile przed kontynuowaniem. Dyrektywa to wiersz w pliku makefile, który wygląda następująco -
include filenames...
Nazwy plików mogą zawierać wzorce nazw plików powłoki. Dodatkowe spacje są dozwolone i ignorowane na początku wiersza, ale tabulator nie jest dozwolony. Na przykład, jeśli masz trzy pliki `.mk ', a mianowicie` a.mk', `b.mk ',` c.mk' i $ (bar), to rozwija się do bish bash, a następnie wyrażenie.
include foo *.mk $(bar)
is equivalent to:
include foo a.mk b.mk c.mk bish bash
Kiedy makeprzetwarza dyrektywę include, zawiesza czytanie pliku makefile i czyta po kolei z każdego wymienionego pliku. Kiedy to się skończy,make wznawia czytanie makefile, w którym znajduje się dyrektywa.
Dyrektywa nadrzędna
Jeśli zmienna została ustawiona z argumentem polecenia, to zwykłe przypisania w pliku makefile są ignorowane. Jeśli chcesz ustawić zmienną w pliku makefile, nawet jeśli została ustawiona za pomocą argumentu polecenia, możesz użyć dyrektywy override, która jest linią wyglądającą następująco:
override variable = value
or
override variable := value