Slackware Linux - csomagkezelés 3. rész

A sorozat első, második része.

3. Forrásból telepítés

Az egyik legjobb, és legteljesebb módszer, hogy csomagokat telepítsünk a rendszerünkre. Fordítás során szinte mindent testre szabhatunk és a program azokkal a beállításokkal telepedik amit mi szeretnénk. Természetesen ez olyan programokra vonatkozik ahol sok-sok mindent be tudunk állítani a fordítás folyamán. Ez viszont nagyon időigényes tud lenni, kisebb gépeken nem javasolt nagyobb méretű programok fordítása. Régebben simán kivártam egy 1 napos fordítást is, de az idő pénz, ezért inkább egy nagyobb gépet használok a fordításhoz és az elkészített csomagokat terjesztem a gépeimen.

A legegyszerűbb módszer: letöltjük a forrást a program honlapjáról és kiadjuk az alábbi utasításokat:


./configure
make
make install

Ez így nagyon egyszerűnek hangzik és az is, de ezzel van egy pár probléma. Semmit nem állítottunk be és telepítés után minden a /usr/local könyvtárba kerül (nem feltétlenül, függ a configure szkript alapbeállításaitól). Ahhoz hogy tudjuk mit és hogyan lehet beállítani a fordítás során érdemes a configure szkriptet először átnézni.


./configure --help

Egy rövid részlet az spkg program configure kimenetéből:


...
Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
...
  --enable-shared[=PKGS]  build shared libraries [default=yes]
  --enable-static[=PKGS]  build static libraries [default=yes]
  --enable-fast-install[=PKGS]
                          optimize for fast installation [default=yes]
  --disable-libtool-lock  avoid locking (might break parallel builds)
  --enable-dependency-tracking
                          do not reject slow dependency extractors
  --disable-dependency-tracking
                          speeds up one-time build
  --enable-silent-rules   less verbose build output (undo: "make V=1")
  --disable-silent-rules  verbose build output (undo: "make V=0")
  --enable-maintainer-mode
                          enable make rules and dependencies not useful (and
                          sometimes confusing) to the casual installer
  --enable-assume-broken-pkgdb
                          Compile with support for broken package databases
                          that may contain non-normalized paths with multiple
                          slashes. This doubles time necessary to load file
                          database. To see if you need to enable this option,
                          check paths in your package database with 'grep //
                          /var/log/packages/*' command.
  --enable-static-spkg    Create static spkg executable. Use
                          --enable-static-spkg=only for creating only static
                          spkg binary that will be used by default.
..

Láthatjuk, hogy elég sok minden beállítható a program fordítása során. Amit én alapértelmezett be szoktam állítani, a prefix, libdir, sysconfdir, localstatedir. A programokat mindig a /usr alá telepítem, így a rendszer részét fogják képezni. Ugyanígy dolgoznak a slapt-src szkriptek is. Szinte soha nem a /usr/local alá telepítenek semmilyen programot. Statikus libeket a legritkább esetben használok, mert ha több program is fogja használni, akkor egy frissítés során elég egyszer újrafordítani a libet tartalmazó forrást és a programok amik függenek tőle már az új és frissített libeket fogják használni. Ha statikusan fordítjuk egyes programokhoz a libeket akkor minden egyes frissítés után magát a programokat is újra kellene fordítanunk. Ugyanígy ha a debug kikapcsolható akkor azt is megteszem. Erre leginkább csak akkor van szükség ha a későbbiek folyamán valamilyen program hiba esetén próbáljuk meg kideríteni, hogy hol lehet a probléma.


./configure --prefix=/usr --libdir=/usr/lib64 --sysconfdir=/etc --localstatedir=/var --enable-static=no

Ezzel már alapértelmezetten el tudunk indulni. Természetesen ez még mindig csak a felszín, rengeteg egyéb beállításra van lehetőségünk. Például az mpd fordítása során nagyon sok kodek támogatás ki/bekapcsolható.

A make parancsot kivételes esetektől eltekintve érdemes úgy indítani, hogy akár több szálon is tudjunk fordítani, mert így lerövidíthető a fordítási idő. Ehhez a make után írt -j{1-65} kapcsolót tudjuk használni. Néhány program felhívja a figyelmet, hogy nincs felkészítve többszálú fordításra. Ha a program fordítása probléma nélkül végzett jöhet a telepítés.


make install

Ez minden a programhoz tartozó binárist, adatfájlokat és a program egyéb dolgait feltelepíti a fájlrendszerbe. Most már indíthatjuk a programunkat. Ez így nagyon jó. A program lefordult, feltelepedett és már használható is. Azonban mi van akkor ha úgy döntünk, hogy a továbbiakban nincs rá szükségünk vagy egy sokkal újabb verziót szeretnénk telepíteni? Távolítsuk el a régi programunkat. Ha a forrásunk még rendelkezésre áll és a configure szkript tartalmazza az eltávolításhoz szükséges információkat akkor egy


make uninstall

parancs kiadása után eltávolíthatjuk a régi programot. Ezzel azonban van egy kis probléma. A forrást állandóan gépen kell tartani. Nem biztos, hogy a program forrása támogatja az uninstall opciót. Kis apró programoknál ez még nem is jelent akkora problémát, de egy webkitgtk, kernel, libreoffice forrás elég nagy szeletet hasít ki a "szűkös" tárterületből.

Nézzük milyen lehetőségeink vannak, hogy megoldjuk ezt a problémát:

1. porg (paco) használata
2. make DESTDIR és Slackware csomagkészítés
3. slkbuild vagy egyéb Slackbuild szkript használata

Vágjunk bele!

1. porg (paco) használata

A kedvencem! A programot a http://porg.sf.net oldalról tudjuk letölteni. Fordítsuk le, telepítsük fel.


./configure --prefix=/usr --libdir=/usr/lib64 --sysconfdir=/etc --disable-grop
make -j5
make install-strip

A /etc/porgrc fájlban eszközöljünk egy apró változtatást. Mivel én általában a /home/build alatt tartom a forrásokat és itt is végzem el a fordítást ezért az EXCLUDE sort kiegészítem a :/home résszel. Így az itt keletkező fájlokat nem fogja a porg a csomag részének tekinteni és a telepített fájlok között nem jelennek meg ezek a fájlok amik itt keletkeznek.

A porg használata nagyon egyszerű. A neve is utal a funkciójára: Package ORGanizer. A porg a make install futtatását bővíti ki, tehát egy program fordítása ezentúl az alábbiak szerint fog kinézni:


./confgure --paraméterek
make -j5
porg -lp programneve "make install"

A porgnak a két paramétere az alábbiakat jelenti, -l mint log mód, tehát a make install közben a keletkező fájlokat fogja átvezetni a saját adatbázisába, a -p programneve pedig meghatározza, hogy mi legyen a program neve ami az adatbázisban tárolódik és ehhez fognak a fájlok kapcsolódni. A porg a saját adatbázisát a /var/log/porg alatt tárolja. A telepített programokat a porg -ia paranccsal tudjuk kilistázni. Egy-egy programot a porg -i programneve segítségével tudunk megnézni:


#porg -i galculator
------------
 galculator 
------------
Name:    galculator
Version: 
Summary: GTK 2 based scientific calculator
Author:  Victor Soroka <gbs@tnss.kharkov.ua>
License: GPL
URL:     

Description: 
   galculator is a GTK 2 / GTK 3 based scientific calculator with "ordinary" and reverse polish notation.

A csomaghoz tartozó telepített fájlokat pedig a porg -f programneve utasítással kérdezheted le:


# porg -f galculator
galculator:
/usr/bin/galculator
/usr/man/man1/galculator.1
/usr/share/applications/galculator.desktop
/usr/share/galculator/ui/about.ui
/usr/share/galculator/ui/basic_buttons_gtk2.ui
/usr/share/galculator/ui/basic_buttons_gtk3.ui
/usr/share/galculator/ui/classic_view.ui
/usr/share/galculator/ui/dispctrl_bottom_gtk2.ui
/usr/share/galculator/ui/dispctrl_bottom_gtk3.ui
/usr/share/galculator/ui/dispctrl_right_gtk2.ui
/usr/share/galculator/ui/dispctrl_right_gtk3.ui
/usr/share/galculator/ui/dispctrl_right_vertical_gtk2.ui
/usr/share/galculator/ui/dispctrl_right_vertical_gtk3.ui
/usr/share/galculator/ui/main_frame.ui
/usr/share/galculator/ui/main_frame_hildon.ui
/usr/share/galculator/ui/paper_view.ui
/usr/share/galculator/ui/prefs-ume.ui
/usr/share/galculator/ui/prefs_gtk2.ui
/usr/share/galculator/ui/prefs_gtk3.ui
/usr/share/galculator/ui/scientific_buttons_gtk2.ui
/usr/share/galculator/ui/scientific_buttons_gtk3.ui
/usr/share/icons/hicolor/48x48/apps/galculator.png
/usr/share/icons/hicolor/scalable/apps/galculator.svg
/usr/share/locale/da_DK/LC_MESSAGES/galculator.mo
/usr/share/locale/de/LC_MESSAGES/galculator.mo
/usr/share/locale/es/LC_MESSAGES/galculator.mo
/usr/share/locale/es_MX/LC_MESSAGES/galculator.mo
/usr/share/locale/fr/LC_MESSAGES/galculator.mo
/usr/share/locale/hu/LC_MESSAGES/galculator.mo
/usr/share/locale/ja/LC_MESSAGES/galculator.mo
/usr/share/locale/kk_KZ/LC_MESSAGES/galculator.mo
/usr/share/locale/lt/LC_MESSAGES/galculator.mo
/usr/share/locale/pl/LC_MESSAGES/galculator.mo
/usr/share/locale/pt/LC_MESSAGES/galculator.mo
/usr/share/locale/pt_BR/LC_MESSAGES/galculator.mo
/usr/share/locale/ro/LC_MESSAGES/galculator.mo
/usr/share/locale/ru/LC_MESSAGES/galculator.mo
/usr/share/locale/sk/LC_MESSAGES/galculator.mo
/usr/share/locale/sv/LC_MESSAGES/galculator.mo
/usr/share/locale/tr/LC_MESSAGES/galculator.mo
/usr/share/locale/zh_CN/LC_MESSAGES/galculator.mo
/usr/share/locale/zh_TW/LC_MESSAGES/galculator.mo
/usr/share/pixmaps/galculator.xpm

Eltávolítás egyszerűen porg -r programneve. Ezenkívül rengeteg egyéb opciója is van a programnak. Érdemes a man oldalát olvasgatni.

Fontos megjegyezni, hogy az így kezelt programok nem tekinthetők teljes értékű Slackware csomagnak, egyszerűen csak a forrásból fordított programok könnyű kezelhetőségét teszi lehetővé. A man oldalakat (általában) nem tömöríti, a binárisok nem stripped állapotúak (make install-strip nélkül, nem minden program használja). Ennek ellenére nagyon szeretem, gyors, egyszerű és könnyen karbantartható. Az így készített csomagokból bármikor lehet könnyedén Slackware csomagokat is készíteni. Én nem nagyon szoktam. Nekem jó ez így.

2. make DESTDIR és Slackware csomagkészítés

Használjuk telepítéskor a DESTDIR változót! Nem minden program forrása ismeri, de általánosságban a legtöbb igen. Adjunk meg egy könyvtárat ahová telepíteni szeretnénk a programot:


./configure --paraméterek
make -j5
make install DESTDIR=/home/csomagok/programneve

Az így telepített program nem a rendszerbe kerül hanem a DESTDIR által meghatározott könyvtárba. Természetesen ugyanolyan szerkezetben mint ahogy az majd rendes telepítés után a fájlrendszerben is látszani fog. Lépjünk be a könyvtárba, hozzunk létre egy install/ könyvtárat azon belül töltsük ki a slack-desc fájlt. Tömörítsük a binárisokat a strip programmal ha szükséges, a man oldalakat pedig gzip formátumra. Ezután elkészíthetjük a Slackware csomagot a már megismert makepkg segítségével:


makepkg ../programneve-verziószám-arch-build.txz

Ez kézi munka. Egy-két programnál elfogadható, de tömeges fordításnál elég időigényes. Ez miatt ezt csak ritkán használom, általában egyedi .deb fájlok kibontása és átcsomagolásakor.

3. slkbuild vagy egyéb SlackBuild szkript használata

A valódi csomagkészítés. Használjuk a slkbuild programot http://slkbuild.sourceforge.net/ (Arch rendszerken ismerős lehet pkgbuild néven), vagy egyszerűen írjuk meg a saját programneve.SlackBuild szkriptünket. Ezt a legkönnyebben úgy tudjuk megtanulni ha elemezzük más programok szkriptjeit. Nem nehéz a saját szkriptek megírása, de azért odafigyelést igényel, hogy ne rontsunk el semmit. Lehet 3-4 próbálkozásra fog sikerülni, de ha simán forrásból fel tudunk telepíteni egy programot akkor SlackBuild szkriptet írni hozzá nem okozhat nehézséget.

Utóírat

Nagyon sok mindent nem érintettem a leírásban, így gépelés közben jutott eszembe, hogy mi van akkor ha a program könyvtárában nincs configure szkript csak autogen.sh. Ekkor sem kell kétségbe esni, futtassuk ezt a configure előtt és utána ha minden hibátlanul lefutott már mehet a fordítás. Újabban nagyon sok program használja a cmake rendszert, van amik a waf-ot részesítik előnyben. Az ilyen programokat is simán tudjuk fordítani, csak itt kicsit másképpen néznek ki a paraméterezések. Egyes, főként régebbi programoknál előfordul, hogy következesen elszállnak hibával a fordítások. Sok ilyen program már elhagyott állapotban van és nincs felkészítve az újabb rendszerekhez való fordításra. Nincs gond. A Debian, Ubuntu, Arch és más disztribúció készítői elég sok patch-et készítenek a régebbi és még használt programokhoz. Ezeket töltsük le bátran és használjuk a forrásból kibontott állományokon. Az így kijavított forrás általában már le fog fordulni és tökéletesen működő programot kapunk.

Hirtelen ennyi jutott eszembe amit le tudtam írni. Ha kérdések lennének akkor megpróbálok válaszolni.

Mindenkinek jó csomagolást :)

Hozzászólások

Apró észrevételt teszek. Szerintem így helyes:

./configure
make
su -c 'make install'

A make install kudarcba fog fulladni felhasználói jogosultsággal.

Még valamit hiányolok. Függőségek esetén a *-devel csomagok szükségességét.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Valóban nem írtam, hogy su -c, mert feltételeztem, hogy rendszergazdaként fogja az ember telepíteni. Egyébként elhasal mint a egyszeri paraszt a tükörjégen.

A *-devel csomagok Slackware esetében nem igazán értelmezhetőek, mert minden lib hozza a saját header, include fájljait. Itt egy csomagban van minden amire szükséged lehet.

--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!

Függőségek esetén a *-devel csomagok szükségességét.

Enyje, kérem, nem tetszik követni a sorozatot? Nem olvasunk figyelmesen? Első rész:

Itt minden program egy csomag. Nincs külön szedve bin lib dev részekre. Minden egyes csomag tartalmazza az összes futtatható állományát, konfigurációkat, adatokat, libeket és a fordításhoz szükséges fájlokat (/usr/include/...). Ennek köszönhetően a csomag nincs szétaprózva, tehát ha a gtk2 csomagot feltelepítettem akkor ha fordítani szeretnék bármilyen gtk2-öt használó programot, akkor az ehhez szükséges fájlokat mind megtalálom nem kell külön keresni a fejlesztéshez szükséges csomagot. Ennek természetesen az az eredménye, hogy minden csomag jóval nagyobb, viszont a csomagok száma jóval kisebb mint a már említett rendszereken.

A porg a saját adatbázisát a /var/log/porg alatt tárolja.

Biztos? Itt nem a történéseket (naplót) jegyzi? Az adatbázisa szerintem inkább a /var/db könyvtár alatt lesz.


/var/log/porg# cat xournal 
#!porg-0.7
#t:1427655876
#s:693688
#f:42
#a:
#S:Take handwritten notes
#u:
#l:
#c:--prefix=/usr --libdir=/usr/lib64 --sysconfdir=/etc --localstatedir=/var --enable-static=no --enable-shared=yes --enable-debug=no
#i:/usr/share/xournal/pixmaps/xournal.png
#d:
/usr/bin/xournal|349080|
/usr/share/locale/ca/LC_MESSAGES/xournal.mo|10246|
/usr/share/locale/cs/LC_MESSAGES/xournal.mo|21370|
/usr/share/locale/de/LC_MESSAGES/xournal.mo|19749|
/usr/share/locale/es/LC_MESSAGES/xournal.mo|22282|
...

A programneve egy adatbázis bejegyzés. A /var/log/porg alatt így néz ki egy fájl szerkezete.
--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!

sub
-------------------------------------------------------------------------------
Az életben csak egy dolog a szép, de az épp nem jut eszembe.

Slackware Linux 14.1 | 3.10.84-janos