Szoktam emlegetni a csomagkészítés-dolgot. Miért is van erre szükség? A különféle Linux-terjesztések közül nem mindegyik van fullra rakodva csomagokkal, és főleg a Debian-alapúakra jellemző, hogy csak lassabban fogadják be az újdonságokat, tehát inkább a stabilitásra igyekeznek helyezni a hangsúlyt (a Gentoo-t tudnám említeni ellenpéldaként, ahol minden új fejlesztés szinte azonnal bekerül). Másik probléma lehet, ha egy csomag nem úgy van fordítva, ahogy mi szeretnénk (pl. az Ubuntus csomagok mindegyike olyan, hogy valahogy a fél Gnome.ot fel kell hozzá tenni. :-) Kedvencem volt, amikor kiderült, hogy a network-manager lefordítható gnome nélkül is.) Ha mégsem tudunk várni fél, esetleg egy évet valamelyik program új verziójára, akkor a két lehetőség van:
1. A neten keresgélés, hátha valaki már elkészítette a csomagot. :-)
2. Megcsináljuk mi.
A programfordítás egyáltalán nem ördöngősség, kezdők is bátran belevághatnak. Lényegében a letöltésen és kicsomagoláson kívül leggyakrabban csak három feladatunk van:
1. A fordítóprogram letöltése. Ez Ubuntun egyszerű:
sudo apt-get install build-essential |
2. A szükséges függvénykönyvtárak beszerzése. Ehhez ki kell találni, hogy mire van szükség
3. A "fordítás mantra" elvégzése (belépve a kicsomagolt könyvtárba)
./configure && make && make install |
A configure feladata az, hogy összeszedje, ellenőrizze a fordításhoz szükséges dolgokat, és elkészítse a Makefile-okat, amelyek a tényleges fordítást vezérlik majd (magyarul a kettes feladatban fog nekünk segíteni!). A make végzi a fordítást, majd (ki nem találnátok!) a make install telepíti a lefordított fájlokat a megfelelő helyre.
Ha a ./configure hibaüzenetet ír, kezdők számára a Google keresőt tudom ajánlani... leggyakrabban konkrétan ki is írja, hogy melyik lib hiányzik, nade hogy Ubuntun annak mi a neve....! Legtöbbször ezt elég nehéz kitalálni (én az apt-cache search parancsot szoktam erre használni).
Ha sikerült a fordítás, már éppen vállon veregethetnénk magunkat, de ekkor rájövünk, hogy először is, ez még távolról sem .deb csomag, ráadásul a make install után szoktak a legtöbben elgondolkodni, hogy ha le kell szedni majd a programot, akkor vajon mi lesz? Illetve hogyan fognak erről a programról tudomást szerezni a többiek, akiknek szükségük van rá? Na ezért kell DEB csomagot gyártani. (Megjegyezném, hogy a gondosabb fejlesztők figyelmet fordítanak arra is, hogy a make uninstall működjön, és ezzel a program eltávolítható lesz.)
Csomag gyártás
Ha a programunk lefordult, az már félsiker. Előbb egy kis elmélet, milyen további feladatunk van?
1. A lefordított programrészeket össze kell másolnunk egy halomba.
2. Elő kell állítani a .deb csomaghoz szükséges, ún. control-fájlokat.
Az első feladathoz készítünk egy tetszőleges könyvtárat, és felépítjük benne a fájlrendszer szükséges könyvtárait. Tehát a /home/bagoj alatt egy <csomagnév> könyvtár, majd ez alatt usr, usr/bin, usr/share tehát ami csak kell. Nade honnan tudjuk, hogy a make install hová mit másolt? Hááá-hááá... A make install nem jegyzi be sehová a dolgokat, de mi azért a find segítségével megoldjuk. Tehát a make install helyett inkább ezt szoktam csinálni:
touch ALMA && sudo make install > /dev/null && sudo find /usr -cnewer ALMA -print && rm ALMA |
(létrehozunk egy fájlt, futtatjuk a make installt, majd végigkeressük a fájlrendszert azon fájlok után, amelyek újabbak az ALMÁ-nál. Így megkapjuk azokat, amelyeket a make install telepített a rendszerünkbe. Hogy egy példát említsek az előbbi parancssor kimenetéből:
/usr/share/locale/pl/LC_MESSAGES /usr/share/locale/pl/LC_MESSAGES/lxsession.mo /usr/share/locale/hu/LC_MESSAGES /usr/share/locale/hu/LC_MESSAGES/lxsession.mo /usr/share/lxsession/images /usr/share/lxsession/images/gnome-session-switch.png /usr/share/lxsession/images/gnome-session-reboot.png /usr/share/lxsession/images/gnome-session-halt.png /usr/share/lxsession/images/gnome-session-logout.png /usr/share/lxsession/images/gnome-session-suspend.png /usr/share/lxsession/images/gnome-session-hibernate.png /usr/share/man/man1 /usr/share/man/man1/lxsession.1 /usr/share/man/man1/lxsession-logout.1 /usr/bin /usr/bin/lxsession-logout |
Remek! Ezen már csak végig kell mennünk egy kis scripttel, ami a könyvtárakat létrehozza, a fájlokat beléjük másolja; és már elő is állítottuk az éles fájlrendszeren lévő program összes részének másolatát a mi könyvtárunkban. FONTOS, hogy ezek után vagy egy make uninstallt nyomjunk, vagy ha az nem működik, akkor a fenti lista segítségével töröljük a fájlokat! (A könyvtárakat nem kell, ha elkészültünk a csomaggal, akkor úgyis felrakjuk, az meg úgyis elintézi.)
Van tehát egy könyvtárszerkezetünk:
<csomagnév>
<csomagnév>/bin/lxsession
<csomagnév>/bin/.....
<csomagnév>/share/.......
Hozzunk most létre egy könyvtárat <csomagnév>/DEBIAN névvel! Ebbe fogjuk rakni a control fájlokat.
Egy kis közbevetés: Ha egy meglévő .deb csomagból szeretnénk kiszedni a control fájlokat, könnyen megtehetjük:
ar xv <csomagnév> |
Ez három fájlt állít elő, a control.tar.gz-be belenézve tanulmányozhazjuk, hogy nálunk jobban hozzáértő emberek milyen control fájlokat hoztak létre, és ebből sokat tanulhatunk. :-)
A control fájlok (valószínűleg egyértelmű) a csomag leírását, illetve a telepítés és törlés irányítását végzik. A legfontosabb neve egyszerűen "control" - ez tartalmazza a csomaginfókat. A pcmanfm példáján bemutatva; csak a legfontosabb mezőket mutatom be:
Package: pcmanfm Version: 0.3.9.9-1 Architecture: i386 Maintainer: Mister Owl <bagoj.ur@foo.com> Depends: libatk1.0-0 (>= 1.13.2), libc6 (>= 2.6.1-1), libcairo2 (>= 1.4.0), libdbus-1-3 (>= 1.1.1), libdbus-glib-1-2 (>= 0.74), libfontconfig1 (>= 2.4.0), libgamin0 | libfam0, libglib2.0-0 (>= 2.14.0), libgtk2.0-0 (>= 2.12.0), libhal1 (>= 0.5.10), libpango1.0-0 (>= 1.18.2), libstartup-notification0 (>= 0.8-1), libx11-6, libxcomposite1 (>= 1:0.3-1), libxcursor1 (>> 1.1.2), libxdamage1 (>= 1:1.1), libxext6, libxfixes3 (>= 1:4.0.1), libxi6, libxinerama1, libxrandr2 (>= 2:1.2.0), libxrender1, gamin, shared-mime-info, desktop-file-utils Conflicts: pcmanfm-nohal Section: utils Priority: optional Description: an extremely fast and lightweight file manager for X PCMan File Manager is a gtk2 based file manager for the X Window System. Features: * Extremly fast and lightweight * etc.... . Home Page: http://pcmanfm.sourceforge.net/ Authors: Hong Jen Yee (PCMan) from Taiwan <pcman.tw@gmail.com> |
A Package, Version és Architecture a csomag nevét, verzióját és azt az architektúrát írják le, amire fordítunk. A Maintainer is elég egyszerű. A Depends szekcióban fel kell sorolni mindazokat a programokat és libeket, amelyekre szüksége van a programunknak - ez fogja kezelni a függőségeket. Ha (ad absurdum) ide nem írunk semmit, akkor fel tudjuk tenni a csomagot, de nem valószínű, hogy elindul a programunk... Azt hiszem, a szintaxis egyértelmű; vesszővel kell ezeket elválasztani és a minimum verziószámot a (>= x.y) formátumban kell megadni. A verziószám megadása nem kötelező, ha csak egy bizonyos csomag megléte a kötelező (pl. desktop-file-utils). Figyelem, a Depends EGYETLEN sor! A Conflicts-ba kell felsorolni, ha egy másik csomaggal összeférhetetlen (mint pl. nem lehet fent a gépen egyszerre több MTA (a chroot-olt, különböző porton futó kivételeket most hagyjuk! :-)). Ez a mező nem kötelező. A Description megint egyértelmű, ezek után jöhet a részletesebb leírás, mégpedig oly módon, hogy a sor elején egy szóköz van, és nem lehet üres sor (hátulról a harmadik sorban ezért van az az egy szál pont - és az előtt is van szóköz). A fájl végére enter-t kell ütni, hogy az utolsó sor egy üres sor legyen, különben a csomagkészítő anyázik.
Igazából ezzel megvan a legfontosabb fájl, de a másik három (nem kötelező) olyan egyszerű, hogy nem hagyom ki. Van egy md5sums nevű; ennek segítségével telepítéskor ellenőrzi a rendszer, hogy nem sérült-e a csomag. ENnek előállítását én így szoktam megtenni ( a <csomagnév> könyvtárban állva):
find . -exec md5sum '{}' \; > DEBIAN/md5sums |
(ezután ki kell törölni az md5sums fájlból a DEBIAN könyvtárban lévő fájlokat, hiszen ezek nem lesznek részei majd a csomagnak).
A következő a postinst névre hallgat, ebbe (ha másra nincs szükség) én ennyit teszek:
#!/bin/sh set -e if [ -x /sbin/ldconfig ]; then /sbin/ldconfig ; fi |
És ugyanezt teszem a postrm fájlba is, ami az eltávolításkor szükséges parancsok futtatására hivatott.
Ha ez a négy fájl benn van a <csomagnév>/DEBIAN könyvtárban, akkor lépjünk ki a <csomagnév>-en kívülre, majd:
dpkg-deb --build <csomagnév> |
Ennyi. A csomagunk előűlt, amit telepíthetünk is:
sudo dpkg -i <csomagnév> |
Voilá! Készen is volnánk. Ha van kérdés, a hozzászólásokban megválaszolom (már persze, ha tudom). Sajnos csak általánosságban tudtam leírni a dolgokat, hiszen erről talán egy könyvet is lehetne írni...