Hlavní navigace

Debianizace vlastních zdrojů

12. 12. 2003
Doba čtení: 10 minut

Sdílet

Ihned po přechodu od RPM distribuce k .deb distribuci Linuxu mne zajímalo, jak složité bude debianizovat moji vlastní, původně RPMlizovanou, tvorbu. Celý proces byl jednodušší, než jsem si byl původně při čtení dokumentace myslel. V tomto článku takovou tvorbu .deb balíčků z vlastních zdrojů popíši.

Prolog:
Tento článek patří se hrdě hlásí k těm článkům, které by bez diskusí u johančích článků asi nikdy nebyly napsány, a jako reakce na dlouho trvající seriál o Debianích balíčcích, kde se nic takového doposud neobjevilo (má trpělivost je, žel, shora omezená;).

Úvod

Mám to číst?

Jste programátor, něco jste vytvořil a rád byste váš výtvor, který teď máte v .tar.gz, poskytli někomu (nejlépe veřejnosti) ve formě debianího balíčku a nemáte s jeho tvorbou vůbec žádnou zkušenost? Přešli jste z nějaké jiné distrubuce na distribuci založenou na .deb balíčcích a rádi byste je začali také tvořit? Není zrovinka ten váš oblíbený opensource software ještě debianizován a nechce se vám jej instalovat jen tak z .tar.gz (i když to umíte;)? Nejde vám o detaily, ale prostě ten váš .deb balíček potřebujete za hodinku mít? Čtěte dál!
 break;

Jste debianí guru? Tak vy se to neodvažujte číst ani o znak dále! ;)

default: nečtěte to!

Inicializace proměnných

V dalším budu (krom toho, že jste developer na Linuxu) předpokládat, že debianizujete na Debianu Woody či Sid a že (běžně) užíváte apt-get install a dpkg.

Dále budu předpokládat debianizování balíčku foo.tar.gz., jehož obsah jste schopni na vašem stroji běžnou cestou přeložit a naistalovat. Tedy víte, jak jej rozbalit, a po četbě README jste zápasili s./configure, make, make test a konečně make install podle přiloženého INSTALL.

Instalace potřebného

Spuštěním příkazů:

apt-get update
apt-get install doc-debian debian-policy debmake devscripts fakeroot
apt-get install apt dpkg
apt-get install make g++ gcc perl autoconf sed libc6-dev 

naistalujeme debianí balíčky, které budeme k debianizaci a tvorbě.deb balíčků potřebovat:

  • doc-debian: dokumentace v /usr/share/doc/de­bian/FAQ
  • debian-policy: základní čtení každého .debinaizátora – Debian Packaging Manual/usr/sha­re/doc/debian-policy/policy­.txt.gz
  • debmake: program /usr/bin/deb-make
  • devscripts: perlovský skript /usr/bin/dch; z tohoto balíčku užijeme jen dch a debchange
  • fakeroot: program /usr/bin/fakeroot
  • dpkg: nejnovější verze debianího instalátoru balíčků
  • make g++ gcc perl autoconf sed libc6-dev: minimální vývojové prostředí

Po nainstalovaní potřebného si něco málo o debianím balíčkování můžete přečíst v naistalované dokumentaci (doporučená četba je uvedena v referencích na konci článku).

Vlastní debianizace

Příprava

Nejprve zkusíme podle tradiční kuchařky balíček rozbalit a přeložit. Rozbalíme balíček (v našem příkladě spustíme tar xvzf foo.tar.gz a vidíme, že se nám vytvořil adresář foo a v něm další zdroje) a adresář se zdroji z balíčku přejmenujeme tak, aby název obsahoval i číslo verze ve formě jmeno-balicku-ver.ze (v názvu se nesmí vyskytovat podtržítko ‚_‘. Tedy v našem příkladě vytvořený adresářfoo přejmenujeme na foo-1.0. Vkročíme do adresáře se zdroji (tedy u nás cd foo-1.0 a zkusíme kompilaci tak, jak jsme u podobných balíčků zvyklí. Je-li vše v pořádku (kompilace běží, jak má), přistoupíme k vlastní debianizaci.

Spuštění dep-make

Inicializace je jednoduchá, v adresáři, který vznikne rozbalením původního .tar.gz, spustíme příkaz:

  deb-make

či

  deb-make native

Samotné deb-make vytvoří kopii původního adresáře a dá mu příponu .orig, tento adresář bude obsahovat neupravené zdrojové soubory pro pozdější tvorbu rozdílového diff souboru. Tedy v našem příkladu deb-make vytvoří foo-1.0.orig na stejné úrovni adresářové struktury, jako je foo-1.0.

Parametr native užijeme tehdy, když neplánujeme vytvářet rozdílové diff soubory (tedy ani kopii původního adresáře). V případě, kdy je balíček z naší vlastní dílny, je native namístě.

V každém případě deb-make vytvoří v adresáři, ve kterém byl spuštěn, adresář debian se šablonami všech možných souborů potřebných (i nepotřebných) pro tvorbu .deb balíčku.

Úprava Makefile souborů

Během tvorby .deb balíčku se přeložené soubory instalují nikoli do hlavního adresářového stromu, ale vytvoří se strom dočasný s kořenem v $DESTDIR. Pravě tato dočasná struktura se svine do kýženého balíčku.

Aby vše fungovalo, jak má, je třeba, aby make install instalovalo na správné místo, tedy od $DESTDIR a nikoli od /. Musíme tedy upravit všechny příslušné Makefile soubory tak, abyinstall užíval proměnnou $(DESTDIR), kterou programu make předá řídící soubor tvorby balíčku. Máme-li v Makefile například:

install:
    cp foo /usr/bin/foo
    chmod 755 /usr/bin/foo
    cp -p foo.man /usr/man/man1/foo.1
    chmod 644 /usr/man/man1/foo.1
    rm -rf /usr/share/doc/foo
    cp -a docs /usr/share/doc/foo

provedeme úpravu tak, aby se užíval správný kořen adresářové struktury. Dostaneme tedy:

install:
    cp foo $(DESTDIR)/usr/bin/foo
    chmod 755 $(DESTDIR)/usr/bin/foo
    cp -p foo.man $(DESTDIR)/usr/man/man1/foo.1
    chmod 644 $(DESTDIR)/usr/man/man1/foo.1
    rm -rf $(DESTDIR)/usr/share/doc/foo
    cp -a docs $(DESTDIR)/usr/share/doc/foo

Úprava souboru debian/rule

Tvorbu .deb balíčku řídí soubor debian/rules. Jedná se o skript pro make, tedy užívá stejnou syntax, jakou užívajíMakefile soubory. Pozor tedy při jeho editaci, tabulátory na začátcích řádků mají svůj syntaktický význam! Zaměříme se na cíle (targets) build, binary-arch a clean.

V oddíle pro build: bude následovat sled těch správných příkazů, které povedou k vytvoření binární verze našeho software; čili je zde obsaženo ./configure se správnými volbami následované$(MAKE) s příslušnými parametry. V oddíle pro cíl binary-arch upravíme řádek, který začíná $(MAKE) install, tak, aby se make, které užije naše dříve upravené Makefile, správně předala proměnná s počátkem balíčkového adresářového stromu. Například pro překlad některého software je potřebné provést následující úpravu:

$(MAKE) install prefix=`pwd`/debian/tmp/usr DESTDIR=`pwd`/debian/tmp 

Dále upravíme oddíl pro clean tak, aby se po jeho užití smazalo opravdu úplně všechno, co vzniklo během tvorby balíčku. Takže možná budete muset dodat do tohoto oddílu následující řádky:

-rm -f core DEADJOE a.out
-rm -f config.status config.cache config.h
-rm -rf autom4te.cache

Jelikož budeme chtít vedle binární verze našeho debianizovaného balíčku generovat i zdrojové debianí balíčky, přidáme do debian/rules ještě jeden cíl, a to source, takže soubor doplníme o následující řád­ky:

.PHONY: source
source: clean
    DIR="`pwd`";DIR="$${DIR##*/}"; cd .. && dpkg-source -b "$$DIR" 

Úprava debian/control

V souboru debian/control jsou údaje, které se přibalí k debianímu balíčku a jsou posléze využity při instalaci ke kontrole závislostí, k zobrazení informací o balíčku instalačními programy.

Část Source: souboru debian/control je vhodné upravit tak, aby obsahovala:

  • Maintainer: vaše jméno a vhodná e-mailová adresa. Příklad:
      Maintainer: Au Tor <au@tor.cz>
  • Build-Depends: výčet všech debianích balíčků, které jsou potřeba pro kompilaci právě vytvářeného balíčku.
    Nezapomeňte na balíček debmake. Příklady:
    Build-Depends: debmake, gcc, make, sed, bash
    Build-Depends: debmake, g++, perl, wget | wget-ssl, libz-dev

Část Binary: by neměla postrádat následující části:

  • Depends: seznam balíčků, na kterých závisí funkčnost našeho balíčku, kromě knihoven pro ELFové binárky. O závislost na knihovnách se postará direktiva ${shlibs:Depends}, kterou je možné smazat (je defaultně přednastavena) tehdy, pokud vlastní ELF binárky nevytváříme. Příklady:
    Depends: mtools, bash, grub, sed
    Depends: ${shlibs:Depends}, apache (>= 1.1) | apache-ssl
  • Recommends: velmi doporučované balíčky, které vetšina uživatelů nového balíčku bude potřebovat k plné funkčnosti našeho balíčku.
  • Suggests: další (o něco méně) doporučované balíčky, které ještě více rozšíří funkčnost našeho balíčku.
  • Replaces: seznam debianích balíčků, jež instalují jeden nebo více souborů, které soubor(y) našeho balíčku plně nahrazuje(í)
  • Description: jednořádkový popis tohoto balíčku. Na dalším řádku poté následuje víceřádkový popis balíčku, přičemž každý další řádek popisu začíná mezerou. Příklad:
    Description: that's typical foo program
    foo is a UNIX command line utility written in
    ANSI C++ that converts many raster FOO image
    formats into other FOO files. The FOO images
    are not vectorized. foo gives full control to
    the user to specify standards-compliance,
    compression, and bit depths. In some cases
    foo can compress an image 100 times smaller
    than the PostScript output of many other
    common image converters. foo provides ZIP,
    RLE and LZW (de)compression filters even on
    Level1 devices.
    .
    A tady bude dalsi odstavec...
    

Podrobnější popis tohoto souboru naleznete v již zmíněném manuálu: Debian Packaging Manual. V souboru /var/lib/dpkg­/status můžete hledat inspiraci pro Depends:. Do souboru debian/control nepřidávejte položkuVersion:, deb-make si označení verze balíčku určí z údaje v souboru debian/changelog (viz níže).

Soubor debian/changelog

Tento soubor obsahuje vedle označení verze a stavu vývoje balíčku i seznam provedených změn.

Pro další práci se souborem je dobré nejprve upravit řádek obsahující číslo verze balíčku (odovozeného od označení adresáře; viz výše) tak, aby obsahovalo i pořadí sestavení balíčku (build number, relase number). Tedy finálně chceme, aby číselné označení balíčku mělo formát: vvv.vv-bb, kde vvv.vv je číslo verze a bb pořadí sestavení (buildu) balíčku. Tedy např. řádek

foo (1.0) unstable; urgency=low

upravíme na

foo (1.0-1) unstable; urgency=low

Pro pohodlnou manipulaci se souborem debian/changelog máme k dispozici nástroj (perlovský script) dch. Příkazem

dch -i

zvedneme číslo sestavení a zároveň se nám otevře editor (ten, který je nastaven v proměnné prostředí EDITOR) a kurzor v otevřeném souboru skočí na nově vytvořený řádek začínající *. Od nás se pak očekává, že za * popíšeme příslušné provedené změny oproti předchozímu sestavení (release, buildu) balíčku.

Příklad:

foo (1.0-2) unstable; urgency=low

* Uprava oddilu Description:, Depends: a
  Build-Depends: v souboru debian/changelog,
  upraveny Makefile tak, aby uzival $(DESTDIR) atd.

- Au Tor <au@tor.cz> Fri, 7 Feb 2003 14:11:17 +0100

foo (1.0-1) unstable; urgency=low

* Initial Debian release.

- Au Tor <au@tor.cz> Fri, 7 Feb 2003 14:04:44 +0100

Local variables:
mode: debian-changelog
End:

Ujistěte se, že plné číselné označení verze balíčku (v našem příkladu 1.0–2) je správné, nachází se na začátku souboru a je větší, než poslední číselné označení verze již vytvořeného, publikovaného či instalovaného balíčku stejného jména.

V případě, že chcete přidat do debian/changelogu u stejného buildu další dokumentovanou změnu (tedy další řádek začínající *) užijte příkaz:

dch -a

Další soubory v adresáři debian/

Soubor debian/dirs:

Obsahuje seznam všech adresářů, které balíček potřebuje a které nejsou vytvořeny automaticky spuštěním cíle install: Makefile čiMakefile.in. Co řádek, to adresář. Pozor, jméno adresáře nesmí začínat /, o vložení vhodného kořene se postará balíčkovací program sám. Například:

usr/bin
usr/sbin
usr/share/man/man1

Další soubory debian/* nevyžadují editaci či změnu. V soubory debian/*.ex slouží jako příklady, takže je můžete buď použít – přejmenovat tak, že jejich jméno zbavíte přípony .ex a pak poeditovat – či je můžete smazat.

Vytváříme .deb balíčky

Tak debianizace zdrojů je za námi a teď přijde vrchol naší práce, tvorba .deb balíčků (míněno binárních a zdrojových).

Nejprve otestujeme, zda kompilace binárních souborů probíhá tak, jak budeme pro tvorbu balíčku potřebovat. V adresáři balíčku spustíme příkaz:debian/ru­les build.

Tím nastartujeme kompilaci, která může probíhat delší dobu, jelikož se budou spouštět příslušné sekvence ./configure; make tak, jak jsme je v řídících souborech nadefinovali. V případě problémů a chyb při kompilaci poeditujeme sekci build: v souboru debian/rules, případně vhodně upravíme několik příslušných dalších Makefile souborů. Před každým dalším spuštěním debian/rules build odstraňte soubor build a další dočasné soubory/adresáře spuštěním příkazu: debian/rules cle­an

Až bude zřejmé, že kompilace běží, jak má, přistoupíme k balení do .deb.

Vlastní .deb balíček vytvoříme spuštěním následující sekvence příkazů:

rm -f *~
fakeroot debian/rules binary

V případě, že chceme vytvořit i debianí zdrojové soubory (.tar.gz a .dsc), spustíme navíc příkaz:

debian/rules source

Dalším nepovinným krokem je vytvoření příslušného rozdílového diff souboru. V tomto případě spustíme (vhodně upravenou) následující sekvenci příkazů:

root_podpora

debian/rules clean
(cd ..; diff -ru foo-1.0{.orig,} >foo-1.0-2.patch)

No a nakonec si nezapomeneme vychutnat instalaci vlastnoručně vytvořeného .deb balíčku.

dpkg -i ../foo_1.0-2_i386.deb

Reference

  • manuálové stránky deb-make(1), debstd(1), dch(1) a dpkg(1)
  • dokumentace k deb-make: na Debianu v /usr/share/doc/deb­make/HOWTO.fir­st_time a /usr/share/doc/deb­make/README.de­bian
  • Debian Packaging Manual: /usr/share/doc/de­bian-policy/policy­.txt.gz, usr/share/doc/de­bian/FAQ/index­.html

Poděkování a lásku vám

Rád bych poděkoval Peterovi Szabo z Maďarska za jeho skvělý tutoriál pts' first Debian package tutorial, který se stal podkladem k pomuto článku. Rád bych poděkoval i Johance za korekce mé češtiny a za její vlastní inspirativní články a z nich plynoucí diskuse.

Byl pro vás článek přínosný?