Tipy a triky
V následujících odstavcích najdeme velmi jednoduché avšak učinné tipy, které nám pomůžou ulehčit sestavení naší aplikace.
Generování závislostí
V dosud uvedených příkladech souborů makefile jsme v pravidlech pro kompilaci vždy řešili pouze závislosti objektových souborů na zdrojových. Naučili jsme se používat šablony pravidel, abychom nemuseli tyto závislosti pro každý objektový soubor vypisovat ručně.
Do zdrojových souborů ovšem vkládáme také hlavičkové soubory. Změna obsahu hlavičkových souborů díky tomu způsobí i změnu v daném zdrojovém souboru. Tuto závislost ovšem nemáme v makefile zachycenu, takže při změně hlavičkových souborů vkládaných do zdrojového souboru nedojde k překompilování příslušného objektového souboru. Make totiž nemá z čeho poznat, že hlavičkový soubor je novější než dotčený objektový soubor.
Aby make při vyhodnocování pravidel kontroloval i změnu hlavičkových souborů, museli bychom pravidla psát takto:
modul1.o: modul1.c modul1.h modul2.h
Pak by byl objektový soubor modul1.o překompilován vždy, když by se změnil zdrojový soubor modul1.c a/nebo jeho hlavičkový soubor modul1.h a/nebo hlavičkový soubor druhého modulu modul2.h.
Je evidentní, že ruční údržba závislostí by byla velmi namáhavá. Naštěstí nám kompilátor, resp. preprocesor vychází vstříc. Volbou -MM mu můžeme přikázat, aby prošel všechny zdrojové a hlavičkové soubory a vygeneroval soubor pravidel, která popisují závislosti objektových souborů na zdrojových a hlavičkových souborech. Tento vygenerovaný soubor pak vložíme do našeho makefile.
Upravme si makefile z výpisu 4 tak, aby generoval soubor pravidel se všemi závislostmi a zároveň jej vložil do našeho makefile:
1all: hello 2 3dep: 4 $(CC) -MM *.c > deps.list 5 6# vlozeni souboru se zavislostmi 7-include deps.list 8 9hello: modul1.o modul2.o 10 gcc modul1.o modul1.o -o hello 11 12%.o: %.c 13 gcc -c -o $@ $< 14 15.PHONY: all 16.PHONY: dep
Na výpisu 8 vidíme, že přibyl nový cíl dep (řádek 3), který slouží pro vytvoření souboru pravidel. Dále přibyl řádek 7, který zajistí, že obsah souboru pravidel (pokud existuje) je vložen do našeho makefile (podobně jako hlavičkový souboru do zdrojového souboru).
A jak to funguje? Make při sestavování programu vloží do našeho makefile obsah souboru s pravidly, která jsou uvedena ve tvaru:
modul1.o: modul1.c modul1.h modul2.h
Protože tyto vložená pravidla neobsahují žádné příkazy, make je chápe pouze jako rozšíření seznamu závislostí (komponent) objektových souborů.
Při vyhodnocení šablony pravidla (řádek 12) proto nejprve make pro daný objektový soubor provede sloučení jeho závislostí uvedených v této šabloně se závislostmi vloženými ze souboru pravidel. Následně make po vyhodnocení sloučeného seznamu závislostí zkompiluje příslušný objektový soubor.
Na začátku, když souboru pravidel neexistuje, jej musíme vytvořit voláním utility make s parametrem dep. Pak je potřeba jej vždy při změně závislostí (vytvoření nového zdrojového či hlavičkového souboru nebo změna závislosti zdrojového souboru na hlavičkových souborech) aktualizovat.