====== 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 $@