Makefile - Makefile

Makefile
Rodzaj mediów internetowych
text / x-makefile
Rodzaj formatu Buduj automatyzację
Standard POSIX : make  - 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 .

Zobacz też

Bibliografia