A make segédprogram
Tételezzük fel, hogy egy foo programot szerkesztünk, amely 5 fejlécállományból 1.h, 2.h, 3.h, 4.h, and 5.h és 5 ezeknek megfelelo forrásállományból áll 1.c, 2.c, 3.c, 4.c, and 5.c. A fofüggvényt a main.c állomány tartalmazza. Azt is tételezzük fel, hogy a 2.c állomány egy hibát tartalmaz, amelyet sikerült kijavítanunk. Egy új foo program eloállításához újra kell fordítanunk a hibás forrásállományt, utána pedig újra felépítenünk a végrehajtható állományunkat. Ha a hiba történetesen egy olyan fejlécállományban volt, amelytol az összes többi forrásállomány függött, akkor az összes forrásállományt újra kel fordítanunk. Egy nagy szoftver esetén nem túl kellemes kideríteni a függoségeket és csak azt fordítani újra amit ténylegesen szükséges. Tulajdonképpen az a szerepe a make segédprogramnak, hogy leegyszerusítse a nagy programok fordítását.
Miért használjuk a make segédprogramot
Gyorsítja a fordítási folyamatot, egyben automatizálva azt. Csak azok a forrásállományok kerülnek újrafordításra, amelyek megváltoztak.
Bizonyos projektek fordítása különleges fordítási kapcsolók használatát igényli, amelyeket nehéz észben tartani
A make segédprogram gyakorlatilag egy Makefile állomány segítségével fejti ki hatását. Ez a Makefile állomány a program fordítását vezérlo utasításokat tartalmazza.
Nem kötelezo a Makefile megnevezést hasznáni, viszont ajánlott. Amennyiben a Makefile megnevezést használjuk, a make parancs egyszeru kiadása elégséges, hogy elvégezze az újrafordítást. Ha a fordítást vezérlo parancsokat egy más nevu állományban helyeztük el, akkor a
make -f <allomanynev>
parancs kiadása fogja a parancsállomány végrehajtását eredményezni.
A parancsállomány háromféle egységet tartalmaz, éspedig cél, függoségek és szabályok.
cél: ez általában egy végrehajtható vagy tárgykód állományneve (eloállítandó)
függoségek: a cél eloállításához szükséges forrásállományok
szabályok: parancsok, amelyek segítségével eloállítjuk a célállományt
cél: függoségek
szabály1
szabály2
...
A szabályokat tartalmazó sorok minig tabulátorral kezdodnek!!!
# client végrehajtható állomány eloállítása
client: conn.o util.o main.o
g++ util.o conn.o main.o -o client
# main.o tárgykódállomány eloállítása main.o: main.cpp g++ -c main.cpp # util.o tárgykódállomány eloállítása util.o: util.cpp util.h g++ -c util.cpp # conn.o tárgykódállomány eloállítása conn.o: conn.cpp conn.h g++ -c conn.cpp
A fenti példa két fejlécállományt és három C++ forrásállományt tartalmaz. A parancsállomány elso célja a végrehajtható állomány (client) eloállítására vonatkozik. Ez három tárgykód állománytól függ, amelyek eloállítására külön-külön egy-egy szabály van.
A # karakter a megjegyzéseket tartalmazó sorokat vezeti be.
Bizonyos szabályokat csoportosíthatunk és egy címke alatt elhelyezhetünk. Ezen szabályok végrehajtását úgy érhetjük el, ha a make segédprogramot a címkével argumentumként futtatjuk.
Tételezzük fel, hogy egy címke alá helyezzük az összes törlési szabályt. Az elozo Makefile esetében ez a következoképpen nézne ki:
clean:
rm *.o
rm client
Végrehajtás:
make clean
Változót a következo paranccsal lehet létrehozni:
VAR_NAME=value
Általában a változóneveknek nagybetus neveket használunk.
OBJECTS=main.o test.o
Egy változó értékét a $ jellel kaphatjuk meg. Például:
$(VAR_NAME)
A változók különlegesen hasznosak függoségek megadásánál hiszen ha például a végrehajtható állomány 10 darab tárgykódállománytól függ, amelyekre egy változóval is hivatkozhatunk, akkor csak a változót kell beveztnünk a függoségi listába. Például: OBJECTS= a.o b.o c.o d.o e.o f.o g.o h.o i.o j.o server: server.c $(OBJECTS) gcc -o server $(OBJECTS) server.c