Search
Cílem cvičení je seznámit se s nástroji, které usnadní vývoj větších projektů: verzovací systém git a sestavovací program make.
V následujících bodech se řiďte návodem Instalace a nastavení GITu.
SSH
Pro porobnější seznámení s Gitem doporučujeme knihu Pro Git, kterou napsal Scott Chacon (webová verze v české verzi) a knižně ji v češtině vydal CZ.NIC (pdf).
Cílem cvičení je naučit se automatizovat překlad a sestavení (linkování) větších projektů, kde např. existují závislosti (tj. je nutné program překládat v určitém pořadí, které však není bez hlubšího zkoumání zjevné. Budeme používat GNU Make.
Program make se řídí pravidly definovanými v textovém souboru, který se nejčastěji jmenuje makefile nebo Makefile. Pokud se předpis pro sestavování cílů jmenuje jinak, lze ho předat make s parametrem -f.
makefile
Makefile
-f
Pravidlo definuje, co je potřeba a jakým postupem se dojde k vytvoření daného cíle (objektový soubor, …)
myprog: myprog.c module.c gcc myprog.c module.c -o myprog
Konvence: před příkazem je tabulátor, posloupnost příkazů končí prázdnou řádkou.
Pro každý cíl by mělo být definováno právě jedno pravidlo, ale existují výjimky:
target1: file1.c file2.c file3.c target1: file4.c file5.c file6.c gcc -c $^
$^ je automatická proměnná, která v tomto případě reprezentuje seznam závislostí s mezerami mezi jednotlivými jmény. Je-li jeden cíl definován více pravidly, tak jen jedno pravidlo obsahuje příkazovou část.
$^
Explicitní pravidla definují splnění konkrétního cíle
main: main.c model.c data.c gcc $^ -o $@
$@ je automatická proměnná, která reprezentuje úplný název cíle.
$@
Implicitní pravidla jsou obecná pravidla, která definují, jak vznikají celé množiny cílů (soubory určitého typu, daného příponou)
.c.o: gcc -c $<
Cíl (pokud není symbolický) určuje, co je výsledkem příslušného pravidla. V makefile může být více cílů, nesmí být pojmenovány shodně.
app: main.o model.o data.o gcc $^ -o app model.o: model.c gcc -c $^
Je-li v seznamu závislostí soubor, který v souborovém systému neexistuje, aplikuje se pravidlo, které ho vytvoří.
Symbolický cíl umožňuje vykonat několik akcí současně. Musí mít jedinečné jméno, tj. v aktuálním adresáři nesmí existovat soubor toho jména.
all: app.exe install.exe app.exe: main.o gui.o engine.o gcc $^ -o $@ -lm install.exe: install.o diskio.o gcc $^ -o $@
Makra rozšiřují možnosti make o definici konstant.
make
SRCEXT=.c SOURCES=module1.c module2.c module3.c OPTIONS=-lm -O2
Makro lze definovat i při volání make, podobně jako při překladu:
make -DSOURCES="main.c gui.c"
Pokud je stejné makro použito i v makefile, je použito přednostně.
Příklady:
CFLAGS=-lm INCL=defs.h consts.h .c.o: $(CC) -c $(CFLAGS) $(INCL) $<
Někdy se může hodit také označení některého cíle jako .PHONY. Toto klíčové slovo je primárně určeno pro cíle, jejich produktem není soubor, ale lze jej využit i pro vynucení překladu.
.PHONY
.PHONY app app: app.c $(CC) $^ -o $@