Jak Makefiles automatizují kompilaci GCC a šetří vám čas

11

Neustálé psaní dlouhých příkazů gcc je utrpení. Situace se zhoršuje, když neustále přidáváte knihovny nebo provádíte změny v kódu. Makefiles řeší tento problém. Automatizují proces sestavování a eliminují potřebu zadávat stejné příkazy znovu a znovu.

Níže je jednoduchý příklad Makefile. Nahrazuje sekvenci ruční kompilace.

Uložte tento kód do souboru s názvem makefile. Spusťte make a vytvořte spustitelný soubor. Platí jedno přísné pravidlo. Každému řádku obsahujícímu „gcc“ musí předcházet znak tabulátoru. Osm mezer bude mít za následek chybu. Nástroj pro sestavení takový soubor odmítne. Všechny ostatní řádky musí začínat na levém okraji.

Pochopení závislostí

V Makefile jsou dva typy čar. Řádky začínající od levého okraje jsou závislosti. Definují vztahy mezi soubory. Řádky odsazené tabulátory jsou spustitelné příkazy. Mohou to být jakékoli platné příkazy systému UNIX.

Zvažte tento řádek:
main.o: main.c util.h

To znamená, že main.o závisí na main.c a util.h. Pokud se některý ze zdrojových souborů změní, provede se příkaz, který následuje. Znovu vytvoří main.o.

První řádek v souboru je speciální. Definuje konečný cíl (cíl). V tomto případě je to spustitelný soubor main. Uvádí závislosti main.o a util.o. Pokud jsou tyto soubory objektů novější než původní, Make je znovu sestaví. Poté je spojí do konečného binárního souboru.

Tento příkaz se provede pouze v případě, že se změnily závislosti. Pokud se nic nezměnilo, Make nedělá nic. To je hlavní výhoda. Přeskočí práci, která již byla vykonána.

Proč je to důležité pro váš pracovní postup

Velké programy mají mnoho knihoven a zdrojových souborů. Ruční sledování toho, které soubory se změnily, může být snadné dělat chyby. Makefile to dělá automaticky. Přestaví jen to, co je potřeba. Změnili jste jeden soubor záhlaví. Make znovu sestaví všechny zdrojové soubory, které jej obsahují. Změnili jste pomocnou funkci. Make znovu sestaví pouze tento objektový soubor a znovu propojí spustitelný soubor.

Abyste mohli používat tuto logiku, nemusíte být v systému UNIX. Většina moderních kompilátorů a vývojových prostředí (IDE) obsahuje podobné funkce. Zkontrolujte dokumentaci ke kompilátoru. Hledejte nástroje pro automatizaci sestavení. Na vnitřní úrovni fungují stejným způsobem.

To nás přivádí zpět k hlavičkám jako stdio.h. V předchozích příkladech jste je zahrnuli, aniž byste vysvětlili proč. Jedná se o standardní knihovny. Někdo je napsal před mnoha lety. Byly vám předloženy, aby nebylo nutné znovu vynalézat základní funkce. Makefiles a standardní knihovny jsou součástí stejné filozofie. Umožňují vám soustředit se spíše na logiku než na standardní kód.

Nástroj je jen tak dobrý, jak dobrá jsou jeho pravidla. Pokud nejsou vaše závislosti správně specifikovány, Make znovu nevybuduje, co by měl. Nebo hůře, vytvoří starší kód. Zkontrolujte znaky tabulátoru. Ujistěte se, že názvy souborů jsou správné. Získejte správnou syntaxi a kompilátor udělá většinu práce.

Možná se ptáte, kdy může být ruční kompilace rychlejší. Pro jeden soubor – možné. Ale jakmile provedete změny v záhlaví souboru v projektu s mnoha soubory, ruční metoda prohraje. Začnete kopírovat příkazy. Začnete dělat překlepy. Začnete se divit, proč nebyl main.o aktualizován.

Přechod od zadávání příkazů k definování pravidel je skutečným přínosem. Vy definujete stát. Nástroj poskytuje přechody. Je to malá změna návyků. Při každé další stavbě se to vyplatí.