GNU Make je nástroj, ktorý pomáha generovať spustiteľné programy zo zdrojového kódu a tiež spracovávať ďalšie súbory, ktoré nie sú z projektu zdrojové. Make získa logiku zostavenia spustiteľných súborov a spracovania ďalších súborov, ktoré nie sú zdrojmi, zo súboru s názvom a makefile alebo a Makefile.
Prečo robiť?
-
Make je de facto nástroj na vytváranie spustiteľných programov zo zdrojového kódu vo svete otvoreného zdroja.
-
Make umožňuje koncovým používateľom vytvárať spustiteľné programy bez toho, aby poznali technické podrobnosti o ich zostavení.
-
Všetky podrobnosti o tom, ako zostaviť spustiteľné súbory a spracovať iné ako zdrojové súbory, sú uvedené v súbore makefile - takže proces sa stáva opakovateľným pre všetkých ľudí alebo systémy, ktoré sa snažia vytvoriť projekt.
-
Ak je kódová základňa veľmi veľká, potom je časovo náročné a problematické zostavenie spustiteľného programu od nuly, keď je zmena zdrojového kódu veľmi malá. Make sa o to stará. Sleduje, ktoré súbory sa menia, a podľa toho rieši závislosť pri zostavovaní a opätovnom zostavení konkrétnej časti programu.
-
Make je programovací jazyk agnostický. Nezáleží na tom, aký programovací jazyk alebo aký dialekt z nich používate. Makefile je textový súbor príkazov shellu štruktúrovaný štruktúrne so závislosťou a inou logikou pre zostavenie programu a správu ďalších súborov, ktoré nie sú zdrojové. Pretože je to veľa príkazov shellu, môže bežať kdekoľvek, kde beží príkaz shell. Windows štandardne nespúšťajú príkazy linuxového shellu, ale môžete to urobiť so špecializovanou verziou pre Windows.
-
Počas vytvárania spustiteľných programov sa vytvára veľa prechodných súborov, ktoré tam po dokončení budovy nemusia byť. Funkcia Make tieto súbory automaticky odstráni. Pomáha udržiavať čisté prostredie a šetrí veľa drahocenného času.
Inštaluje sa značka
Samotné vytváranie nestačí na tvorbu programov. Ak chcete vytvárať programy zo zdroja, musíte mať vo svojom systéme nainštalované kompilátory a ďalšie nástroje. Pre náš účel teda potrebujeme celú sadu vývojových nástrojov.
Na kompiláciu zdrojov v systéme Linux existuje balík s názvom „build-essential“ v systémoch založených na Debiane (napr.g. Ubuntu, Linux Mint atď.) A „Vývojové nástroje“ na Red Hat a CentOS.
Ak to chcete nainštalovať na systémy založené na Debiane:
apt-get install build-essential
Ak to chcete nainštalovať na serveroch CentOS a Red Hat, postupujte takto:
yum groupinstall "Vývojové nástroje"
Začíname s Makefile
Začnime tým, že napíšeme a ahoj svet program s programovacím jazykom C.
Hlavná funkcia nášho programu C bude spočívať vo vnútri hellomain.c. Obsah súboru by mal vyzerať takto:
#includeint main () my_fun (); návrat 0;
Tento kód obsahuje hlavičkový súbor hellofun.h, ktorý obsahuje deklaráciu funkcie s názvom hello_fun (). Obsah hellofun.jeho:
void my_fun ();
Definícia my_fun () žije vo vnútri hellofun.c:
#include#include void my_fun () printf ("Hello World!\ n "); návrat;
Toto je veľmi jednoduchý program a mohli by sme ho skompilovať pomocou gcc iba s jedným príkazovým riadkom. Programy v skutočnom živote však nie sú také jednoduché a také malé. Veci sa skomplikujú naozaj skoro. Ďalej napíšem potrebný skript makefile na zostavenie tohto programu hello world. V ďalších častiach vysvetlím rôzne jeho časti.
hellomain: hellomain.c ahojfun.c gcc -o ahoj hellomain.c hellomain.c -I.
Tento kód uložte do súboru s názvom makefile (bez akejkoľvek prípony súboru). Vložte súbor do adresára, kde sú súbory C. Namierte príkazový riadok do tohto adresára. Na príkazový riadok napíšte značka a stlačte kláves Enter. V aktuálnom adresári sa vygeneruje spustiteľný súbor s názvom ahoj. Výsledok môžete overiť spustením spustiteľného súboru pomocou nasledujúceho príkazu.
./Ahoj
Výstupy:
Ahoj svet!
Pravidlá, ciele a závislosti
Skript makefile je zbierka pravidiel. Pravidlá dávajú pokyn Vytvoriť, ako vytvoriť cieľ alebo výstup zo zdrojových alebo iných súborov. Pravidlo tiež určuje závislosti cieľa. Pravidlá závislostí sa musia najskôr vykonať v závislosti od toho, či už sú tieto údaje spracované pri pohľade na časové pečiatky. V našom príklade makefile vyššie máme pravidlo s pomenovaným cieľom hellomain a jeho závislosti. Cieľový názov je v zozname závislostí oddelený dvojbodkou. Príkazy shellu, ktoré sa vykonajú, sú uvedené v nasledujúcom riadku. Príkazy shellu musia začínať znakom tabulátora.
Ak neurčíte žiadny parameter príkazom make, vykoná sa prvý cieľ. V našom príklade sme neurčili žiadny parameter a mali sme hellomain ako prvý a jediný cieľ.
Premenné
Variabilné sú skvelým spôsobom, ako jednorazovo zapísať hodnotu a použiť ich opakovane bez opakovania hodnoty. Pomáha nám udržať náš kód SUCHÝ (neopakujte sa). Ak niekedy potrebujete zmeniť nejakú hodnotu v celom skripte, musíte ju zmeniť na jednom mieste, aby odrážala zmenu všade, ak používate premennú.
V našom príklade sme použili gcc ako kompilátor, ale možno budeme musieť kompilátor zmeniť na niečo iné. Názov kompilátora teda môžeme ponechať v premennej. Môžeme tiež ponechať príznaky kompilátora v inej premennej, aby sme ich mohli znova použiť. Na nastavenie hodnoty do premennej používame znamienko rovnosti (=) a na čítanie tejto premennej použijeme $ (variable_name).
CC = gcc CFLAGS = -I. hellomain: hellomain.c ahojfun.c $ (CC) -o ahoj hellomain.c hellomain.c $ (CFLAGS)
Čistenie životného prostredia
Možno budeme musieť niekedy vyčistiť svoje životné prostredie. Ak chceme, aby bol každý kúsok nášho projektu prestavaný úplne od nuly, musíme ho vyčistiť. V našom jednoduchom príklade je jediný vygenerovaný súbor Ahoj spustiteľný. Bez toho, aby sme to ručne vymazali, to môžeme vymazať pomocou make. Môžeme pre to vytvoriť pravidlo a pomenovať cieľ ako čistý.
CC = gcc CFLAGS = -I. hellomain: hellomain.c ahojfun.c $ (CC) -o ahoj hellomain.c hellomain.c $ (CFLAGS) clean: rm ahoj
Príkaz shellu v čistom cieli je iba odveký príkaz shellu rm. Teraz z príkazového riadku vykonajte:
urobiť čisté
Pozrite sa na aktuálny adresár a zistite, či Ahoj spustiteľný súbor je preč.
Rozšírenie nášho príkladu na riešenie ďalších problémov
V našom jednoduchom príklade kompilácie hello world máme problém, ktorý sme ešte nevyriešili. hellomain terč sa pozerá na hellomian.c a ahoj zábava.c časové pečiatky súborov, keď ich nabudúce skúsite prekompilovať urobiť alebo urobiť hellomain. Ak teda zmeníte ktorýkoľvek z týchto dvoch súborov, znova sa skompiluje. Ale ak sa zmeníte ahoj zábava.h potom sa to nebude prekompilovať. To je nečakané!
Opäť sme preskočili strednú úroveň. Nevygenerovali sme súbory objektov a priamo vygenerovali spustiteľný súbor. Za scénou sú však súbory objektov vytvorené v dočasnom adresári a odstránené. Pred zostavením spustiteľného súboru chceme vygenerovať súbory objektov. Tentokrát pomenujeme hlavný cieľ ako všetko
všetci: hellomain.o ahojfun.o gcc hellomain.o ahojfun.o -o ahoj hellomain.o: hellomain.c ahojfun.h gcc -I. -c hellomain.c ahojfun.o: ahojfun.c ahojfun.h gcc -I. -c ahojfun.c clean: rm -rf *.o rm ahoj
Znova spustite príkaz make, aby ste zistili, či sa váš program zostavuje úspešne alebo nie. Spustite ahoj spustiteľný súbor na overenie výsledku. Pozrite sa na aktuálny adresár a uvidíte, že sa vytvárajú súbory objektov. Do čistého cieľa sme pridali ešte jeden riadok na vyčistenie súborov objektov. Tento skript makefile pomôže prekompilovať svetový program ahoj, aj keď ahoj zábava.h súbor je upravený.
Záver
Make je jedným z najdôležitejších nástrojov pre používateľov linuxu a programátorov. Ak ste koncovým používateľom, znalosť značky vám pomôže vyriešiť veľa rozbitých vecí vo vašom svete linuxu. Ak ste programátor, nemôžete jednoducho odísť napísaním kódu a nechať svojich používateľov prísť na to, ako kompilovať tento zdrojový kód do spustiteľných súborov. Musíte vytvoriť skript makefile pre koncových používateľov, aby nehrali nejakú hru na hádanie, aby skompilovali váš zdroj do spustiteľných súborov.
Referencie
Domovská stránka projektu GNUMake
GNU Vytvorte dokumentáciu