GNU Make

Super podrobný návod k celému Make můžete najít zde.

Tento návod je výsledkem vlastního pozorování a používání makefilu a nějakých informací z odkazu výše - neberte ho jako stoprocentně správnou věc.

Pravidla Makefilu

Zde můžete stáhnout všechny tři verze makefilu, které jsem ukazoval na cvičení.

Každý Makefile soubor obsahuje pravidla, která vypadají takto:

target: prerequisites …
    recipe
    …
    …

target neboli cíl je jméno souboru, který se má vygenerovat nebo pojmenování akce, která se má provést.
prerequisites jsou vstupní soubory, na kterých vytvoření daného cíle závisí.
recipes je seznam akcí, které se mají vykonat.

Build zavoláte příkazem make target kde target je jeden z těch, tkeré máte ve svém makefilu. V případě, že zavoláte pouze make, použije se první z nich.

Pokud je target jméno souboru, kouká se makefile na datum poslední změny jeho prerekvizit a v případě, že jsou od poslední kompilace nezměněné, nebudou se tyto soubory kompilovat znovu. Díky tomu můžete pracovat na jednom souboru své práce a při každém zavolání make all se znovu zkompiluje pouze to, co se změnilo.

Makefile také může obsahovat proměnné, jejich použit můžete vidět v přiloženém archivu ze cvičení.

Poznámky k přiloženým makefilům

První soubor je velmi jednoduchý a zbytečně se v něm opakuje kód, jinak je ale funkční (až na správnou kompilaci při změně hlavičky - viz třetí).

Druhý makefile obsahuje vylepšení odstranění redundance kódu pomocí matchování (%).
Dále obsahuje direktivu .PHONY, která určuje, že dané targets nejsou jména souborů, ale jména pravidel. Bez této direktivy by například existující soubor clean způsobil, že se příkazy rm v cleanu nikdy nezavolají.

Třetí makefile upravuje správně prerequisites. Hlavičkové soubory jsou includované zpravidla ve více souborech než pouze v jednom a proto nedává moc smysl při kompilaci jednotlivých souborů dělat závislost pouze na jednu hlavičku. Ve třetí verzi je každý source soubor závislý na všech hlavičkách, což sice způsobí, že jakákoliv změna hlavičkového souboru vyvolá kompilaci všech souborů znovu, na druhou stranu hlavičkové soubory se většinou nemění moc často a to, co se upravuje, je implementace. Díky tomu bude tato verze fungovat vždy i potom ,co změníte hlavičky (u předchozích byste často museli nejprve všechny .o soubory smazat například přes make clean a poté opět volat kompilaci).