Řízení překladu (make a soubor Makefile): Porovnání verzí

Z Milan Kerslager
Přejít na: navigace, hledání
(Použití maker: doplnění)
m (Ruční překlad programu: fix)
Řádka 7: Řádka 7:
 
<source lang="C">
 
<source lang="C">
 
#include <stdio.h>
 
#include <stdio.h>
#define VERZE 1
+
#ifndef VERZE
 +
  #define VERZE 1
 +
#endif
  
 
void main()
 
void main()

Verze z 10. 3. 2010, 06:38

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>
#ifndef VERZE
  #define VERZE 1
#endif

void main()
{
  printf("Ahoj svete! Verze programu: %d\n", VERZE);
}

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.

Použití maker

Makra umožňují používat uvnitř souborů Makefile používat proměnné a též přenášet hodnoty jejich hodnoty do překládaných programů (proto jsou označovány jako makra – stejně jako pro preprocesor jazyka C). Níže uvedený příklad rozvíjí předchozí soubor Makefile o použití maker. Zavedeno je makro NAZEV se jménem programu, VERZE pro číselné vyjádření verze programu a je též použito standardní makro CFLAGS, které obvykle obsahuje parametry pro překladač. Všimněte si použití maker v pravidlu help a v pravidlu ahoj.

NAZEV=Ahoj
VERZE=2
CFLAGS=-Wall

all: ahoj

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
        $(CC) $(CFLAGS) -DVERZE=$(VERZE) -o ahoj ahoj.c

clean:
        rm -f ahoj

Ve výše zmíněném příkladu je použito pravidlo all, které obvykle slouží k zajištění úplného překladu celého projektu, který se může skládat z více kroků (z volání více jednotlivých pravidel). Makra je možné pomocí volání kompilátoru předat i do překládaného programu (viz pravidlo ahoj ve výše zmíněném překladu). Makro lze předefinovat při volání příkazu make:

make VERZE=3

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.

Externí odkazy