UHU-Linux:Csomagkészítés HOGYAN

A UHU-Linux wikiből

Tartalomjegyzék

Bevezetés

A dokumentum bemutatja az UHU-Linux 2.0 verziójához történő csomagkészítés alapjait, konkrét példán szemléltetve az egyes lépéseket. A konkrét példa a krename nevű szoftver 3.0.14-es verziója lesz. Azért tűnik jó választásnak ez a program egy ilyen bevezető jellegű dokumentumban, mert minden tekintetben tipikus, jól szemléltethető rajta minden olyan "sablon" lépés, amely egy csomag elkészítése során szükséges.

A dokumentum elkészítése során igyekeztem azt szem előtt tartani, hogy az olvasó minél előbb sikerélményhez jusson, azaz először egy fapados, több sebből vérző csomagot rakunk össze, majd a későbbi lépésekben finomítjuk az eredményt.

A dokumentum "tutorial" jellegéből következik, hogy nem helyettesíti a hivatalos UHUBUILD dokumentációt, csupán "felkészít" rá. A hivatalos dokumentáció az uhubuild-common csomag feltelepítése után az /usr/share/doc/Packages/uhubuild/html könyvtárban olvasható, kötelező darab minden csomagolónak. Rengeteg további hasznos dolog található Sári Gábor build csomagjában is, szintén kötelező darab.

Számos elméleti tudnivaló, amely itt nem kerül tárgyalásra, megtalálható a fent hivatkozott dokumentumokban.


A csomagkészítésnek itt leírt menete egy szubjektív módszer. Ez a módszer tökéletesen működik, azonban van nála jobb, ami később nagyban megkönnyíti a csomagok kezelését, feltöltését. Ennek leírása a UHU-Linix:Csomagkészítés_by_sAGA szócikkben található. Az ismeretek mélyítése miatt, illetve a több járható út megismerése végett azonban az itt leírtak is hasznosak! Sőt, segíthetnek a gyakorlati megoldások könnyebb elsajátításában!


A csomagkészítő környezet elkészítése

A csomagkészítés első lépése a megfelelő csomagkészítő környezet elkészítése. A környezet alapvetően két részre bontható: az UHU-Linux fejlesztői által elkészített "rendszerspecifikus" rész mellett a csomagkészítőnek is ki kell építenie a saját szájízének megfelelő környezetet.

A rendszerspecifikus rész beállítása

Néhány csomag feltelepítésével egyszerűen letudhatjuk ezt a lépést; a csomagok telepítése a következő paranccsal történik:

apt-get install uhubuild-common uhubuild-config uhubuild helpers uhubuild-here uhubuild-under-chroot

A csomagkészítő saját beállításai

Először is hozzunk létre egy könyvtárat, amelyben a csomagkészítéssel kapcsolatos fájljainkat fogjuk tartani. Nálam ez a /home/robert/uhubuild, így a továbbiakban erre fogok hivatkozni. Saját életünk megkönnyítése érdekében létrehozunk egy build nevű szkriptet, amely elvégzi nekünk a csomagkészítés során felmerülő, automatizálható piszkos munkát. Hozzunk tehát létre egy fájlt a /home/robert/uhubuild könyvtárban, nevezzük el build-nek, és írjuk bele a következő sorokat:

#!/bin/bash

export UHUBUILD_APT_SOURCES=/etc/apt/sources.list
export UHUBUILD_CCACHE_DIR=/var/cache/uhubuild/ccache
export UHUBUILD_CHROOTDIR=/home/robert/uhubuild/chroot
export UHUBUILD_LOGPACKDIR=/home/robert/uhubuild/LOGPACK
export UHUBUILD_RESULTDIR=/home/robert/uhubuild/PACKAGES

exec uhubuild-chrootbuild "$@"

Miután végeztünk a fájl szerkesztésével, adjunk rá futtatási jogot. A build szkriptben definiált változók közül itt most csak kettővel foglalkozunk, ezek az UHUBUILD_RESULTDIR és az UHUBUILD_LOGPACKDIR. Az első változóban megadott könyvtárba kerül a kész csomag, míg a második változó által mutatott könyvtárba egyebek között a csomagfordítás során kiírt üzenetek kerülnek. Hozzuk létre tehát a /home/robert/uhubuild/LOGPACK és a /home/robert/uhubuild/PACKAGES könyvtárakat!

A csomagforrás elkészítése

Hozzunk létre a /home/robert/uhubuild alatt egy krename nevű könyvtárat, amely az elkészítendő csomagunkra vonatkozó adatokat fogja tartalmazni. A következő szakaszban fokozatosan felépítjük azt a struktúrát, amely a csomag sikeres lefordításához szükséges.

sources

A krename könyvtárba belépve hozzuk létre egy sources nevű alkönyvtárat. Mint a neve is mutatja, ez a könyvtár fogja tartalmazni a fordítandó programunk forráskódját. Noha általában a forráskód a csomag fordítása során automatikusan kerül letöltésre, mi most egyelőre maradjunk a kézi vezérlésnél, és töltsük le mi magunk a krename forráskódját, melyet például a következő címen találhatunk:

http://switch.dl.sourceforge.net/sourceforge/krename/krename-3.0.14.tar.bz2 

A krename-3.0.14.tar.bz2 fájlt másoljuk be a sources könyvtárba.

acquire

A következő lépésben meg kell mondanunk a csomagkészítő rendszernek, hogy a tömörített fájlból hogyan kell kiszedni a forráskódot. Ehhez a /home/robert/uhubuild/krename könyvtárban hozzunk létre egy üres fájlt acquire névvel, majd a fájlba írjuk bele a következő sorokat:

#!/usr/bin/env dl

krename-3.0.14.tar.bz2 krename-3.0.14/

A fájl első sora megmutatja, hogy a tartalmát a dl nevű szkript fogja értelmezni, melynek feladata a forráskód letöltése és kitömörítése. (Mint arról fentebb volt szó, az automatikus letöltéssel jelenleg nem foglalkozunk.) A következő sor két tagra bontható: az első tag megadja a szkriptnek, hogy melyik fájlban kell keresni a tömörített forráskódot, a második pedig meghatározza, hogy a tömörített állomány melyik könyvtára tartalmazza a kódot.

Ennyi információ elegendő a dl szkriptnek a forráskód futásidejű kitömörítéséhez, lépjünk is tovább!

build-depends

Ezen a ponton fontos tisztáznunk, hogy a csomagfordítás maximális reprodukálhatóságának érdekében maga a fordítás nem az éles rendszeren, hanem egy chroot környezeten belül zajlik (a chroot gyökerét a build szkriptben, az UHUBUILD_CHROOTDIR változóban adjuk meg, értéke esetünkben /home/robert/uhubuild/chroot). A sikeres fordításhoz természetesen szükség van arra, hogy a chroot környezetben telepítve legyenek mindazok a csomagok, amelyek a fordításhoz szükségesek; gcc, make, stb. Ezen kívül a krename például hozzálinkeli magát a kde alap függvénykönyvtárához, a kdelibshez is.

A fordításhoz szükséges csomagok listáját nekünk kell megadnunk, erre szolgál a build-depends fájl, hozzuk tehát létre a /home/robert/uhubuild/krename könytár alatt.

Mivel általában meglehetősen sok csomag szükséges egy sikeres fordításhoz, a feljesztők úgynevezett makrókat definiáltak, melyek fordítási időben kerülnek kifejtésre, azaz a tényleges csomaglista ekkor áll elő. A makrók teljes listája megtalálható az /usr/share/uhubuild/config/macros fájlban. A számunkra érdekes, KDE-alapú fordítási környezet a %kdelibs makró használatával épül fel, így ezt írjuk bele a build-depends fájlba. (Kevésbé fontos, bár jó, ha tudjuk, hogy létezik egy egyszerű % nevű makró, amely a minden esetben szükséges alapcsomagokat tartalmazza. Ezt nem szükséges külön megadnunk a build-depends fájlban.)

%kdelibs

compile

Most következik a tényleges fordítást levezénylő fájl megszerkesztése. Ennek neve compile, és szintén a /home/robert/uhubuild/krename könyvtárban hozzuk létre. Ebben szerepelnek a fordításhoz szükséges parancsok (tehát pl. a ./configure - make páros, vagy amire éppen szükség van). Az uhubuild rendszer tartalmaz néhány makrót, amelyek az autotools eszköztár segítségével előkészített forráskódok fordítását és telepítését könnyítik meg. Ebben az esetben is ezeket a makrókat fogjuk használni. Fordításhoz az ub_compile makró szükséges, ami tulajdonképpen esetünkben nem csinál mást, minthogy kiad egy ügyesen felparaméterezett ./configure és egy make parancsot. A compile fájl tartalma ezek alapján a következő legyen:

#!/bin/sh -eux

ub_compile

install

Az előző fájl analógiájára ez a fájl felelős a telepítés sikeres levezényléséért. Itt is a megfelelő, telepítést segítő uhubuild makrót fogjuk használni, melynek neve ub_install. Hozzuk tehát létre az install fájlt a /home/robert/uhubuild/krename könyvtárban, és írjuk bele a következő sorokat:

#!/bin/sh -eux

ub_install

doc

Ebben a fájlban azokat a fájlokat soroljuk fel, amelyeket szeretnénk az /usr/share/doc/Packages/csomagnév könyvtár alá telepíteni. Tipikusan ilyenek a forrásban szereplő licencfájlok, a rövid szöveges README-fájlok, amelyek nem kerülnek telepítésre a make install lépés során.

Esetünkben a következő tartalommal töltsük fel a fájlt:

AUTHORS
ChangeLog
COPYING
README

Ha belenézünk a korábban letöltött forráskódba, akkor láthatjuk, hogy ezek a fájlok mind ott pihennek a krename-3.0.12 nevű könyvtárban.

distribution

Ez a fájl jelzi, hogy csomagunkat melyik disztribúcióhoz fordítjuk. Tartalmának meg kell egyeznie az UHUBUILD_APT_SOURCES változóban megadott sources.list fájlban szereplő útvonalon található RELEASE fájlban szereplő verzióval.

A következő sort írjuk bele:

UHU LINUX 2.0

version

Ez a fájl tartalmazza a fordítandó csomag verziószámát. A csomag nevében ez az érték fog megjelenni. Tartalma esetünkben legyen

3.0.14

release

A fájl tartalma egyetlen szám: Azt mutatja, hogy az adott verziójú programból készülő csomag hányadik változatával van dolgunk. A számozás 1-től indul, és általában olyankor szokás növelni a csomag release-értékét, amikor valamilyen változás következik be a fordítás menetében, vagy valamit változtatunk, javítunk a forráskódon. Amikor új verziót csomagolunk be a programból, a release-értéket állítsuk vissza 1-re.

A fájl tartalma esetünkben:

1

sourcename

Ez a fájl tartalmazza a csomagforrás nevét. Ez általában megegyezik a becsomagolt program nevével, azonban egy programból több csomag is készülhet. Tipikus példának tekinthető a fejlesztői csomagok esete (pl. kdebase és kdebase-dev). Ilyenkor a kdebase-dev csomag is a kdebase csomagforrásból készül. Másik, a lényeget sokkal jobban megmutató példa az "mwm" nevű csomag: amint az a csomag információit böngészve kideríthető, ez a lesstif csomagforrásból készül. A fájl tartalma esetünkben:

krename

vendor

A csomagot kiadó szervezet neve szerepel ebben a fájlban. Tartalma hivatalos UHU-Linux csomagok esetén "UHU Linux Team". Arra figyeljünk, hogy ha publikáljuk csomagjainkat, ebbe a fájlba a hivatalostól eltérő érték kerüljön, hiszen részben ennek a mezőnek a tartalma alapján válik lehetővé a csomag származásának tisztázása, ami megkönnyíti az esetleges hibák bejelentését és javítását. A fájl tartalmára többféle javaslat és megszokás létezik: egyesek az "UHU-Linux Baráti Közösség", mások az "UHUBK" megjelölést használják. Talán az előbbi némileg elterjedtebb, így használjuk most mi is ezt:

UHU-Linux Baráti Közösség

changelog

A csomagforráson végzett változtatásaink rövid összefoglalóját tartalmazza. Nem kötelező része a csomagforrásnak, azonban mégis érdemes vezetni ezt a változásnaplót, sok esetben nagy segítséget jelent, hogy ismerjük a csomagforrás korábbi történetét. Tartalma esetünkben valami ilyesmi lehet:

2007-10-24 16:00 - új csomag: krename
                 - becsomagolt verzió: 3.0.14

homepage

A fájl a becsomagolandó program honlapjának címét tartalmazza. Tartalma esetünkben:

http://www.krename.net/

maintainer

Itt adjuk meg a csomag készítőjének nevét és elérhetőségét. Azért fontos pontosan kitöltenünk ezt a fájlt, mert így nyílik lehetőség a felhasználók visszajelzéseinek, hibajelentéseinek kezelésére. Tartalma esetünkben legyen

Kovács Róbert <robert@fakemail.hu>

packages

A /home/robert/uhubuild/krename könyvtárban hozzuk létre a packages nevű könyvtárat. Ebben a könyvtárban fogjuk megadni, hogy a becsomagolt programból milyen csomagok készüljenek. Minden elkészülő csomagnak egy alkönyvtár felel meg. Esetünkben csak egyetlen csomag készül, krename névvel, így a packages könyvtárban állva hozzunk létre egy krename nevű alkönyvtárat. Ennek az alkönyvtárnak léteznek bizonyos kötelezően létrehozandó elemei, ezeket tekintjük át a továbbiakban.

packages/krename/section

Ebben a fájlban adjuk meg, hogy az új csomagunk melyik csomagszekcióba illik. A fájl helyes kitöltésének jelentősége abban áll, hogy pl. grafikus csomagtelepítő programot használva adott a lehetőség a csomagok szekciónkénti csoportosítására, ami nagyban javítja a rendelkezésre álló csomagválaszték áttekinthetőségét. A fájl tartalma esetünkben legyen

Applications/FileManagers

packages/krename/summary/hu

Ez a fájl tartalmazza a program rövid, egysoros leírását. Törekedjünk a rövid, ám mégis informatív leírásra. A leírás hosszát próbáljuk 70-80 karakter alatt tartani (így kényelmesen kifér egy sorba a leírás még konzolon is). A fájl tartalma esetünkben:

Fájlok átnevezésére szolgáló alkalmazás KDE alá

packages/krename/description/hu

Ebben a fájlban lehetőség van hosszabb leírás megadására is. Felhasználóink általában jó néven veszik, ha adunk részletes leírást is a csomaghoz. A fájl tartalma esetünkben valami ilyesmi lehet:

A szoftver lehetőséget biztosít csoportos átnevezésre (pl. ékezetek eltüntetése
fájlnevekből, bizonyos szabályok szerint végrehajtott átnevezések... etc.).

patches

Ebben a könyvtárban adhatjuk meg a forráskód módosítását elvégző patcheket (programfoltokat). Néhány tipikus eset, amikor szükség lehet a forráskód patchelésére:

  • a program nem oda telepszik, ahova az UHU-Linux rendszeren a csomagoktól azt elvárjuk
  • a program menübejegyzése alapesetben nem jelenik meg az UHU-Linux menürendszerében
  • a program nem fordítható le módosítás nélkül az UHU-Linux szoftverkörnyezetében (túl régi/új fordító, eltérő verziójú programkönyvtárak okozhatnak ilyen galibákat...)

Példánkban a krename által szállított menübejegyzés UHU-hoz igazítására van szükség.

Ennek érdekében kövessük az alábbi lépéseket:

  • Hozzuk létre a /home/robert/uhubuild/krename/patches könyvtárat.
  • Tömörítsük ki a program forráskódját:
tar jxvf krename-3.0.14.tar.bz2
  • Készítsünk másolatot a forráskódról:
cp -a krename-3.0.14 krename-3.0.14.orig
  • Nyissuk meg az eredeti forráskód-könyvtárban található krename/krename.desktop fájlt, és a "Categories=" kezdetű sorhoz adjuk hozzá az "X-UHU-Menu/Tools/File_Managers;" szöveget.

A módosított sor ezek után így néz ki:

Categories=Qt;KDE;Utility;X-UHU-Menu/Tools/File_Managers;
  • Ezek után nyissuk meg a krename/Makefile.in fájlt, keressünk rá az "xdg_appsdir = " kezdetű sorra, és módosítsuk a következő alakra:
xdg_appsdir = /usr/share/applications

Ezzel elvégeztük a forráskód megfelelő módosítását. Egyetlen feladatunk maradt: az elvégzett módosítások rögzítése egy patchben. Ehhez lépjünk ki krename-3.0.14 és krename-3.0.14.orig alkönyvtárakat tartalmazó könyvtárba, és adjuk ki a következő parancsot:

diff -Naur krename-3.0.14.orig krename-3.0.14 > ../patches/01-menu.patch

Változtatásaink eredményeként a következőhöz nagyon hasonló patchet kell kapnunk a patches könyvtárban:

diff -Naur krename-3.0.14.orig/krename/krename.desktop krename-3.0.14/krename/krename.desktop
--- krename-3.0.14.orig/krename/krename.desktop	2006-01-14 13:52:12.000000000 +0100
+++ krename-3.0.14/krename/krename.desktop	2006-08-11 22:28:19.000000000 +0200
@@ -8,4 +8,4 @@
 Comment[de]=Ein Batch Umbenenner
 Terminal=false
 Name=KRename
-Categories=Qt;KDE;Utility;
+Categories=Qt;KDE;Utility;X-UHU-Menu/Tools/File_Managers;
diff -Naur krename-3.0.14.orig/krename/Makefile.in krename-3.0.14/krename/Makefile.in
--- krename-3.0.14.orig/krename/Makefile.in	2006-02-20 22:40:48.000000000 +0100
+++ krename-3.0.14/krename/Makefile.in	2006-08-11 22:30:50.000000000 +0200
@@ -270,7 +270,7 @@
 qt_libraries = @qt_libraries@
 x_includes = @x_includes@
 x_libraries = @x_libraries@
-xdg_appsdir = @xdg_appsdir@
+xdg_appsdir = /usr/share/applications
 xdg_directorydir = @xdg_directorydir@
 xdg_menudir = @xdg_menudir@

A csomagolás

Az előző részekben összeállítottunk egy csomagoláshoz szükséges minimális környezetet, illetve egy fordításra alkalmas csomagforrást. Innentől kezdve nincs más dolgunk, mint a /home/robert/uhubuild könyvtárban állva kiadni a következő parancsot:

./build krename

Ennek hatására lezajlik a program fordítása, a csomag összeállítása és kimásolása a /home/robert/uhubuild/PACKAGES könyvtár alá.

Újonnan elkészült csomagunkat a

dpkg --install /home/robert/uhubuild/PACKAGES/krename_3.0.14-1_i386.uhu

paranccsal telepíthetjük.

Jó szórakozást!

Hogyan néz ki a példában szereplő könyvtárszerkezet

A félkövér betűvel szedett nevek könyvtárat, a normállal szedettek pedig fájlokat jelentenek.

/home/robert/uhubuild

| krename
|_ packages
|__ krename
|___ description
|____ hu
|___ summary
|____ hu
|___ section
|_ patches
|__ 01-menu.patch
|_ sources
|__ krename-3.0.14
|__ krename-3.0.14.orig
|__ krename-3.0.14.tar.bz2
|_ acquire
|_ build-depends
|_ changelog
|_ compile
|_ distribution
|_ doc
|_ homepage
|_ install
|_ maintainer
|_ release
|_ sourcename
|_ vendor
|_ version
| build


Kapcsolódó oldalak

UHUBUILD 0.2.245: Az uhu csomagkészítő rendszerének leírása UHU-Linix:Csomagkészítés_by_sAGA

Hasznos oldalak

Személyes eszközök