Skąd aplikacja „make” rozpoznaje domyślny cel do zbudowania, jeśli nie określono żadnego celu?

187

Większość aplikacji linuxowych jest kompilowana z:

make
make install clean

Tak jak to zrozumiałem, make przyjmuje jako argumenty nazwy celów kompilacji. Więc installjest celem, który kopiuje niektóre pliki, a następnie cleanjest celem, który usuwa pliki tymczasowe.

Ale jaki cel makezbuduje, jeśli nie zostaną określone argumenty (np. Pierwsze polecenie w moim przykładzie)?

grigoryvp
źródło

Odpowiedzi:

231

Domyślnie zaczyna się od przetworzenia pierwszego celu, który nie zaczyna się od .aka domyślnego celu ; aby to zrobić, może być konieczne przetworzenie innych celów - w szczególności tych, od których zależy pierwszy cel.

Podręcznik tworzenia GNU obejmuje wszystkie te rzeczy i jest zaskakująco łatwy i pouczający.

Marcel Gosselin
źródło
61
Wywołanie pierwszego celu allto tylko konwencja.
Tobu,
1
Przydatne jest uruchamianie ich osobno, jeśli instalujesz dla innych użytkowników, ponieważ wystarczy uruchomić make installin sudo, a nie całą kompilację.
Scott Wales
2
Do Twojej wiadomości domyślny wpis man dla make nie wspomina o tym, co się stanie, gdy nie określisz celu.
Sekm
2
Jeśli GNU tworzy instrukcję dotyczącą tych zagadnień, dlaczego zadaje się to pytanie? Podręcznik doskonale dokumentuje sposób pisania reguł, ale nie wspomina o tym, jak napisać plik Makefile.
Nick
1
Patrzę na plik make, który includejest kolejnym plikiem makefile, którego pierwszym celem jest %.o : %.cpp. Więc domyślnym celem jest ... zbudowanie wszystkich plików .cpp?
Qwertie,
176

Oto krótka odpowiedź, aby zaoszczędzić innym kilka sekund i aby nie musieli czytać instrukcji. Dodaj to na górze pliku make:

.DEFAULT_GOAL := mytarget

mytarget będzie teraz celem, który zostanie uruchomiony, jeśli zostanie wykonane polecenie „make” i nie zostanie określony żaden cel.

Jeśli masz starszą wersję marki (<= 3,80), to nie zadziała. Jeśli tak jest, możesz zrobić to, o czym wspomina anon, po prostu dodaj to na górze pliku make:

.PHONY: default
default: mytarget ;

Odnośniki: https://www.gnu.org/software/make/manual/html_node/How-Make-Works.html

Samuel
źródło
1
@nathan To sprawia, że ​​mytarget jest domyślnym celem, jeśli ktoś uruchomi polecenie „make” bez żadnych parametrów.
Samuel
1
Zauważ, że .DEFAULT_GOAL nie wydaje się być obsługiwany w GNU make v3.80, i zakładam również wcześniejsze wersje (v3.81 to jednak obsługuje). Jeśli używasz starszej wersji make, musisz upewnić się, że domyślny cel jest pierwszym / najwyższym celem w twoim pliku make.
Samuel
4
„... aby uchronić ich przed koniecznością przeczytania instrukcji” to jeden z punktów SO: szybkie odpowiedzi na pytania, które w innym przypadku zajęłyby kopanie w starożytnej dokumentacji.
WattsInABox
1
„Dodaj to do góry pliku make”: Dodawanie do góry nie wydaje się być wymagane.
Aman Deep Gautam
2
To powinna być poprawna odpowiedź. W tym przypadku wyraźne wygrane niejawne.
Sion
34

GNU Make pozwala także określić domyślny cel make za pomocą specjalnej zmiennej o nazwie .DEFAULT_GOAL. Możesz nawet rozbroić tę zmienną w środku pliku Makefile, dzięki czemu następny cel w pliku stanie się domyślnym celem.

Ref: Podręcznik Gnu Make - zmienne specjalne

Sandip Bhattacharya
źródło