Co oznacza „all” w pliku makefile?

105

Czytałem kilka tutoriali dotyczących plików Makefiles, ale nadal nie jest dla mnie jasne, co oznacza docelowe „all” i co robi.

Jakieś pomysły?

Chris Smullian
źródło

Odpowiedzi:

116

Build, w rozumieniu Makefile, składa się z wielu celów. Na przykład, aby zbudować projekt, którego możesz potrzebować

  1. Zbuduj plik1.o z pliku1.c
  2. Zbuduj plik2.o z pliku2.c
  3. Zbuduj plik3.o z pliku3.c
  4. Zbuduj plik wykonywalny1 z plik1.o i plik3.o
  5. Zbuduj plik wykonywalny2 z pliku2.o

Jeśli zaimplementowałeś ten przepływ pracy z makefile, możesz osobno ustawić każdy z celów. Na przykład, jeśli napisałeś

make file1.o

utworzyłby ten plik tylko wtedy, gdyby było to konieczne.

Nazwa allnie jest ustalona. To tylko konwencjonalna nazwa; alltarget oznacza, że jeśli go wywołasz, make zbuduje wszystko, co jest potrzebne do wykonania pełnej kompilacji . Zwykle jest to fikcyjny cel, który nie tworzy żadnych plików, a jedynie zależy od innych plików. W powyższym przykładzie budowanie wszystkiego, co niezbędne, to tworzenie plików wykonywalnych, a inne pliki są pobierane jako zależności. Więc w pliku makefile wygląda to tak:

all: executable1 executable2

alltarget jest zwykle pierwszym celem w makefile, ponieważ jeśli po prostu napiszesz makew linii poleceń, bez określania celu, zbuduje on pierwszy cel. I ty tego oczekujesz all.

alljest zwykle również .PHONYcelem. Dowiedz się więcej tutaj .

P Shved
źródło
31

Podręcznik GNU Make podaje jasną definicję na allswojej liście standardowych celów .

Jeśli autor pliku Makefile postępuje zgodnie z tą konwencją, cel allpowinien:

  1. Skompiluj cały program, ale nie twórz dokumentacji.
  2. Bądź domyślnym celem. Jak w bieganiu, po prostu makepowinien zrobić to samo co make all.

Osiągnięcie 1 alljest zwykle definiowane jako .PHONYcel zależny od plików wykonywalnych, które tworzą cały program:

.PHONY : all
all : executable

Aby osiągnąć 2, allnależy albo być pierwszym celem zdefiniowanym w pliku make, albo przypisać jako cel domyślny:

.DEFAULT_GOAL := all
PeterSW
źródło
3

Nie jestem pewien, czy oznacza to coś specjalnego. Zgodnie z konwencją podaje się regułę „wszystko” i generalnie jest ona używana do wyszczególnienia wszystkich celów podrzędnych potrzebnych do zbudowania całego projektu, stąd nazwa „wszystkie”. Jedyną wyjątkową rzeczą jest to, że często ludzie umieszczają go jako pierwszy cel w pliku makefile, co oznacza, że ​​samo wpisanie „make” zrobi to samo, co „make all”.

JustJeff
źródło
2

Cel „all” to przykład fałszywego celu - na dysku nie ma nic o nazwie „all”. Oznacza to, że kiedy wykonujesz „make all”, make zawsze myśli, że musi to zbudować, i dlatego wykonuje wszystkie polecenia dla tego celu. Te polecenia będą zazwyczaj budować wszystkie produkty końcowe, o których wie plik makefile, ale mogą zrobić wszystko.

Inne przykłady fałszywych celów to „clean” i „install”, które działają w ten sam sposób.

Jeśli jeszcze go nie czytałeś, powinieneś przeczytać Podręcznik tworzenia GNU , który jest również doskonałym samouczkiem.


źródło