Krótkie wprowadzenie do „Makefiles” w tworzeniu oprogramowania typu open source z GNU Make

Krótkie wprowadzenie do „Makefiles” w tworzeniu oprogramowania typu open source z GNU Make

GNU Make to narzędzie programistyczne, które określa części konkretnej bazy kodu, które mają zostać ponownie skompilowane i może wydawać polecenia w celu wykonywania tych operacji w bazie kodu. To szczególnie robić Narzędzie może być używane z dowolnym językiem programowania, pod warunkiem, że ich kompilacja może być wykonana z powłoki, wydając polecenia.

Makefiles w Linux

W celu wykorzystania GNU Make, Musimy mieć jakiś zestaw reguł, które określają związek między różnymi plikami w naszym programie i poleceń do aktualizacji każdego pliku. Są one zapisane na specjalnym pliku o nazwie 'Makefile'. ''robić„polecenie używa”Makefile„Baza danych i ostatnie czasy modyfikacji plików, które należy zdecydować, które wszystkie pliki mają ponownie ponownie skompilować.

Zawartość makijażu

Ogólnie 'Makefiles„zawierają 5 rodzajów rzeczy, a mianowicie: Niejawne zasady, wyraźne zasady, Zmienne definicje, dyrektywy, I uwagi.

  1. Jakiś wyraźna zasada Określa, jak wykonać/przerobić jeden lub więcej plików (zwane celem, zostaną wyjaśnione później), a kiedy to samo.
  2. Jakiś Niejawna zasada Określa, jak wykonać/przerobić jeden lub więcej plików na podstawie ich nazwisk. Opisuje, w jaki sposób nazwa pliku docelowego jest powiązana z jednym plikiem o nazwie podobnej do celu.
  3. A Definicja zmienna jest wierszem, który określa wartość ciągu dla zmiennej, która należy podać później.
  4. A dyrektywa jest instrukcją, aby zrobić coś wyjątkowego podczas czytania makefile.
  5. A '#„Używany jest symbol reprezentuje początek komentarz wewnątrz Makefiles. Linia zaczynając od '#'jest po prostu ignorowany.

Struktura makefiles

Informacje, które informują robić Jak ponownie skompilować system poczyniający się z odczytania bazy danych o nazwie Makefile. Prosty Makefile Will składa się z zasad następującej składni:

Target…: Wymagania wstępne… przepis… 

A cel jest zdefiniowany jako plik wyjściowy generowany przez program. Może być też fałszywe cele, które zostaną wyjaśnione poniżej. Przykłady plików docelowych obejmują wykonywalne, pliki obiektowe Lub fałszywe cele tak jak czysty, zainstalować, Odinstalowanie itp.

A warunek wstępny to plik używany jako dane wejściowe do tworzenia plików docelowych.

A przepis to działanie, które robić Wykonuje się do tworzenia pliku docelowego na podstawie warunków wstępnych. Konieczne jest umieszczenie znaku TAB przed każdym przepisem wewnątrz Makefiles Chyba że określamy '.RecepreFix„Zmienna do zdefiniowania innego postaci jako prefiksu do przepisu.

Przykładowy makefile

Final: Main.o End.o Inter.o Start.O GCC -A końcowy główny.o End.o Inter.o Start.o Main.O: Main.c globalny.h gcc -c main.c End.O: Koniec.C lokalny.H Global.h gcc -c end.c Inter.O: Inter.c globalny.h gcc -c intern.c Uruchom.O: Rozpocznij.c globalny.h gcc -c start.C Clean: Rm -f Main.o End.o Inter.o Start.o

W powyższym przykładzie użyliśmy 4 c pliki źródłowe i dwa pliki nagłówka do tworzenia wykonywalnego finał. Tutaj każdy.o„Plik jest zarówno celem, jak i warunkiem wstępnym Makefile. Teraz spójrz na ostatnią nazwę celu czysty. To tylko akcja, a nie plik docelowy.

Ponieważ zwykle nie potrzebujemy tego podczas kompilacji, nie jest to pisane jako warunek wstępny w żadnych innych zasadach. Cele, które nie odnoszą się do plików, ale są po prostu wywoływane działania fałszywe cele. Nie będą mieli żadnych warunków wstępnych jako inne pliki docelowe.

Jak GNU sprawiają, że proces jest makefile

Domyślnie robić zaczyna się od pierwszego celu w 'Makefile„i jest nazywany”Domyślny cel'. Biorąc pod uwagę nasz przykład, mamy finał Jako nasz pierwszy cel. Ponieważ jego wymagania wstępne obejmują inne pliki obiektowe, należy je zaktualizować przed utworzeniem finał. Każdy z tych warunków jest przetwarzany zgodnie z własnymi zasadami.

Recompilacja występuje, jeśli dokonane są modyfikacje pliki źródłowe Lub pliki nagłówka lub jeśli plik obiektu W ogóle nie istnieje. Po ponownej kompilacji niezbędnych plików obiektów, robić decyduje, czy się powiązać finał albo nie. Należy to zrobić, jeśli plik finał nie istnieje lub jeśli którykolwiek z plików obiektów jest nowszy niż to.

Zatem jeśli zmienimy plik pochować.C, Potem podczas biegania robić ponownie skompiluje plik źródłowy w celu aktualizacji pliku obiektu pochować.o a następnie link finał.

Używanie zmiennych wewnątrz Makefiles

W naszym przykładzie musieliśmy wymienić wszystkie pliki obiektowe dwa razy w regule finał jak pokazano niżej.

Final: Main.o End.o Inter.o Start.O GCC -A końcowy główny.o End.o Inter.o Start.o

Aby uniknąć takich duplikacji, możemy wprowadzić zmienne do przechowywania listy plików obiektowych używanych w środku Makefile. Za pomocą zmiennej Obj Możemy przepisać próbkę Makefile do podobnego pokazanego poniżej.

OBJ = Main.o End.o Inter.o Start.o Final: $ (OBJ) GCC -O Final $ (OBJ) Main.O: Main.c globalny.h gcc -c main.c End.O: Koniec.C lokalny.H Global.h gcc -c end.c Inter.O: Inter.c globalny.h gcc -c intern.c Uruchom.O: Rozpocznij.c globalny.h gcc -c start.C Clean: rm -f $ (obj)

Zasady czyszczenia katalogu źródłowego

Jak widzieliśmy w przykładzie Makefile, Możemy zdefiniować zasady posprzątać Katalog źródłowy poprzez usunięcie niechcianych plików obiektów po kompilacji. Załóżmy, że mamy docelowy plik o nazwie czysty. Jak można robić wyróżnić powyższe dwie sytuacje? Oto koncepcja fałszywe cele.

A fałszywy cel to taka, która nie jest tak naprawdę nazwą pliku, a raczej jest to tylko nazwa przepisu, którą należy wykonać za każdym razem, gdy złożono wyraźne żądanie Makefile. Jeden główny powód do użycia fałszywy cel ma uniknąć konfliktu z plik o tej samej nazwie. Innym powodem jest poprawa wydajności.

Aby to wyjaśnić, ujawnię jeden nieoczekiwany zwrot akcji. Przepis na czysty nie zostanie domyślnie wykonane podczas uruchamiania robić. Zamiast tego konieczne jest wywołanie tego samego, wydając polecenie Wyczyść się.

.Chony: Clean Clean: Rm -f $ (OBJ)

Teraz spróbuj stworzyć Makefiles dla własnej bazy kodu. Zapraszam do komentowania tutaj ze swoimi wątpliwościami.