Produkty Novinky Články Návody Kontakty

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-
45# kompilator
6CC=gcc
78# linker
9LD=gcc
10# ——————————————————————--
11# volby kompilatoru pro danou architekturu
12CFLAGS_ARCH=-march=armv5te -mabi=aapcs-linux
1314# obecne volby kompilatoru
15CFLAGS=-g -Os -Wall
1617# volby predavane linkeru
18LDFLAGS= -march=armv5te
19# ——————————————————————--
20# cesty k hlavickovym souborum
21INCLUDE_PATHS=       -I.\
2223# cesty ke knihovnam pro linkovani
24LIB_PATHS=   -L.\
25# ——————————————————————--
26# nazev spustitelneho souboru
27TARGET=helloarm
2829# knihovny, ktere se maji prilinkovat k aplikaci
30LIBS= -lc\
3132# objektove soubory
33OBJS=        main.o\
34# ====================================================================
35# vychozi pravidlo
36all: $(TARGET)
3738# pravidlo pro linkovani
39$(TARGET): $(OBJS)
40     $(CROSS_PREFIX)$(LD) $(LDFLAGS) $(LIB_PATHS) $(OBJS) $(LIBS) -o $(TARGET)
4142# pravidlo pro kompilaci
43%.o:%.c
44     $(CROSS_PREFIX)$(CC) $(INCLUDE_PATHS) $(CFLAGS_ARCH) $(CFLAGS) -c -o $@ $<
4546# pravidlo pro uklid
47clean:
48     rm -f *.o ${TARGET}
4950.PHONY: all
51.PHONY: clean
Ukázka obsahu souboru makefile