Struktura makefile
Jak jsme už poznali, soubor makefile je soubor s pravidly, která program make čte, postupně je interpretuje a tak dokáže sestavit výsledný spustitelný soubor. Ale co přesně makefile obsahuje? A jaká je jeho struktura? Odpovědí nám bude následující text.
Když si pozorně prohlédneme náš ukázkový soubor makefile (výpis 2), tak zjistíme, že se jeho obsah dá rozdělit na dvě části, které jsou pro lepší orientaci ve výpisu odděleny rovnítky.
První, nazvěme ji deklarační část, je obvykle místem pro definici proměnných, v kterých se uchovávají nastavení kompilátoru a linkeru, dále pak cesty k hlavičkovým souborům a knihovnám apod. Použití proměnných zpřehledňuje celý makefile, umožňuje rychlou orientaci v nastavení nástrojů a vůbec celého procesu sestavení aplikace a tím i jednoduché provedení změn.
Druhá část, říkejme jí výkonná, obsahuje samotná pravidla, které program make čte a na základě kterých sestavuje aplikaci, případně provádí jiné aktivity jako instalaci apod.
1# ——————————————————————-- 2# prefix cross-nastroju 3CROSS_PREFIX=arm-none-linux-gnueabi- 4 5# kompilator 6CC=gcc 7 8# linker 9LD=gcc 10# ——————————————————————-- 11# volby kompilatoru pro danou architekturu 12CFLAGS_ARCH=-march=armv5te -mabi=aapcs-linux 13 14# obecne volby kompilatoru 15CFLAGS=-g -Os -Wall 16 17# volby predavane linkeru 18LDFLAGS= -march=armv5te 19# ——————————————————————-- 20# cesty k hlavickovym souborum 21INCLUDE_PATHS= -I.\ 22 23# cesty ke knihovnam pro linkovani 24LIB_PATHS= -L.\ 25# ——————————————————————-- 26# nazev spustitelneho souboru 27TARGET=helloarm 28 29# knihovny, ktere se maji prilinkovat k aplikaci 30LIBS= -lc\ 31 32# objektove soubory 33OBJS= main.o\ 34# ==================================================================== 35# vychozi pravidlo 36all: $(TARGET) 37 38# pravidlo pro linkovani 39$(TARGET): $(OBJS) 40 $(CROSS_PREFIX)$(LD) $(LDFLAGS) $(LIB_PATHS) $(OBJS) $(LIBS) -o $(TARGET) 41 42# pravidlo pro kompilaci 43%.o:%.c 44 $(CROSS_PREFIX)$(CC) $(INCLUDE_PATHS) $(CFLAGS_ARCH) $(CFLAGS) -c -o $@ $< 45 46# pravidlo pro uklid 47clean: 48 rm -f *.o ${TARGET} 49 50.PHONY: all 51.PHONY: clean