Balíčky pro Debian - 4. Kompilace balíčku a náš první balíček
Byrokracii máme úspěšně za sebou a dnes se poprvé pokusíme vytvořit vlastní balíček.
Trocha teorie na úvod
Balíček pro Debian se kompiluje spuštěním souboru debian/rules
. Dříve mohl
být tento skript libovolný, ale v současné době se už musí jednat o makefile
(tedy skript pro
Make)
s pevně danou sadou cílů:
build
- povinný cíl, který zkompiluje programbuild-arch
abuild-indep
- volitelné cíle pro kompilaci architekturově závislých a nezávislých částí balíčkubinary
,binary-arch
,binary-indep
- povinné cíle pro vytvoření balíčku, první vytvoří všechny další dva opět jen balíčky závislé respektive nezávislé na architektuřeclean
- povinný cíl, který má za úkol vrátit vše, co mohly provést výše uvedené cíleget-orig-source
- volitelný cíl, který by měl vytvořit soubororig.tar.gz
, pokud je pro jeho vytváření potřeba nějaká úprava originálního zdroje
Tučně zvýrazněné cíle tedy musí mít každý balíček. Kromě těchto cílů si můžeme
definovat libovolné vlastní, obvyklé ještě bývá mít cíle configure
pro
konfiguraci (tedy například puštění skriptu ./configure
) a install
pro
provedení instalace (make install
).
Potřebné nástroje
Pro kompilaci balíčků potřebujeme minimálně sadu nazvanou "build essentials"
tyto balíčky se nám nainstalují při instalaci balíčku build-essential
.
Dále by se všechny balíčky měly kompilovat pod superuživatelem root
, aby
bylo možné vytvářet soubory se správnými právy. Protože však toto není zrovna
bezpečná cesta, vznikl wrapper fakeroot
(ve stejnojmenném balíčku), který
předstírá, že proces běží pod uživatelem root
a přístupy na soubory emuluje
tak, aby přístupová práva zůstala zachována po dobu jeho běhu. Pro kompilační
proces tak vše vypadá, že běží pod superuživatelem, ale ve skutečnosti se
používá běžný účet uživatele.
Poslední nástroj, který nám usnadní práci bude dh-make
, který použijeme na
vytvoření základní kostry balíčku. Postup v články byl zkoušen s verzí 0.44 a
je možné, že jiné verze budou produkovat trochu jiné výsledky.
Před dalším krokem proto nainstalujte vše potřebné:
# apt-get install dh-make fakeroot build-essential
Náš první balíček
Jako ukázkový balíček zabalíme aplikaci
hello.
Nedělá nic užitečného, ale na pochopení základů vytváření balíčků nám postačí.
Vytváření balíčku obvykle spočívá v mnoha krocích a proto byl vytvořen nástroj
dh_make
(z balíčku dh-make
), který nám základní kroky usnadní.
Program dh_make
vytvoří základní strukturu balíčku, předhodí nám hromadu
ukázkových souborů a vůbec se snaží zjednodušit první kroky. Jak již víme z
prvního dílu, originální tarball by se měl jmenovat trochu jinak než ten
stažený, takže ho přejmenujeme a rozbalíme:
$ wget -q http://osdn.dl.sourceforge.net/sourceforge/abeni/hello-0.1.tar.gz
$ mv hello-0.1.tar.gz hello_0.1.orig.tar.gz
$ tar xfz hello_0.1.orig.tar.gz
$ cd hello-0.1/
Nyní již může přijít na řadu dh_make
. Ten můžeme pustit bez jakýchkoliv
parametrů a na základní vlastnosti se nás zeptá, ale je lepší mu zadat další
vlastnosti balíčku prostřednictvím parametrů.
Parametr -c
určuje licenci, pod kterou balíček je, a tím pro nás dh_make
připraví vhodnou šablonu pro soubor debian/copyright
. V našem případě je
program hello
pod GNU GPL a použijeme tedy -c gpl
.
Pomocí dalších parametrů můžeme zadat typ balíčku, pokud ho nezadáme, tak se
nás na něj dh_make
zeptá, takže to není nezbytně nutné.
Další informace čerpá dh_make
z proměnných prostředí DEBEMAIL
a
DEBFULLNAME
- ty obsahují jméno a email správce balíčku (stejné proměnné
používají i další nástroje, převážně pak ty z balíčku devscripts
).
Nyní již tedy víme co budeme potřebovat a můžeme dh_make
spustit:
$ export DEBFULLNAME='Stojan Jakotyč'
$ export DEBEMAIL='stojan@example.com'
$ dh_make -c gpl
Type of package: single binary, multiple binary, library, kernel module or cdbs?
[s/m/l/k/b] s
Maintainer name : Stojan Jakotyč
Email-Address : stojan@example.com
Date : Tue, 05 Feb 2008 14:32:06 +0900
Package Name : hello
Version : 0.1
License : gpl
Type of Package : Single
Hit <enter> to confirm:
Skipping creating ../hello_0.1.orig.tar.gz because it already exists
Done. Please edit the files in the debian/ subdirectory now. hello
uses a configure script, so you probably don't have to edit the Makefiles.
Nyní se nám vytvořil adresář debian
, který obsahuje vygenerované soubory,
tak i příklady pro ostatní. Příklady pro mnoho dalších akcí nás u takto
jednoduchého balíčku nezajímají a adresář debian
můžeme poněkud pročistit
jejich odstraněním:
$ rm debian/*.ex debian/*.EX
Balíček nyní můžeme zkusit zkompilovat nástrojem dpkg-buildpackage
(z
balíčku dpkg-dev
), ale brzy narazíme na chyby, takže se tento proces asi bez
našeho zásahu neobejde (parametr -rfakeroot
není v novějších verzích
potřeba):
$ dpkg-buildpackage -rfakeroot
dpkg-buildpackage: source package hello
dpkg-buildpackage: source version 0.1-1
dpkg-buildpackage: source changed by Stojan Jakotyč <stojan@example.com>
dpkg-buildpackage: host architecture i386
fakeroot debian/rules clean
dh_testdir
dh_testroot
rm -f build-stamp
# Add here commands to clean up after the build process.
/usr/bin/make distclean
make[1]: Entering directory `/tmp/firstdeb/hello-0.1'
make[1]: *** No rule to make target `distclean'. Stop.
make[1]: Leaving directory `/tmp/firstdeb/hello-0.1'
make: *** [clean] Error 2
dpkg-buildpackage: failure: fakeroot debian/rules clean gave error exit status 2
Pro náš balíček bohužel dh_make
neodhadl správně všechny příkazy v
debian/rules
, takže se budeme muset podívat jak vlastně tento soubor vypadá.
Pokud si ho otevřete v editoru, uvidíte mnoho příkazů debhelperu
- dh_*
.
Prozatím si jich nebudeme všímat, protože výchozí chování nám prozatím
vyhovuje a budou podrobněji popsány v dalších dílech seriálu.
První chyba na kterou jsme narazili je při volání make distclean
. Problém
je, že v této době ještě nemusí být vytvořen soubor Makefile
, takže tento
příkaz může selhat. Správné řešení tohoto problému je otestování existence
souboru Makefile
před spuštěním tohoto příkazu:
[ ! -f Makefile ] || $(MAKE) distclean
Při dalším spuštění dpkg-buildpackage
narazíme na problém s parametry pro
configure, protože náš balíček používá starší verzi autoconfu. Řešení tohoto
problému je opět jednoduché - stačí přesunout předávání proměnných CFLAGS
a
LDFLAGS
před volání ./configure
:
CFLAGS="$(CFLAGS)" LDFLAGS="-Wl,-z,defs" ./configure ...
Nyní již by nám dpkg-buildpackage
měl vytvořit binární i zdrojový balíček:
...
dpkg-deb: vytvářím balík `hello' v `../hello_0.1-1_i386.deb'.
signfile hello_0.1-1.dsc
gpg: skipped "Stojan Jakotyč <stojan@example.com>": secret key not available
gpg: [stdin]: clearsign failed: secret key not available
dpkg-genchanges >../hello_0.1-1_i386.changes
dpkg-genchanges: including full source code in upload
dpkg-buildpackage: full upload (original source is included)
dpkg-buildpackage: warning: Failed to sign .dsc and .changes file
Můžeme si pogratulovat, právě jsme vytvořili první balíček. Výsledek po
dnešním dílu si také můžete stáhnout zde:
hello_0.1-1.dsc,
hello_0.1-1.diff.gz,
hello_0.1.orig.tar.gz.
Nicméně do dokonalosti má ještě daleko. Jako domácí úkol si do příštího dílu můžete
upravit soubory, které jsme popsali v minulých dílech. Další problém, který
můžete vidět ve výstupu dpkg-buildpackage
, je, že se nepodařilo balíček
podepsat. Na opravení této chyby stačí vygenerovat PGP klíč pro našeho
uživatele. Domácích úkolů už máte dost, příště si podrobněji rozebereme co se
děje v debian/rules
.