HTML

Bagoj úr blogja

Kíváncsi Bagoj befigyel a Linux belsejébe, illetve különféle Linux terjesztéseket próbál ki. Ha jó napja van, scriptet ír Neked.

Friss topikok

Hogyan fordítsunk .deb csomagot?

2008.03.21. 20:57 bagoj ur

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...

5 komment

Címkék: linux fordítás debian csomag ubuntu hogyan készítés rendszerfelügyelet deb

A bejegyzés trackback címe:

https://bagojur.blog.hu/api/trackback/id/tr58612269

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

mavo · http://mavo.blog.hu 2008.03.25. 10:44:34

Ajánlott fegyver a checkinstall nevű kis aranyosság, letölthető itt: href.hu/x/54di.

Előnye, hogy nem csak .deb készíthető vele, használata pedig fertelmesen egyszerű.

bagoj.ur 2008.03.25. 12:45:59

Annyira egyszerű, hogy én például képtelen voltam vele csomagot készíteni... :-p Kollégám ajánlotta (már hallott róla), de ketten nem jutottunk semmire. Nekem a leírt módszer azért egyszerű, mert csak végig kell haladni egy procedúrán és az eredmény garantált. Ettől függetlenül, ha van kedved összeszedni róla egy kis cikket, szívesen elolvasom.

mavo · http://mavo.blog.hu 2008.03.26. 12:21:42

Pedig tényleg egyszerű.

Ha már felraktad, akkor veszed annak a forrását, amiből csomagot szeretnél készíteni, a szokott módon kicsomagolod, konfigurálod, fordítod és telepíted.

Ezután a forrás direktoriban lefuttatod a checkinstall programot, a checkinstall --help segít a mit-hogyanban, pár alap dolgot kell megadni, a többire rákérdez. A csomagot forrás direktoriban hozza létre, nekem kiválóan működött.

bagoj.ur 2008.04.07. 12:01:31

Ahogy megnézegettem, ez lényegében ugyanazt csinálja, amit én is, csak ez kicsit automatizáltabb. Legközelebb megvizslatom közelebbről is!

bagoj ur 2011.06.07. 21:00:20

Különben ha valakit érdekel, a szkript, amelyik a fájl listát elkészíti:

for i in `cat filelist.txt`; do if [ -d "$i" ]; then mkdir -p $(echo "$i"|sed s:^/::); else cp "$i" ."$i"; fi; done

Szép napot...