====== 1. Nástroje - git, make ======
===== Verzovací systém Git =====
Cílem cvičení je seznámit se s nástroji, které usnadní vývoj větších projektů: verzovací systém [[https://git-scm.com/|git]] a sestavovací program [[https://www.gnu.org/software/make/|make]].
==== Úkoly ====
V následujících bodech se řiďte návodem [[courses:b2b99ppc:howtos:git|Instalace a nastavení GITu]].
- Nainstalujte si GIT klienta.
- Vytvořte ''SSH'' klíč.
- Přihlašte se do Gitlabu a vložte veřejný klíč.
- Nakonfigurujte globální vlastnosti vašeho GIT klienta
Pro porobnější seznámení s Gitem doporučujeme knihu **Pro Git**, kterou napsal Scott Chacon (webová verze v [[https://git-scm.com/book/cs/v2|české verzi]]) a knižně ji v češtině vydal [[https://knihy.nic.cz/|CZ.NIC]] ([[https://knihy.nic.cz/files/edice/pro_git.pdf|pdf]]).
===== Řízený překlad - make =====
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 [[https://www.gnu.org/software/make/|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''.
==== Pravidla (rules) ====
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íle (targets) ====
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 ====
Makra rozšiřují možnosti ''make'' o definici konstant.
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 app
app: app.c
$(CC) $^ -o $@