Vyhledávání na webu

Stručný úvod do 'Makefiles' ve vývoji softwaru s otevřeným zdrojovým kódem s GNU Make


GNU Make je vývojový nástroj, který určuje části konkrétní kódové báze, které mají být překompilovány, a může vydávat příkazy k provádění těchto operací na kódové bázi. Tento konkrétní nástroj make lze použít s jakýmkoli programovacím jazykem za předpokladu, že jejich kompilaci lze provést z prostředí shell pomocí příkazů.

Abychom mohli používat GNU Make, potřebujeme mít nějakou sadu pravidel, která definují vztah mezi různými soubory v našem programu a příkazy pro aktualizaci každého souboru. Ty se zapisují do speciálního souboru s názvem „makefile“. Příkaz 'make' používá k rozhodnutí databázi 'makefile' a časy posledních úprav souborů které mají být všechny soubory znovu zkompilovány.

Obsah souboru Makefile

makefiles“ obecně obsahují 5 druhů věcí, konkrétně: implicitní pravidla, explicitní pravidla, definice proměnných , směrnice a komentáře.

  1. Explicitní pravidlo určuje, jak vytvořit/předělat jeden nebo více souborů (nazývaných cíle, bude vysvětleno později) a kdy udělat totéž.
  2. implicitní pravidlo určuje, jak vytvořit/předělat jeden nebo více souborů na základě jejich jmen. Popisuje, jak název cílového souboru souvisí s jedním souborem s názvem podobným cíli.
  3. definice proměnné je řádek, který určuje hodnotu řetězce pro proměnnou, která má být později nahrazena.
  4. direktiva je pokyn pro make, aby při čtení makefile udělal něco zvláštního.
  5. Symbol '#' představuje začátek komentáře uvnitř makefiles . Řádek začínající „#“ je jednoduše ignorován.

Struktura souborů Makefiles

Informace, které make říkají, jak překompilovat systém, pocházejí ze čtení databáze zvané makefile. Jednoduchý makefile se bude skládat z pravidel následující syntaxe:

target ... : prerequisites ... 
	recipe 
... 
...

cíl je definován jako výstupní soubor generovaný programem. Mohou to být také falešné cíle, které budou vysvětleny níže. Příklady cílových souborů zahrnují spustitelné soubory, soubory objektů nebo falešné cíle jako čisté, instalovat, odinstalovat atd.

Předpokladem je soubor, který se používá jako vstup pro vytvoření cílových souborů.

recept je akce, kterou provede provede za účelem vytvoření cílového souboru na základě předpokladů. Je nutné vložit znak tabulátoru před každý recept uvnitř makefiles, pokud neurčíme proměnnou '.RECIPEPREFIX' pro definování nějakého jiného znaku jako předpony na recept.

Ukázkový soubor Makefile

final: main.o end.o inter.o start.o
	gcc -o final main.o end.o inter.o start.o
main.o: main.c global.h
	gcc -c main.c
end.o: end.c local.h global.h
	gcc -c end.c
inter.o: inter.c global.h
	gcc -c inter.c
start.o: start.c global.h
	gcc -c start.c
clean:
	rm -f main.o end.o inter.o start.o

Ve výše uvedeném příkladu jsme použili 4 C zdrojové soubory a dva hlavičkové soubory pro vytvoření spustitelného final. Zde je každý soubor „.o“ cílem i nezbytnou podmínkou uvnitř souboru makefile. Nyní se podívejte na poslední cílové jméno čisté. Je to spíše akce než cílový soubor.

Protože to běžně při kompilaci nepotřebujeme, není to zapsáno jako podmínka v žádných jiných pravidlech. Cíle, které neodkazují na soubory, ale jsou pouze akcemi, se nazývají falešné cíle. Nebudou mít žádné předpoklady jako jiné cílové soubory.

Jak GNU Make zpracuje Makefile

Ve výchozím nastavení make začíná prvním cílem v 'makefile' a nazývá se ' výchozí cíl'. Vezmeme-li v úvahu náš příklad, máme jako první cíl finál. Protože jeho předpoklady zahrnují další objektové soubory, je třeba je před vytvořením final aktualizovat. Každý z těchto předpokladů je zpracován podle vlastních pravidel.

K rekompilaci dojde, pokud byly provedeny úpravy zdrojových souborů nebo souborů záhlaví nebo pokud objektový soubor vůbec neexistuje. Po opětovné kompilaci potřebných objektových souborů se make rozhodne, zda znovu propojit finální nebo ne. Toto je nutné provést, pokud soubor final neexistuje nebo pokud je některý z objektových souborů novější.

Pokud tedy změníme soubor inter.c, pak při spuštění make znovu zkompiluje zdrojový soubor k aktualizaci objektový soubor inter.o a poté odkaz final.

Použití proměnných uvnitř Makefiles

V našem příkladu jsme museli dvakrát vypsat všechny objektové soubory v pravidle pro finální, jak je uvedeno níže.

final: main.o end.o inter.o start.o
	gcc -o final main.o end.o inter.o start.o

Abychom se vyhnuli takovým duplicitám, můžeme zavést proměnné pro uložení seznamu objektových souborů, které jsou používány uvnitř makefile. Pomocí proměnné OBJ můžeme přepsat ukázkový makefile na podobný, který je zobrazen níže.

OBJ = main.o end.o inter.o start.o
final: $(OBJ)
	gcc -o final $(OBJ)
main.o: main.c global.h
	gcc -c main.c
end.o: end.c local.h global.h
	gcc -c end.c
inter.o: inter.c global.h
	gcc -c inter.c
start.o: start.c global.h
	gcc -c start.c
clean:
	rm -f $(OBJ)

Pravidla pro čištění zdrojového adresáře

Jak jsme viděli v příkladu makefile, můžeme definovat pravidla provyčištění zdrojového adresáře odstraněním nežádoucích objektových souborů po kompilaci. Předpokládejme, že náhodou máme cílový soubor s názvem čistý. Jak lze přimět odlišit výše uvedené dvě situace? Zde přichází koncept falešných cílů.

falešný cíl je takový, který ve skutečnosti není názvem souboru, spíše je to jen název receptu, který má být proveden vždy, když je ze souboru makefile podán explicitní požadavek<. Jedním z hlavních důvodů, proč používatfalešný cíl, je vyhnout se konfliktu se souborem se stejným názvem. Dalším důvodem je zlepšení výkonu.

Abych to vysvětlil, prozradím jeden nečekaný zvrat. Recept na čisté se při spuštění make ve výchozím nastavení nespustí. Místo toho je nutné vyvolat to samé vydáním příkazu make clean.

.PHONY: clean
clean:
	rm -f $(OBJ)

Nyní zkuste vytvořit makefiles pro svou vlastní kódovou základnu. Neváhejte se zde vyjádřit se svými pochybnostmi.