Make

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

Program make je utilita pro automatizaci překladu zdrojových kódů do binárních souborů (spustitelné soubory ELF, EXE, knihovny a podobně). Soubor nazvaný Makefile určuje postup utility make při překladu a definuje závislosti mezi zdrojovými soubory. Při sestavování cíle sleduje make topologické seřazení v Makefile. Přestože jsou dnes v oblibě různá integrovaná vývojová prostředí (IDE) a jazykově specifické kompilátory, je make a tedy i Makefile stále široce využíván, zvláště pak na unixových platformách.

Původ

Přestože existuje mnoho utilit sledujících závislosti souborů při kompilaci, make je jednou z nejrozšířenějších. Mezi nejrozšířenější se řadí díky tomu, že existuje v Unixu již od verze PWB/UNIX 1. +more Tato verze se vyznačovala množstvím nástrojů zaměřených na vývoj software. Make byl původně vytvořen Stuartem Feldmanem v roce 1977 v Bellových laboratořích. V roce 2003 byla Dr. Feldmanovi udělena cena ACM Software System Award za vynález tohoto důležitého nástroje.

Před představením make se Unixový překladový (dále jen build) systém skládal z "make" a "install" shellových skriptů doprovázejících zdrojové kódy. Schopnost kombinace příkazů pro různé cíle v jednom souboru, abstrakce řešení závislostí a archivace byly důležitým krokem směrem k moderním build systémům.

Moderní verze

Kód programu make prošel množstvím úprav a také byl několikrát zcela přepsán. Všechny varianty ovšem používaly stejný formát souboru Makefile a stejné základní algoritmy. +more Postupem času vznikly varianty obsahující množství vlastních nestandardních vylepšení. Některé z nich jsou: * BSD make, který je odvozen z verze Adama de Boora na verzi make schopnou vytvářet cíle paralelně. Tato verze si je schopná poradit s modifikacemi pro FreeBSD, NetBSD a OpenBSD. Nejzajímavějšími vlastnostmi jsou podmínky a opakovací smyčky, které jsou aplikovatelné v parsovací části. Jsou využívány při programátorském přístupu ke konstrukci Makefile, který generuje cíle v runtime. * GNU Make, který je součástí Linuxových distribucí, je často zmiňován ve spojení s GNU build systémem. Jeho rozdíly od tradičního make jsou nejvíce zřetelné v porovnávání šablon v grafech závislostí a sestavování cílů. Stejně tak tomu je u množství funkcí, které mohou přinutit make například získat seznam souborů v konkrétním adresáři. * Microsoft nmake, dostupný ve Windows. Z pohledu schopností nabízí oproti dvěma výše zmíněným variantám pouze základní vlastnosti. Microsoft nmake nemá nic společného s nmake z AT&T a Bell Labs pro Unix.

POSIX obsahuje standardizaci základních dovedností a operací make utility. Make je implementuje v různých stupních. +more Obecně mohou být jednoduché varianty souboru Makefile využívány bez problémů různými verzemi nástroje make. Některé verze GNU make a BSD make nejdříve hledají soubory nazvané "GNUmakefile", resp. "BSDmakefile", které umožňují rozlišit chování specifické pro konkrétní variantu nástroje make.

Výhody a nevýhody

Make vyžaduje od programátora manuální popis všech závislostí mezi soubory projektu. Zmíněný postup je ovšem náchylný k chybám. +more Při opomenutí některé závislosti není chyba okamžitě zřejmá. Pomoci může vytvoření Makefile generujícího závislosti, ale častěji se využívá řešení s využitím speciálního generátoru, např. nástroje automake poskytovaného GNU projektem.

Další problém, který není dobře řešen, je tvoření kompilačního procesu na míru platformy. Například kompilátor užívaný na jedné platformě nemusí akceptovat některé volby využívané jiným. +more Tento problém je řešen generováním platformě specifických instrukcí kompilátoru, které jsou zpracovány make. Využívá se nástroje autoconf a CMake.

Make využívá v souboru Makefile syntaxi, která používá tabulátor a bílé znaky. Neexistuje mnoho textových editorů, které by podporovaly názorné zobrazení rozdílů mezi bílými znaky a usnadnily tím tvorbu Makefile. +more Znaky tab také nebývají jednotně reprezentovány. Kvůli těmto problémům je syntaxe Makefile často kritizována. Některé projekty jako Apache Ant se snažily předělat lepší syntax make, což je to vcelku nepodstatné pro programátory využívající generátory Makefile.

S příchodem moderních IDE (hlavně na ne-unixových platformách) se velmi málo programátorů zaobírá manuální správou závislostí mezi soubory projektu. Úkol správy závislostí je přenesen na IDE, kde je automatizován. +more Stejně tak mnoho moderních programovacích jazyků používá jazykově-specifické způsoby výčtu závislostí, které jsou efektivněji rozpoznány s použitím jazykově-specifických kompilačních utilit.

Make je považován za deklarativní programovací jazyk a tyto jazyky jsou někdy považovány za složitější pro programátory zvyklé na příkazové programovací jazyky.

Struktura Makefile

Makefile se skládá z řádků textu definujících závislost cíle na souborech. Cílem může být množina souborů, nebo název pravidla. +more Např. výstupní soubor kompilace je značen jako cíl závislý na svých zdrojových souborech a souborech odkazovaných interně. Po řádku naznačujícího závislosti může následovat série příkazových řádků. Příkazové řádky se označují odsazením pomocí tabulátoru. Příkazové řádky definují transformaci vstupu do výstupu. Transformace se aplikují pouze tehdy, pokud je cíl starší než některý ze souborů/odkazů, na kterých je závislý. Základní struktura je:.

# Komentář cíl: závislost příkaz 1 příkaz 2 . . . příkaz n

Makefile může obsahovat definice proměnných a odkazovat se na jiné Makefile. Proměnné v Makefile mohou být přepsány příslušnými argumenty z příkazového řádku při spouštění make. +more Tímto způsobem lze specifikovat rozdílné chování při sestavování cíle. Například proměnná "CC" je často používána v Makefile jako odkaz na kompilátor jazyka C, ovšem uživatel si může přát použít alternativní kompilátor.

Sufixová pravidla

Sufixová pravidla umožňují definovat závislosti a způsob vytváření souborů podle přípon jmen souborů. Například pravidlo, že z každého zdrojového souboru v jazyce C s příponou . +morec lze překladačem cc získat cílový soubor s příponou . o lze zapsat pravidlem:.

.c.o: cc $

Řetězce $@ a $ jsou tak zvané automatické proměnné a zastupují cílové jméno, respektive tzv. „implicitní“ zdroj. +more Existuje mnoho dalších automatických proměnných.

Automatické proměnné

ProměnnáVýznam
$@jméno cíle
$jméno první závislosti
$+jména všech závislostí (včetně jejich opakování)
$^jména všech závislostí bez opakování, u členů knihoven pouze jejich jména
$. jména všech závislostí, které jsou novější než cíl
$%jméno závislosti bez jména knihovny
$kořen jména (část odpovídající znaku % ze sufixového pravidla, resp. +more jméno předpokladu z explicitního pravidla bez přípony)
.

Příklad Makefile

Níže je uveden velmi jednoduchý Makefile, který definuje kompilaci zdrojového souboru nazvaného helloworld. c s použitím cc jako kompilátoru jazyka C. +more PHONY tag je specialita, která příkazu make oznamuje, které názvy cílů nejsou soubory.

helloworld: helloworld.o cc -o $@ $<

helloworld.o: helloworld.c cc -c -o $@ $<

.PHONY: clean

clean: rm -f helloworld helloworld.o

Reference

Externí odkazy

[url=http://www. linux. +morecz/noviny/1999-0304/clanek12. html]Rychlo-školička pro Makefile[/url] * [url=http://www. abclinuxu. cz/stitky/makefile]Soubor článků s tématem Makefile[/url] * [url=https://web. archive. org/web/20150213204017/http://www. linuxsoft. cz/article. php. id_article=722]Překlad s gcc[/url] * [url=https://web. archive. org/web/20080619022255/http://www. linuxsoft. cz/article. php. id_article=740]Makefile pro větší projekty[/url] * [url=http://www. fit. vutbr. cz/~martinek/clang/make. html]Správa projektů pomocí programu Make[/url].

* [url=http://www. opengroup. +moreorg/onlinepubs/009695399/utilities/make. html]The Open Group Base Specifications Issue 6 IEEE Std 1003. 1, 2004 Edition manual[/url] * [url=http://www. gnu. org/software/make/manual/html_node/index. html]The GNU make manual[/url] * [url=http://www. freebsd. org/cgi/man. cgi. query=make&sektion=1]FreeBSD make manual page[/url] * [url=http://www. opussoftware. com/tutorial/TutMakefile. htm]OPUS Makefile Tutorial[/url] * [url=https://web. archive. org/web/20060820145556/http://www. pcug. org. au/~millerp/rmch/recu-make-cons-harm. html]Recursive Make Considered Harmful[/url] * [url=https://web. archive. org/web/20080511154751/http://freshmeat. net/articles/view/1702/]What is wrong with make. [/url] * [url=http://www. conifersystems. com/whitepapers/gnu-make/]What’s Wrong With GNU make. [/url] * [url=http://make. paulandlesley. org/autodep. html]Advanced Auto-Dependency Generation[/url]. * [url=http://gmsl. sourceforge. net/]GNU make Standard Library[/url].

Kategorie:Překladače Kategorie:Unixové programátorské nástroje

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top