Řízení překladu (make a soubor Makefile)

Z Milan Kerslager
Verze z 9. 3. 2010, 20:31, kterou vytvořil Milan.Kerslager (diskuse | příspěvky) (Další cíle příkazu make: doplnění)
Přejít na: navigace, hledání

Nástroj make umožňuje pomocí předisů provádět jednoduše podmíněnou kompilaci. Předpisy se obvykle umisťují do souboru Makefile.

Ruční překlad programu

Mějme jednoduchý program v souboru ahoj.c:

#include <stdio.h>
void main()
{
  printf("Ahoj svete!\n");
}

Kompilaci provedeme příkazem:

gcc -Wall -o ahoj ahoj.c

Přeložený program můžeme spustit:

./ahoj

Automatický překlad

Automatický překlad pak může obstarat níže uvedený jednoduchý soubor Makefile. Při přepisování souboru je důležité dát pozor na to, že výkonné řádky MUSÍ začínat znakem tabelátor (tj. tabelátor je na začátku řádku s příkazem gcc):

ahoj: ahoj.c
        gcc -Wall -o ahoj ahoj.c

Ve výše uvedeném příkladu je zavedeno pravidlo s názvem ahoj. Protože je v souboru uvedeno jako první, je i tzv. implicitním pravidlem. Na začátku řádku je až ke znaku dvojtečka uveden název pravidla. Pak jsou uvedeny závislosti, podle kterých bude rozhodnuto, jestli se mají provést výkonné řádky, které následují. V tomto případě se posuzuje, zda soubor ahoj je novější, než soubor ahoj.c.

Zavoláme-li příkaz make (bez parametru), dojde k přeložení programu podle implicitního pravidla (zde prvního uvedeného, tj. podle pravidla ahoj). Zavoláme-li jej znovu, oznámí nám, že překlad není nutný. Důvodem je fakt, že soubor ahoj.c je staší, než soubor ahoj (zdrojový text je starší, než přeložený program). Budeme-li editovat soubor ahoj.c, bude čas jeho poslední změny novější, než čas poslední změny přeloženého programu (soubor ahoj). Proto bude po zavolání příkazu make opět provedena kompilace. Aby nebylo nutné editorem soubor otevřít, provést změnu a výsledek uložit, lze využít příkaz touch ahoj.c, který změní čas poslední modifikace souboru.

Další cíle příkazu make

Cíle jsou v souboru Makefile pravidla (návěští), která lze provést tak, že jejich název přidáme jako parametr příkazu make. Následující soubor Makefile definuje pravidla help a clean:

help:
       @echo "Program $(NAZEV) verze $(VERZE)"
       @echo "Pouziti: make prikaz"
       @echo "prikaz:  help  - napoveda"
       @echo "         ahoj  - prelozit program"
       @echo "         clean - smazat binárku"

ahoj: ahoj.c
        gcc -Wall -o ahoj ahoj.c

clean:
       rm -f ahoj

Zadáme-li příkaz make bez parametru, provede se implicitní pravidlo (první pravidlo v souboru), což je help. Pro vyvolání dalších pravidel je potřeba, aby bylo pravidlo zadáno příkazu make jako parametr. Zavináč před příkazy echo způsobí, že se prováděný příkaz nebude vypisovat (tj. nebude vidět řádek s příkazem) a bude tedy vypsán pouze výstup tohoto příkazu.

Vyzkoušejte a porovnejte výstup následujících příkazů:

make
make help
make ahoj
make clean

První příkaz provede implicitní pravidlo, takže je vypsána nápověda, což provede též druhý řádek. Třetí řádek způsobí překlad programu. Čtvrtý řádek smaže přeložený soubor, takže po novém vyvolání překladu dojde k novému překladu. Pravidlo clean smaže vytvořený binární soubor. Takové pravidlo zpravidla maže všechny soubory, které lze znovu získat ze zdrojových souborů, které jsou ponechány.

Cvičení

Příklad 1
Vytvořte Makefile pro svůj program.
Příklad 2
Vytvořte soubor Makefile, který bude umět tyto činnosti: all, program, test, debug, clean. Cíl all přeloží a otestuje vás program, cíl program (tj. název vašeho programu) program jen přeloží, cíl test ho otestuje (tj. spustí s různými parametry a zkontroluje výstup), cíl debug program přeloží včetně ladících informací a cíl clean smaže všechny soubory (včetně dočasných ze sekce test), kromě souborů nutných pro opětovný překlad programu.
Příklad 3
Vytvořte soubory Makefile ve stromové struktuře adresářů. Hlavní soubor Makefile v kořenovém adresáři této struktury bude volat soubory Makefile v podadresářích.

Další zdroje

Příkaz make a struktura řídícího souboru Makefile je také vysvětlena v textu od Michaely Knorrové (PDF, ODT, HTML, DOC).