Makefile - Makefile
Rodzaj mediów internetowych |
text / x-makefile
|
---|---|
Rodzaj formatu | Buduj automatyzację |
Standard | POSIX : - Commands & Utilities Reference, The Single UNIX Specification , Issue 7 from The Open Group |
Plik makefile to plik (domyślnie nazywany „Makefile”) zawierający zestaw dyrektyw używanych przez narzędzie automatyzacji budowania make do wygenerowania celu / celu.
Przegląd
Najczęściej plik makefile poleca programowi Make, jak skompilować i zlinkować program . Plik makefile działa na zasadzie, że pliki wymagają ponownego odtworzenia tylko wtedy, gdy ich zależności są nowsze niż plik, który jest tworzony / odtwarzany. Plik makefile jest wykonywany rekurencyjnie (z zależnością przygotowywaną przed każdym celem zależnym od nich), dopóki wszystko nie zostanie zaktualizowane (co wymaga aktualizacji) i główny / ostateczny cel zostanie ukończony. Te instrukcje wraz z ich zależnościami są określone w pliku makefile . Jeśli żaden z plików, które są wymaganiami wstępnymi, nie został zmieniony od czasu ostatniej kompilacji programu, żadne działania nie zostaną wykonane. W przypadku dużych projektów oprogramowania użycie Makefiles może znacznie skrócić czas kompilacji, jeśli tylko kilka plików źródłowych uległo zmianie.
Na przykładzie C / C ++ , gdy plik źródłowy C / C ++ zostanie zmieniony, należy go ponownie skompilować. Jeśli plik nagłówkowy uległ zmianie, każdy plik źródłowy C / C ++ zawierający plik nagłówkowy musi zostać ponownie skompilowany, aby był bezpieczny. Każda kompilacja tworzy plik obiektowy odpowiadający plikowi źródłowemu. Wreszcie, jeśli jakikolwiek plik źródłowy został ponownie skompilowany, wszystkie pliki obiektowe, czy to nowo utworzone, czy zapisane z poprzednich kompilacji, muszą być połączone razem w celu utworzenia nowego programu wykonywalnego.
System operacyjny
Podobny do systemu Unix
Pliki Makefile powstały w systemach uniksopodobnych i nadal są podstawowym mechanizmem budowania oprogramowania w takich środowiskach.
Microsoft Windows
Windows obsługuje różne wersje plików makefile dzięki narzędziu nmake . Standardowe pliki makefile typu Unix mogą być uruchamiane w systemie Windows w środowisku Cygwin lub Mingw .
Zawartość
Makefile zawiera pięć rodzajów rzeczy: wyraźnych zasad , reguł uwikłanych , zmienne definicje , wskazówki i komentarze .
- Wyraźna zasada mówi, kiedy i jak przerobić jeden lub więcej plików, zwane cele Regułą jest. Zawiera listę innych plików, od których zależą cele, nazywane wymaganiami wstępnymi celu, a także może podać przepis do użycia w celu utworzenia lub zaktualizowania celów.
- Niejawny reguła mówi, kiedy i jak przerobić klasę plików na podstawie ich nazw. Opisuje, w jaki sposób cel może zależeć od pliku o nazwie podobnej do celu i podaje przepis na utworzenie lub aktualizację takiego celu.
- Zmienna definicja to linia, która określa wartość ciąg tekstu dla zmiennej, która może być podstawiona w tekście później.
- Dyrektywa jest instrukcją dla marki zrobić coś wyjątkowego podczas czytania makefile takich jak czytanie inny makefile.
- „#” w wierszu pliku makefile rozpoczyna komentarz . To i reszta linii są ignorowane.
Zasady
Plik makefile składa się z „reguł” w następującej formie:
target: dependencies
system command(s)
Cel jest zwykle nazwa pliku, który jest generowany przez program; przykładami celów są pliki wykonywalne lub pliki obiektowe. Celem może być również nazwa czynności do wykonania, na przykład „wyczyść”.
Zależność (zwana również wstępnym ), to plik, który jest wykorzystywany jako wejście do utworzenia docelowego. Cel często zależy od kilku plików. Jednak reguła określająca przepis na cel nie musi mieć żadnych wymagań wstępnych. Na przykład reguła zawierająca polecenie usuwania skojarzone z celem „wyczyść” nie ma wymagań wstępnych.
Poleceń systemu (ów) (zwane również przepis ) jest to działanie, które wykonuje make. Receptura może mieć więcej niż jedno polecenie, albo w tym samym wierszu, albo każde w osobnym wierszu. Zwróć uwagę na użycie znaczących wcięć przy określaniu poleceń; Zauważ również, że wcięcie musi składać się z pojedynczego znaku <tab>.
Wykonanie
Plik makefile jest wykonywany make
poleceniem, np make [options] [target1 target2 ...]
. Domyślnie, gdy make szuka pliku makefile, jeśli nazwa pliku makefile nie została dołączona jako parametr, próbuje w kolejności następujących nazw: makefile i Makefile .
Przykład
Oto plik makefile, który opisuje sposób, w jaki plik wykonywalny o nazwie edit zależy od czterech plików obiektowych, które z kolei zależą od czterech plików źródłowych C i dwóch plików nagłówkowych. Aby być konkretne, edit
to cel, edit.o
, kbd.o
, command.o
i display.o
są obiektami łączymy do pliku wykonywalnego, defs.h
a command.h
są nagłówki, że nasze obiekty trzeba skompilować poprawnie i jest poleceniem systemu.
$(CC) -c -o $@ $< $(CCFLAGS)
-
$@
to makro, które odwołuje się do celu -
$<
to makro, które odwołuje się do pierwszej zależności -
$^
to makro, które odnosi się do wszystkich zależności -
%
to makro, które tworzy wzorzec, który chcemy obserwować zarówno w celu, jak i zależności
Plik make ponownie skompiluje wszystkie obiekty, jeśli którykolwiek z nagłówków ulegnie zmianie, ale jeśli zmieni się pojedynczy .c
plik, jedyną pracą, jaką trzeba będzie wykonać, jest ponowna kompilacja tego pliku, a następnie ponowne połączenie wszystkich obiektów. Dobrze napisane reguły tworzenia mogą pomóc skrócić czas kompilacji, wykrywając, co się zmieniło, a co nie
Zwróć uwagę na sposób, w jaki zmienne i statyczne reguły wzorców są używane, aby uczynić plik makefile bardziej rozszerzalnym i czytelnym. Definiujemy tę samą regułę wielokrotnego użytku, aby zrobić każdy .o
z każdego .c
i zrobić każdy target
z obiektów.
Zauważ również, że możemy łączyć tylko jedną sieć główną na raz, więc musimy odfiltrować inne sieci podczas łączenia.
Cele all
i clean
są nazwane, .PHONY
ponieważ nie odnoszą się do prawdziwych plików, ale są rzeczami, które chcemy zrobić.
CC := gcc
CCFLAGS :=
LDFLAGS :=
TARGETS:= edit
MAINS := $(addsuffix .o, $(TARGETS) )
OBJ := kbd.o command.o display.o $(MAINS)
DEPS := defs.h command.h
.PHONY: all clean
all: $(TARGETS)
clean:
rm -f $(TARGETS) $(OBJ)
$(OBJ): %.o : %.c $(DEPS)
$(CC) -c -o $@ $< $(CCFLAGS)
$(TARGETS): % : $(filter-out $(MAINS), $(OBJ)) %.o
$(CC) -o $@ $(LIBS) $^ $(CCFLAGS) $(LDFLAGS)
Aby użyć tego pliku makefile do utworzenia pliku wykonywalnego o nazwie edit , wpisz make all
lub make edit
. Aby użyć tego pliku makefile do usunięcia pliku wykonywalnego i wszystkich plików obiektowych z katalogu, wpisz make clean
.