GNU Make je nástroj, který pomáhá generovat spustitelné programy ze zdrojového kódu a také zpracovávat další non-zdrojové soubory z projektu. Make získá logiku sestavení spustitelných souborů a zpracování dalších nesource souborů ze souboru s názvem a makefile nebo a Makefile.
Proč dělat?
-
Make je de-facto nástroj pro vytváření spustitelných programů ze zdrojového kódu ve světě open source.
-
Make umožňuje koncovým uživatelům vytvářet spustitelné programy bez znalosti technických podrobností o tom, jak je vytvářet.
-
Všechny podrobnosti o tom, jak vytvářet spustitelné soubory a zpracovávat jiné než zdrojové soubory, jsou uvedeny v souboru makefile - takže proces se stává opakovatelným pro všechny lidi nebo systémy, které se pokoušejí vytvořit projekt.
-
Pokud je základna kódu velmi velká, pak je časově náročné a problematické sestavení spustitelného souboru od nuly, když je změna zdrojového kódu velmi malá. Make se o to postará. Sleduje, které soubory se mění, a podle toho řeší závislost, aby vytvořila znovu sestavit konkrétní část programu.
-
Make je programovací jazyk agnostický. Nezáleží na tom, jaký programovací jazyk nebo jaký dialekt z nich používáte. Makefile je textový soubor příkazů shellu strukturovaných strukturálně se závislostí a další logikou pro vytváření programu a správu dalších souborů, které nejsou zdrojové. Jelikož se jedná o spoustu příkazů prostředí, lze jej spustit kdekoli, kde příkazy prostředí běží. Windows ve výchozím nastavení nespouštějí příkazy linuxového shellu, ale můžete to udělat s jeho specializovanou verzí pro Windows.
-
Během vytváření spustitelných programů je vytvořeno mnoho mezilehlých souborů, které tam po dokončení budovy nemusí být. Make tyto soubory automaticky odstraní. Pomáhá udržovat čisté prostředí a šetří spoustu drahocenného času.
Instalace značky
Samotné vytváření nestačí k vytváření programů. Chcete-li vytvářet programy ze zdroje, musíte mít ve svém systému nainstalované kompilátory a další nástroje. Pro náš účel tedy potřebujeme celou sadu vývojových nástrojů.
Ke kompilaci zdrojů v systému Linux existuje balíček nazvaný „build-essential“ v systémech založených na Debianu (např.G. Ubuntu, Linux Mint atd.) A „Vývojové nástroje“ na Red Hat a CentOS.
Chcete-li to nainstalovat na systémy založené na Debianu:
apt-get install build-essential
Chcete-li toto nainstalovat na CentOS a Red Hat, postupujte takto:
yum groupinstall "Vývojové nástroje"
Začínáme s Makefile
Začněme tím, že napíšeme a Ahoj světe program s programovacím jazykem C.
Hlavní funkce našeho programu C bude uvnitř hellomain.C. Obsah souboru by měl vypadat takto:
#zahrnoutint main () my_fun (); návrat 0;
Tento kód obsahuje záhlaví souboru hellofun.h, který obsahuje deklaraci funkce s názvem hello_fun (). Obsah hellofun.jeho:
void my_fun ();
Definice my_fun () žije uvnitř hellofun.C:
#zahrnout#zahrnout void my_fun () printf ("Hello World!\ n "); návrat;
Jedná se o velmi jednoduchý program a mohli bychom jej zkompilovat pomocí gcc pouze s jedním příkazovým řádkem. Programy v reálném životě však nejsou tak jednoduché a tak malé. Věci se začnou komplikovat opravdu brzy. Níže budu psát potřebný skript makefile pro kompilaci tohoto programu hello world. V následujících částech vysvětlím jeho různé části.
hellomain: hellomain.c ahoj zábava.c gcc -o ahoj hellomain.c hellomain.c -I.
Udržujte tento kód v souboru zvaném makefile (bez jakékoli přípony souboru). Vložte soubor do adresáře, kde jsou soubory C. Namiřte příkazový řádek do tohoto adresáře. Na příkazový řádek napište make a stiskněte klávesu enter. V aktuálním adresáři bude vygenerován spustitelný soubor s názvem ahoj. Výsledek můžete ověřit spuštěním spustitelného souboru pomocí následujícího příkazu.
./Ahoj
Výstupy:
Ahoj světe!
Pravidla, cíle a závislosti
Skript makefile je sbírka pravidel. Pravidla dávají pokyn Vytvořit způsob vytvoření cíle nebo výstupu ze zdrojových nebo jiných souborů. Pravidlo také určuje závislosti cíle. Pravidla závislosti musí být provedena nejprve v závislosti na tom, zda je již zpracována pohledem na časová razítka. V našem příkladu makefile výše, máme pravidlo s názvem cíle hellomain a jeho závislosti. Cílový název je ze seznamu závislostí oddělen dvojtečkou. Příkazy prostředí, které budou provedeny, jsou uvedeny v následujícím řádku. Příkazy prostředí musí začínat znakem tabulátoru.
Pokud v příkazu make nezadáte žádný parametr, provede se první cíl. V našem příkladu jsme neurčili žádný parametr a měli jsme hellomain jako první a jediný cíl.
Proměnné
Proměnné jsou skvělý způsob, jak jednorázově zapsat hodnotu a použít ji opakovaně, aniž by se hodnota opakovala znovu a znovu. Pomáhá nám udržovat náš kód SUCHÝ (Neopakujte se). Pokud někdy potřebujete změnit nějakou hodnotu v celém skriptu, stačí ji změnit na jednom místě tak, aby odrážela změnu všude, pokud používáte proměnnou.
V našem příkladu jsme použili gcc jako překladač, ale možná budeme muset změnit překladač na něco jiného. Název kompilátoru tedy můžeme ponechat v proměnné. Můžeme také ponechat příznaky kompilátoru v jiné proměnné, abychom to mohli znovu použít. Pro nastavení hodnoty do proměnné používáme znaménko rovná se (=) a ke čtení této proměnné používáme $ (název_měnné).
CC = gcc CFLAGS = -I. hellomain: hellomain.c ahoj zábava.c $ (CC) -o ahoj hellomain.c hellomain.c $ (CFLAGS)
Čištění prostředí
Možná často budeme muset vyčistit své prostředí. Pokud chceme, aby byla každá část našeho projektu přestavěna od nuly, musíme ji vyčistit. V našem jednoduchém příkladu je jediný vygenerovaný soubor Ahoj spustitelný. Bez ručního mazání to můžeme smazat pomocí make. Můžeme tedy vytvořit pravidlo a pojmenovat cíl jako čistý.
CC = gcc CFLAGS = -I. hellomain: hellomain.c ahoj zábava.c $ (CC) -o ahoj hellomain.c hellomain.c $ (CFLAGS) clean: rm ahoj
Příkaz shellu v čistém cíli je jen starý příkaz prostředí rm. Nyní z příkazového řádku spusťte:
vyčistit
Podívejte se na aktuální adresář a zjistěte, že Ahoj spustitelný soubor je pryč.
Rozšíření našeho příkladu k vyřešení dalších problémů
V našem jednoduchém příkladu kompilace hello world máme problém, který jsme dosud nevyřešili. hellomain terč se dívá na hellomian.C a ahoj zábava.C časové značky souborů při příštím pokusu o jejich překompilaci udělat nebo udělat hellomain. Pokud tedy některý z těchto dvou souborů změníte, budou znovu zkompilovány. Ale pokud se změníte ahoj zábava.h pak to nebude překompilovat. To je nečekané!
Opět jsme přeskočili střední úroveň. Negenerovali jsme soubory objektů a přímo generovali spustitelný soubor. Ale za scénou jsou soubory objektů vytvořeny v dočasném adresáři a odstraněny. Před vytvořením spustitelného souboru chceme vygenerovat soubory objektů. Tentokrát pojmenujeme hlavní cíl jako Všechno
vše: hellomain.o ahoj.o gcc hellomain.o ahoj.o-o ahoj hellomaine.o: hellomain.c ahoj zábava.h gcc -I. -c hellomain.c ahoj zábava.o: hellofun.c ahoj zábava.h gcc -I. -c ahoj zábava.c clean: rm -rf *.o rm ahoj
Spusťte příkaz make znovu, abyste zjistili, zda se váš program úspěšně vytváří nebo ne. Spusťte spustitelný soubor ahoj a ověřte výsledek. Podívejte se na aktuální adresář a uvidíte, že jsou vytvářeny soubory objektů. Přidali jsme do čistého cíle ještě jeden řádek k vyčištění souborů objektů. Tento skript makefile pomůže překompilovat světový program Hello, i když ahoj zábava.h soubor je upraven.
Závěr
Make je jedním z nejdůležitějších nástrojů pro linuxové uživatele a programátory. Pokud jste koncovým uživatelem, pak vám znalost značky pomůže opravit mnoho rozbitých věcí ve vašem světě linuxu. Pokud jste programátor, nemůžete odejít psaním kódu a nechat své uživatele přijít na to, jak tento zdrojový kód zkompilovat do spustitelných souborů. Musíte vytvořit skript makefile pro koncové uživatele, aby nehráli nějakou hru s hádkami, aby váš zdroj zkompilovali do spustitelných souborů.
Reference
Domovská stránka projektu GNUMake
GNU Vytvořit dokumentaci