Weboldal keresés

A „Makefiles” rövid bemutatása a nyílt forráskódú szoftverfejlesztésben a GNU Make segítségével


A GNU Make egy fejlesztői segédprogram, amely meghatározza egy adott kódbázis azon részeit, amelyeket újra kell fordítani, és parancsokat adhat ki e műveletek végrehajtásához a kódbázison. Ez a bizonyos make segédprogram bármilyen programozási nyelvvel használható, feltéve, hogy a fordításuk parancsok kiadásával végrehajtható a shellből.

A GNU Make használatához rendelkeznünk kell néhány szabálykészlettel, amely meghatározza a programunkban található különböző fájlok közötti kapcsolatot, valamint az egyes fájlok frissítéséhez szükséges parancsokat. Ezeket a „makefile” nevű speciális fájlba írják. A 'make' parancs a 'makefile' adatbázist és a fájlok utolsó módosítási idejét használja a döntéshez amelyet az összes fájlt újra kell fordítani.

Egy makefile tartalma

A 'makefiles' általában 5 féle dolgot tartalmaz, nevezetesen: implicit szabályok, explicit szabályok, változódefiníciók , irányelvek és megjegyzések.

  1. Egy explicit szabály meghatározza, hogyan kell egy vagy több fájlt létrehozni/újrakészíteni (ezt célként hívják, később elmagyarázzuk), és mikor kell ugyanezt tenni.
  2. Egy implicit szabály meghatározza, hogyan lehet egy vagy több fájlt létrehozni/újrakészíteni a nevük alapján. Leírja, hogy egy célfájl neve hogyan kapcsolódik a célhoz hasonló nevű fájlhoz.
  3. A változódefiníció egy olyan sor, amely egy karakterlánc-értéket ad meg egy később helyettesítendő változó számára.
  4. A irányelv egy utasítás a make számára, hogy valami különlegeset tegyen a makefile olvasása közben.
  5. A „#” szimbólum a megjegyzés kezdetét jelenti a makefile-ben . A „#” karakterrel kezdődő sort a rendszer egyszerűen figyelmen kívül hagyja.

Makefile-ok szerkezete

A rendszer újrafordítását make megmondó információ a makefile nevű adatbázis beolvasásából származik. Egy egyszerű makefile a következő szintaxis szabályaiból áll:

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

A célpont a program által generált kimeneti fájl. Lehetnek hamis célpontok is, amelyeket alább ismertetünk. Példák a célfájlokra: futtatható fájlok, objektumfájlok vagy hamis célok, például clean, telepítés, eltávolítás stb.

Az előfeltétel egy fájl, amelyet bemenetként használnak a célfájlok létrehozásához.

A recept az a művelet, amelyet make hajt végre a célfájl létrehozásához az előfeltételek alapján. A makefiles-ben minden recept elé tabulátor karaktert kell tenni, hacsak nem adjuk meg a '.RECIPEPREFIX' változót egy másik karakter előtagként való meghatározásához. recepthez.

Egy minta 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

A fenti példában 4 C forrásfájlt és két fejlécfájlt használtunk a végrehajtható final létrehozásához. Itt minden „.o” fájl egyszerre cél és előfeltétel a makefile-en belül. Most vessen egy pillantást az utolsó célnévre: clean. Ez csak egy művelet, nem pedig egy célfájl.

Mivel a fordítás során erre általában nincs szükségünk, más szabályban nem írják elő feltételként. Azokat a célokat, amelyek nem hivatkoznak fájlokra, hanem csak műveletek, hamis célpontoknak nevezzük. Nem lesznek olyan előfeltételeik, mint a többi célfájlnak.

Hogyan dolgozza fel a GNU Make a makefile-t

Alapértelmezés szerint a make a „makefile” első céljával kezdődik, és a neve „ alapértelmezett cél". Példánkat figyelembe véve a végső az első célpont. Mivel az előfeltételei más objektumfájlokat is tartalmaznak, ezeket frissíteni kell a végleges létrehozása előtt. Ezen előfeltételek mindegyikét a saját szabályai szerint dolgozzák fel.

Az újrafordításra akkor kerül sor, ha a forrásfájlokat vagy a fejlécfájlokat módosították, vagy ha azobjektumfájl egyáltalán nem létezik. A szükséges objektumfájlok újrafordítása után a make eldönti, hogy újra csatolja-e a final t vagy sem. Ezt akkor kell megtenni, ha a final fájl nem létezik, vagy ha valamelyik objektumfájl újabb nála.

Így ha megváltoztatjuk az inter.c fájlt, akkor a make futtatásakor újrafordítja a forrásfájlt a frissítéshez az inter.o objektumfájlt, majd a final hivatkozást.

Változók használata a Makefiles-en belül

Példánkban az összes objektumfájlt kétszer kellett felsorolnunk a végső szabályban, az alábbiak szerint.

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

Az ilyen párhuzamosságok elkerülése érdekében bevezethetünk változókat a makefile-ben használt objektumfájlok listájának tárolására. Az OBJ változó használatával átírhatjuk a makefile mintát az alábbiakban látható hasonlóra.

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)

A forráskönyvtár tisztításának szabályai

Amint azt a makefile példában láttuk, szabályokat határozhatunk meg a forráskönyvtártisztítására úgy, hogy a fordítás után eltávolítjuk a nem kívánt objektumfájlokat. Tegyük fel, hogy van egy clean nevű célfájlunk. Hogyan tehető különbségtétel a fenti két helyzet között? Itt jön a hamis célpontok fogalma.

A hamis célpont olyan, amely valójában nem egy fájl neve, hanem csak egy recept neve, amelyet végre kell hajtani, amikor kifejezett kérés érkezik a makefile< fájlból.. A hamis cél használatának egyik fő oka az, hogy elkerüljük az ütközést az azonos nevű fájllal. A másik ok a teljesítmény javítása.

Ennek magyarázatára egy váratlan fordulatot árulok el. A clean receptje alapértelmezés szerint nem kerül végrehajtásra a make futtatásakor. Ehelyett ugyanazt kell meghívni a make clean parancs kiadásával.

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

Most próbáljon meg makefile-eket létrehozni a saját kódbázisához. Nyugodtan írjon ide kétségeitekkel.