9. Program make Program make umozliwia dokonanie niezaleznej kompilacji programu. Na podstawie informacji zawartych w pliku Makefile oraz daty modyfikacji poszczegolnych plikow program make dokonuje ponownej kompilacji tylko tych plikow, ktore zmienily sie od czasu utworzenia ostatniej wersji programu. Uzyteczne opcje to: a) -d - wypisuje dodatkowe informacje o tym, co robi b) -f nazwa_pliku - uzywa wskazanego pliku zamiast Makefile c) -i - ignoruje bledy w poleceniach wykonywanych w celu wybudowania celow d) -j liczba_jobow - do kompilacji rownoleglej e) -n - wypisuje polecenia, jakie bylyby wykonane, ale ich nie wykonuje Wyczerpujacy opis programu make wraz z formatem Makefile znajda Panstwo w info make. Nie jest konieczne opanowanie wszystkich mozliwosci programu. Ponizej wymieniamy te elementy, ktore bedziemy wykorzystywac w dalszym ciagu zajec. 10. Pliki Makefile Proste pliki Makefile zawieraja jedynie zestaw regul. Kazda regula jest postaci : a) Cele moga byc nazwami plikow, ale niekoniecznie (jak w przykladowym Makefile-u). Cele bedace nazwami plikow moga zawierac znaki uogolniajace (gwiazdki i znaki zapytania, rozwijane normalnie jak w shellu). Takoz znaki uogolniajace moga wystepowac w zaleznosciach. Uwaga: znaki specjalne nie sa rozwijane przy definiowaniu zmiennej, a dopiero przy jej uzyciu. b) lista zaleznosci to oddzielona spacjami lista nazw plikow, ktorych zmiana ma spowodowac ponowne wybudowanie celu. c) polecenie to polecenie interpretatora uzywane do utworzenia celu. Zwroc uwage, ze wiersz z poleceniem zaczyna sie od znaku tabulacji! d) Jako domyslny budowany jest cel, zdefiniowany w pierwszej zawartej w pliku regule. Mozna jednak wywolujac program make podac nazwe celu, na przyklad make clean, patrz nizej e) Przykladowa regula: err.o: err.c err.h gcc -Wall -c err.c powoduje utworzenie pliku err.o o ile zmianie ulegly pliki err.c lub err.h za pomoca odpowiedniego wywolania kompilatora. Spowoduje to oczywiscie zmiane pliku err.o i uaktywnienie kolejnych regul, w ktorych plik err.o wystepuje na liscie zaleznosci. Regula: clean: rm -f *.o copy nie ma zaleznosci. Powoduje usuniecie wskazanych plikow. Poniewaz brak jest zaleznosci jedynym sposobem jej uaktywnienia jest jawne podanie nazwy celu w wywolaniu programu make. * Przeanalizuj przykladowy plik Makefile1. Zmien jego nazwe na Makefile. Wykonaj make clean, a nastepnie make. Co stanie sie jesli jeszcze raz wywolasz make? Sprobuj wprowadzic jaka zmiane do programu copy. Wykonaj jeszcze raz make. Co sie stalo? f) Znak # rozpoczyna komentarz (do konca wiersza). g) W Makefile moga wystapic definicje zmiennych. Dzieki nim mozna uzyskac bardziej eleganckie Makefile. Definicja zmiennej ma postac nazwa = wartosc. potem uzywa sie tych zmiennych jak zmiennych interpretera polecen, poprzedzajac znakiem dolara. Wartosci zmiennych moga byc takze pobierane ze srodowiska, ale definicje w pliku Makefile sa wazniejsze. * Przeanalizuj plik Makefile2. Skopiuj go do pliku Makefile i wykonaj make clean; make (zamiast kopiowac mozna uzyc opcji -f, np: make clean -f Makefile2) h) W pliku Makefile moga wystapic takze zmienne specjalne. Sa po to, zeby nie trzeba bylo powtarzac identycznych definicji w odniesieniu do wielu plikow. Oto niektore zmienne specjalne: * $@ oznacza nazwe celu danej reguly; * $< to nazwa pierwszego celu, od ktorego cel danej reguly zalezy; * $? lista nazw wszystkich celow, od ktorych cel w danej regule zalezy, a ktore sa nowsze, niz cel reguly; * $^ lista nazw wszystkich celow, od ktorych cel w danej regule zalezy; * $* nazwa celu z usunietym rozszerzeniem (o ile jest ono powszechnie znane; np. .c .cpp .h .cc .C .o sa powszechnie znane); i) w celu zdefiniowania reguly domyslnej uzywa sie reguly, w ktorej w nazwie celu (jako i w zaleznosciach, o ile to potrzebne) wystepuje znak % (dokladnie raz w kazdej nazwie); reguly takie sa stosowane w przypadku, gdy zadna jawna regula nie pasuje do danego, konkretnego celu, ktory trzeba wybudowac; * Przeanalizuj plik Makefile3. Przetestuj jego dzialanie.