osdev.labedz.org

Opis

Program MAKE jest narzędziem, które przede wszystkim kontroluje proces tworzenia plików uruchomialnych i bibliotek, jednakże może być stosowany wszędzie tam gdzie występuje operacja przekształcenia wielu plików źródłowych w inny plik wynikowy [MAKE]. Program MAKE prowadzi proces tworzenia według instrukcji zapisanych w pliku nazywanym Makefile, który zawiera listę wszystkich plików źródłowych, oraz instrukcję jak je przekształcić na pliki wynikowe.

Możliwości programu MAKE:

  • umożliwia przeprowadzenie procesu kompilacji ze źródeł użytkownikowi, który nie musi znać szczegółów jak ten proces przebiega - wszystkie potrzebne informacje zawarte są w pliku Makefile
  • program MAKE potrafi rozróżnić, które z plików wejściowych wymagają powtórnego przetworzenia w plik wyjściowy, oraz kolejność w jakiej powinny być przetwarzane. Dzięki temu, podczas tworzenia większego projektu, po zmianie kilku plików nie ma potrzeby ponownej kompilacji całości.
  • program MAKE nie ogranicza jego zastosowania do jednego określonego języka. Dla każdego pliku wymagającego przetworzenia, w pliku Makefile występuje odpowiednia komenda konsoli, w jaki sposób operacja ma być przeprowadzona
  • MAKE nie jest ograniczony tylko do tworzenia nowego pliku wynikowego. Może być także stosowany do odinstalowania pakietów, generowania tablicy znaczników dla pakietów, czy też jakiekolwiek inne zadanie.

Plik Makefile

Prosty plik Makefile zawiera w sobie reguły według których ma być generowany odpowiedni plik wyjściowy.

plik_wyjściowy: plik_wejściowy ... komenda ... ...

Plik_wyjściowy jest zazwyczaj nazwą pliku generowanego przez program, jednak może być także nazwą akcji np. 'clean'.

Plik_wejściowy jest nazwą pliku, który ma być użyty do tworzenia pliku wynikowego. Jest możliwość stosowania więcej niż jednego pliku wejściowego. Reguły, które określają akcję mogą nie posiadać plików wejściowych

Komenda jest instrukcją jaką wykona program MAKE w celu stworzenia pliku wynikowego. Reguła może posiadać więcej niż jedną komendę, każda umieszczona w oddzielnej linii. Składnia pliku Makefile wymaga znaku tabulacji przed każdą komendą. Ponieważ program MAKE potrafi rozróżnić podstawowe rozszerzenia plików wejściowych i przypisać je do odpowiednich rodzajów programów przetwarzających, podawanie komendy nie zawsze jest konieczne. Pliki z rozszerzeniem .c, .s, .cpp i podobne MAKE będzie przetwarzał wtedy odpowiednim kompilatorem ze standardowymi ustawieniami.

Przedstawiony przykład jest prostym plikiem Makefile, który opisuje zależności między ośmioma plikami obiektowymi, które są tworzone ze źródeł języka C.

edit : main.o kbd.o command.o files.o utils.o cc -o edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c files.o : files.c defs.h buffer.h command.h cc -c files.c utils.o : utils.c defs.h cc -c utils.c clean : rm edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o

Gdy długość instrukcji jest za duża, aby zmieścić się na ekranie, zaleca się w celu poprawy czytelności skryptu, stosowanie łamania linii znakiem '\'.

Uruchomienie programu MAKE następuje po wykonaniu instrukcji make w konsoli. Program pobiera wtedy skrypt z bieżącego katalogu i wykonuje go. Istnieje również możliwość wykonania tylko określonej akcji - aby, na przykład, wykonać kasowanie plików obiektowych stworzonych podczas kompilacji, należy wykonać instrukcję make clean, która wykonuje akcje clean z pliku Makefile.

Standardowo program MAKE rozpoczyna pracę od pierwszej napotkanej reguły. Jeżeli zastosujemy powyższy skrypt, jako pierwsza zostanie interpretowana reguła edit. Ponieważ do konsolidacji potrzebuje ona innych plików obiektowych najpierw wykonywane są reguły od main.o do utils.o. Reguły te zawierają jako parametr wszystkie niezbędne do ich kompilacji pliki, oraz polecenie kompilacji odpowiedniego pliku źródłowego. Reguła zostanie wykonana jedynie wtedy, gdy czas i data utworzenia pliku wyjściowego reguły jest starszy od daty i czasu zmiany plików wejściowych, lub gdy taki plik nie występuje.

Załóżmy, że pliki były już wcześniej skompilowane.W tym przypadku, jeżeli zmienimy plik insert.c i uruchomimy program make, to zostanie skompilowany program insert.c w celu uaktualnienia pliku insert.o, a następnie ponownie skonsolidowany program edit. Jeżeli zmienimy jednak plik command.h to make skompiluje plik obiektowy kbd.o, command.o i files.o, a następnie dokona konsolidacji pliku edit.

W celu uniknięcia pisania wielokrotnie tych samych ciągów argumentów, w skrypcie Makefile mogą być zastosowane zmienne. Powoduje to znaczne uproszczenie skryptu, wprowadza pewną modułowość i ogranicza prawdopodobieństwo popełnienia przez programistę błedu. Aby przypisać zmiennej daną wartość należy po prostu zastosować znak przypisania (równości) przy odpowiednim ciągu znaków, natomiast wartość zmiennej uzyskuje się pisząc ją w nawiasie okrągłym z poprzedzającym go znakiem dolara.

objects = main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects)