Ezek az állományok legjobban talán
önmagukon keresztül mutathatóak be. A
következő rendszerszintű .mk
állományokat használjuk a FreeBSD
Dokumentációs Projektben:
A doc.project.mk
a központi
.mk
állomány, amely
szükség szerint hivatkozik az összes
többi .mk
állományra.
Az előállítás és a
telepítés során a
doc.subdir.mk
felelős a dokumentumokat
tároló könyvtárak
bejárásért.
A doc.install.mk
tartalmazza a
karbantartóval és a telepítéssel
kapcsolatos változókat.
A doc.docbook.mk
állomány csak akkor kerül
feldolgozásra, ha a DOCFORMAT
értéke docbook
és a
DOC
változónak van
értéke.
Nézzünk bele:
Ha nem állítjuk be a dokumentum
Makefile
állományában, akkor a
DOCFORMAT
és a
MAINTAINER
változók ezen a
helyen kapnak értéket.
A PREFIX
adja azt a
könyvtárat, amelyen belül
elérhetőek a
dokumentáció
előállításához
szükséges eszközök.
A csomagok és portok átlagos használata
esetén ez a /usr/local
.
A PRI_LANG
adja meg azt a nyelvet
és kódolást, amely a
dokumentációt olvasó
felhasználó számára
elsődlegesként leginkább elfogadott.
Alapértelmezés szerint ez az amerikai
angol.
A PRI_LANG
változó
semmilyen hatással nincs a dokumentumok
előállítására.
Egyedül a FreeBSD dokumentáció
telepítésekor a leggyakrabban hivatkozott
dokumentumokhoz létrehozandó szimbolikus
linkek készítésénel van
szerepe.
A .if defined(DOC)
sorban a
Makefile
állományokban
megadható elágazásokra láthatunk
példát. Hasonlóan más
programokhoz, a Makefile
működését tudjuk meghatározni
egy logikai kifejezés
igazságértéktől függően.
Ebben a kifejezésben a defined
függvény, amely megadja, hogy a
paramétereként megadott változó
definiált-e.
A következő elágazásban, vagyis az
.if ${DOCFORMAT} == "docbook"
utasításban azt vizsgáljuk meg, hogy a
DOCFORMAT
változó
értéke "docbook"
vagy sem.
Amennyiben a válasz erre igen (vagyis
„igaz”), beemeljük a
doc.docbook.mk
tartalmát.
Az előbb említett két
elágazást rendre az .endif
kulcsszóval zárjuk le.
Ez az állomány már túlságosan nagy ahhoz, hogy a fejezeten belül könnyen ki lehessen elemezni. Ezért az előző szakaszok alapján a részleteket a kedves Olvasóra bízzuk, ehhez adunk még itt némi segítséget.
A SUBDIR
tartalmazza azokat az
alkönyvtárakat, amelyeket a feldolgozás
során be kell járnunk.
A ROOT_SYMLINKS
a
dokumentáció
főkönyvtárából
szimbolikusan linkelendő könyvtárak
neveit adja meg, amennyiben az adott nyelv (a
PRI_LANG
változó szerint)
az elsődleges.
A COMPAT_SYMLINK
változót már korábban bemutattuk
az alkönyvtári
Makefile
állományok című
szakaszban.
A függőségi viszonyokat
formában írjuk fel, ahol így megmondjuk,
hogy a cél
:
függőség1
függőség2 ...
cél
létrehozásához először milyen
elemeknek kell létezniük. Ezeket nevezzük
függőségeknek.
A függőségi viszony megadása alatt lehetőségünk van részletezni a függőségekből a cél előállításához szükséges utasításokat. Ezt akkor kell megtenni, ha a cél és a függőségek közti átalakítást előzőleg még nem definiáltuk, vagy ha az adott esetben az átalakítás eltér a korábbiaktól.
A .USE
nevű speciális
függőség egy makróval
egyenértékű eszköz
használatára ad lehetőséget.
A fenti kódrészletben tehát a
_SUBDIRUSE
most már egy
„makró” lesz, amely ha megjelenik a
függőségek között, akkor a
törzsében megadott parancsokat hajtja
végre.
Mi különbözteti meg ezt a makrót a
többi céltól? Két lényeges
eltérés: először is, a benne megadott
utasítások a rá
függőségként hivatkozó
célhoz társított
átalakítást végző
utasítások után
fognak lefutni, másrészt nem befolyásolja
a jelenleg feldolgozás alatt álló
cél nevét tároló
.TARGET
változó
értékét.
Ebben a kódrészletben a tehát
clean
esetében csak az
rm -r ${CLEANFILES}
parancs lefutása
után fog végrehajtódni a
_SUBDIRUSE
makró tartalma.
Ennek hatására a clean
megy egyre lentebb és lentebb a
könyvtárszerkezetben,
miközben törli a
előzőleg előállított
állományokat.
Az install
és a
package
célok
egyaránt folyamatosan haladnak lefelé a
könyvtárszerkezetben és az
alkönyvtárakban hívják
saját maguk tényleges
változatát (ezek a
realinstall
és
realpackage
).
A clean
eltávolítja a folyamat során
keletkezett állományokat (és az
előbbiekhez hasonlóan lefele halad a
könyvtárszerkezetben). A
cleandir
ugyanezt
csinálja, de ha talál a
tárgykódokhoz tartozó
könyvtárat, akkor azt is törli.
Az exists
egy másik logikai
függvény, amellyel lekérdezhetjük,
hogy a paramétereként megadott
állomány létezik-e.
Az empty
logikai
függvény igaz értékű, ha a
paramétereként megadott
változó értéke
üres.
A target
logikai
függvény igaz értékű, ha a
paraméterként megadott cél még
nem létezik.
A .for
utasítás
segítségével adott
utasításokat tudunk elvégezni egy
változó tartalmaként megadott,
szóközökkel határolt elemekre. A
ciklus belsejében egy változóból
érhetjük el az aktuálisan feldolgozott
elemet.
A fenti kódrészletben ha a
SUBDIR
üres, akkor nem
történik semmi. Ha viszont egy vagy több
elemet is tartalmaz, akkor a .for
és
az .endfor
között megadott
utasítások megismétlődnek minden
egyes elem esetén. Ezek értékét a
ciklus belsejében rendre a entry
változóban veszi fel.
Ha kérdése van a FreeBSD-vel kapcsolatban, a
következő címre írhat (angolul):
<questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon:
<gabor@FreeBSD.org>.