Twórcy pakietów – czyli i Ty możesz nim zostać 22


Poradnik ten oparty jest na artykule, który ukazał się w 52 numerze LINUXpro i jest jego bardzo luźnym tłumaczeniem jak również nieznacznie uzupełnionym. Tytuł oryginału „Creatori di pacchettiCreare file Deb con dh_make„?

Dzięki popularności Ubuntu, Deb stał się formatem pakietów binarnych najczęściej używanym (przynajmniej według Google Trends). Pomimo, że poradnik będzie skoncentrowany na Ubuntu, informacje w nim zawarte powinny również znaleźć zastosowanie w każdej innej dystrybucji bazującej na Debianie, z uwagi na fakt, że każda wykorzystuje ten sam system „paczkowania” – Deb.
Użytkownicy z małym doświadczeniem zmuszeni są do takiego rodzaju instalacji, często desperacko szukając możliwości uaktualnienia swojej ulubionej aplikacji, niestety, często nie znajdują takiej możliwości. Poradnik ten ma na celu pomóc, nie tylko osobom z mniejszym doświadczeniem, ale ogólnie przybliżyć zagadnienie tworzenia pakietów. Tworzenie i dzielenie się pakietami, to najlepszy sposób na podziękowanie społeczności Open Source.

Aplikacja, która posłuży nam jako przykład to Ale, narzędzie graficzne do łączenia zdjęć. W styczniu wyszła nowa wersja i od tego czasu twórcy Ubuntu wydają jedynie pakiety „security-fix”?, stworzenie Deb dla ostatniej wersji, to świetny sposób na uzyskanie nowych funkcji.

1. Przygotowanie systemu

Większość aplikacji, których użyjecie wykorzysta do kompilacji i instalacji tryptyk komend ./configure, make i make install jak również program Autoconf. W „kuluarach”? wykorzystywana jest seria skryptów do kalkulowania informacji dotyczących waszej dystrybucji, w taki sposób, by aplikacja mogła zostać dobrze skompilowana , a wszystkie pliki znalazły się w miejscu swojego przeznaczenia. Do tworzenia pakietów powinniśmy mieć najczystszą, jak to tylko możliwe. dystrybucję, najlepiej „default”?, mówiąc najprościej, system tuż po instalacji, bez żadnych dodatków. Kiedy kompilujecie pakiet ze źródeł, pliki binarne zostaną podlinkowane z bibliotekami zainstalowanymi w waszym systemie. Proces kompilacji nie wie czy są to wersje oryginalne, czy coś, co dodaliście na próbę, czy też pochodzą od osób trzecich, czyli powinniście budować wasze Deb używając dystrybucji możliwie jak najbliższej standardowej: maszyny wirtualne są idealne do kompilacji w czystym środowisku.

Przy konstruowaniu pakietów ze źródeł aplikacji, należy postępować mniej więcej jak w przypadku kompilacji ze źródeł i zanim rozpoczniecie powinniście upewnić się, czy macie odpowiednio funkcjonujące środowisko, zawierające wszystkie standardowe „instrumenty”? GNU dla tej operacji.

Czego będziemy potrzebować do tworzenia pakietów? Trudno sobie wyobrazić ich tworzenie bez buid-essential.

sudo apt-get install build-essential

Będziemy potrzebować jeszcze wielu innych „pomocników”?, garść pakietów ekstra, pomoże w ułatwieniu pracy przy budowaniu Deb. Pierwszym z nich jest fakeroot, którego użyjecie by się upewnić czy pliki zawarte w pakiecie należą do root. Fakeroot dodaje również zwykłemu użytkownikowi możliwość tworzenia plików z prawami root: ta operacja jest bezpieczna, w czasie tworzenia pakietów. Zdecydowanie największą część pracy wykona dh_make, narzędzie, które ma na celu „debianizację”? archiwów źródłowych, rozpoczynając od plików konfiguracji, i tworzenie za was pakietów binarnych – narzędzie, które rozpakuje kod źródłowy opracowywanego przez nas oprogramowania, a także założy strukturę plików wymaganą podczas budowania pakietu.

Kolejne dwa narzędzia, których będziecie potrzebować, to debhelper i devscripts, które razem oferują ciekawą i użyteczną wariację narzędzi. Ostatnią potrzebną rzeczą do zrobienia, będzie upewnić się, czy macie Dpkg, ale przejmować się tym powinni użytkownicy dystrybucji, które nie bazują na Debianie, w pozostałych przypadkach, Dpkg jest instalowane domyślnie.

2. Konfiguracja

Teraz, gdy już zainstalowaliśmy wszystko co niezbędne do konstruowania pakietów Deb, możemy ściągnąć kod źródłowy aplikacji, którą wybraliśmy. Opłaca się skompilować i uruchomić aplikację zanim przystąpimy do pracy, oczywiście po to by przekonać się czy nie ma jakichś problemów ingerujących w proces kompilacji. Jeśli wszystko pójdzie dobrze, wracamy do początku i rozpoczynamy od czystego kodu źródłowego.

Zakładamy katalog np: ~/ubuntu w którym będziemy trzymać nasze pakiety, a w nim podkatalog nazwaprogramu-numerwersji gdzie dwa parametry muszą być oddzielone znakiem „-„? (minus). Nazwa powinna składać się z samych małych liter. Taki format używany jest w większości aplikacji (Deb i nie-Deb). Należy się również upewnić, że oryginalne archiwum jest nazwane tak samo (ale-0.8.5.tar.gz na przykład). Wchodzimy do katalogu źródłowego (kod źródłowy). Do utworzenia niezbędnych plików konfiguracyjnych, używamy następującej komendy

dh_make -f ../ale-0.8.5.tar.gz

Upewniając się, że parametr -f odnosi się do oryginalnego archiwum.
Teraz będziemy musieli odpowiedzieć na kilka pytań: pierwsze pytanie dotyczy typu pakietu, który chcemy stworzyć – pojedyncza binarka, wiele binarek, biblioteka, moduł kernela lub CDBS. W większości przypadków aplikacji ściągniętych z internetu, można wybrać opcje „Single Binary”?. Po dokonaniu wyboru dh_make poinformuje nas o parametrach dotyczących naszego systemu i poprosi o potwierdzenie. Niezależnie od tego pytania, nie ma możliwości odwrotu, więc jedynym wyjściem jest zatwierdzenie, po którym dh_make wygeneruje wszystkie pliki konfiguracyjne i umieści je w katalogu debian.

3. Finalizowanie konfiguracji

Jeśli zerkniecie na zawartość nowego katalogu debian, zauważycie, że plików konfiguracyjnych nie jest mało. Na szczęście dla większości aplikacji będziemy musieli zmienić tylko kilka. Pierwszy, który musimy przejrzeć to Control. Plik ten zawiera główne informacje dotyczące naszej aplikacji, wraz z listą zależności do kompilacji ze źródeł (plik Dev) i do instalacji jako pakiet binarny. Wiele pól jesteśmy zobligowani wypełnić, tu z pomocą znów przychodzi dh_make, który powinien wypełnić je automatycznie i w miarę możliwości jak najwięcej. Dotyczy to również innych niezbędnych plików konfiguracyjnych. Edycja tego i innych plików w katalogu debian, jest bardzo ważna. Oto pola, które będziemy musieli uzupełnić/zmodyfikować:

Source Nazwa aplikacji, w naszym przypadku Ale
Section Kategoria wybrana przez nas, w której aplikacja zostanie umieszczona. Jako przykład, można użyć Synaptica, klikając na przycisk „Sections” .
Maintainer To my! Czyli wartość jaką należy tu umieścić, to wasze imię i nazwisko lub pseudonim, jak również e-mail
Standards W zasadzie, powinniśmy zostawić to takim jakie jest, biorąc pod uwagę fakt, że to pole reprezentuje wersję Debian package standard użytej do konfiguracji.
Package ta sama wartość jak w „Source”?
Architecture Jeśli chcemy opisać dla jakiej architektury zrobiliśmy paczkę, to jest właśnie miejsce na tę informację. Można użyć czegoś w rodzaju i386 lub AMD64 na przykład, lecz do budowanie paczek dla np AMD64 potrzebować będziemy dokładnie takiej maszyny.
Description W tym miejscu, czeka nas nieco więcej pracy. Do opisu należy stworzyć jedna linię, która może zawierać poniżej 60 znaków. Następnie można kontynuować z dokładniejszymi informacjami.

Jeśli spojrzymy teraz na otwarty plik konfiguracyjny, zauważymy, że zostały dwa najważniejsze pola: Build-Depends i Depends. To pole musi zawierać zależności: Build-Depend wskazuje te niezbędne do kompilacji pakietu ze źródeł, a Depends jedynie te niezbędne do poprawnego funkcjonowania aplikacji. Jest wiele metod, które pozwalają na sprawdzenie jakie są zależności, włączając w to również dokumentację aplikacji – czytanie jej, są również odpowiednie skrypty konfiguracyjne, lub nawet przy użyciu programu Synaptic.

Twórcy Debiana znaleźli lepszy sposób; mały skrypt, który pokaże nam wszystkie zależności. Poprawna funkcjonalność tego skryptu zależy od faktu, czy aplikacja jest projektem bazującym na Autotools i czy działa poprawnie.

strace -f -o /tmp/log ./configure
# or make instead of ./configure, if the package doesn't use autoconf
for x in `dpkg -S $(grep open /tmp/log|
perl -pe 's!.* open("([^"]*).*!$1!' |
grep "^/"| sort | uniq|
grep -v "^(/tmp|/dev|/proc)" ) 2>/dev/null|
cut -f1 -d":"| sort | uniq`;
do
echo -n "$x (>=" `dpkg -s $x|grep ^Version|cut -f2 -d":"` "), ";
done

Wystarczy skopiować ten skrypt jako plik tekstowy i uruchomić w katalogu, który zawiera pliki konfiguracyjne aplikacji (napiszcie po prostu sh ./nazwapliku). Otrzymany wynik będzie podobny do tego, który pojawia się po uruchomieniu skryptu ./configure, ale nasz skrypt zajmie się przejściem przez serię filtrów dla uzyskania oryginalnych nazw Dpkg dla zależności. W otrzymanej liście szukamy linii 'configure:make clean’, której zawartość należy skopiować do pól Build-Depends i Depends w pliku Control. Wszystkie tworzone pakiety kończą w ’-dev’, i powinny zostać dodane do linii Buil-Depends, włącznie z linią wersji: na przykład libstdc++-6.4.1.-dev (>=4.1.1-13ubuntu5). Pozostałe zależności zostaną dodane w polu Depends. Jeśli wasza aplikacja do konfiguracji używa tryptyku Automake będziecie musieli modyfikować plik rules: to wersja Makefile Debiana używana przez dpkg-buildpackage do poprawnej kompilacji pakietu. Jeśli używacie Automake, najtrudniejszą część mamy za sobą. Teraz wystarczy już zmodyfikować kilka innych plików konfiguracyjnych i jesteśmy gotowi do kompilacji.

Otwieramy changelog w ulubionym edytorze tekstowym: obecność tego pliku jest wymagana. Jego specjalny format wykorzystywany jest przez dpkg i inne programy do uzyskiwania informacji o numerze wersji, poprawce, dystrybucji i pilności waszego pakietu.

Jest on również ważny dla was, ponieważ dobrze jest mieć udokumentowane wszystkie zmiany, których dokonaliście. Pomaga to ludziom pobierającym wasz pakiet zorientować się czy nie zrobiliście z pakietem czegoś, o czym powinni oni wiedzieć. I na koniec, changelog, to miejsce w którym znajdują się wszelkie informacje o aktualnym i poprzednich wydaniach. Takie różnice powinny być „wylistowane”? w sekcji poprzedzonej gwiazdką, na przykład:

1 ale (0.8.5-1) unstable; urgency=low
2
3 * Initial Release.
4 * This is my first Debian package.
5
6 — Ubuntu Ubunowski <ubuntu@ubuntu.pl> Wed, 30 Apr 2007 14:02:14 +0100

(numery linii dodane przeze mnie)

Aktualna nazwa aplikacji znajduje się w pierwszej linii pliku konfiguracyjnego, należy teraz odnieść się do nazwy naszej dystrybucji. Dla Ubuntu, jedyną rzeczą do zrobienia będzie zamiana 'unstable’ na 'Feisty’ (lub wersję dystrybucji, której używacie). Pozostałe linie to dziennik, w którym dokumentujemy zmiany dokonane w poprawce pakietu (ale nie zmiany zewnętrzne – do tego celu służy specjalny plik stworzony przez autorów programu). Możecie to zrobić używając jakiegoś edytora tekstu. Debian New Maintener’s Guide ( http://debian.org/doc/maint-guide ) sugeruje również modyfikowanie pliku Copyright jak i README.debian i zawarcia jakichkolwiek innych informacji, które posiadacie, dotyczących kompilowanego przez Was pakietu.

I to już prawie wszystko, prawie bowiem pozostaje jeszcze manpage waszej aplikacji. tym też zajął się dh_make i stworzył domyślny manpage (pewnego rodzaju wzornik), a to co pozostało do zrobienia, to zamiana wartości tych napisanych ad hoc, lub napisanie nowych, jeśli czujecie się na siłach.

4. Witajcie na scenie

Po tym jak już wszystkie pliki konfiguracyjne uzupełniliśmy i dodaliśmy wszystko co niezbędne, jesteśmy gotowi do zrobienia finałowego kroku: konstruowanie pakietu Deb. Magicznym „słowem”? jest dpkg-buildpackage -rfakeroot, które należy uruchomić w folderze źródłowym.
I to już wszystko.

Do zainstalowania waszego pakietu wystarczy użyć polecenie:

sudo dpkg -i ale_0.8.05-1_i386.deb

Ale zawsze jest coś co można jeszcze zrobić. Następnym krokiem będzie… właściwie pozostało jedynie podzielić się nowo stworzonym pakietem z innymi użytkownikami.

Dobrym miejscem do rozpoczęcia jest forum waszej dystrybucji. Nawet nie zdążycie podrapać się za uchem, gdy legiony użytkowników zaczną instalować i używać wasz pakiet, a wasze skrytki pocztowe zaczną pękać w szwach od kolejnych maili z prośbami nowsze wersje, z prośbami o pomoc, bo coś nie funkcjonuje… i czasem jakieś okazjonalne „dziękuję”?.
Witamy w społeczności Open Source!

UZUPEŁNIENIE czyli ALTERNATYWA

Jak w każdym przypadku, podobnie i w tym, istnieje alternatywa, sposób prostszy na tworzenie Deb, a jest nim zastosowanie narzędzia, które nazywa się Checkinstall. Narzędzie to redukuje czas pracy i, w porównaniu z dh_make zdaje się pracować w „mgnieniu oka”. Używając checkinstall nie będziecie musieli modyfikować żadnego pliku konfiguracyjnego, co nie znaczy, że nic nie będziemy musieli zrobić.

Checkinstall wchodzi do gry na miejsce make install, co znaczy, że ręcznie należy uruchomić skrypt ./configure po czym make w katalogu głównym aplikacji. W miejscu, gdzie zwykle pojawia sie make install, uruchamiamy checkinstall. Następnie będziemy musieli odpowiedzieć na kilka pytań, podobnie jak w/w przypadku (gdzie używaliśmy dh_make) z plikiem Control, włącznie z przeznaczeniem dla dokumentacji i opisem pakietu, przed możliwością zmian globalnych takich jak opis pakietu i licencja, na jakiej pakiet zostaje wydany. Gdy to zrobimy, Checkinstall stworzy plik *.deb i zapisze w folderze źródłowym.

Webografia.

http://7thguard.net/news.php?id=3231
http://www.debian.org/doc/manuals/maint-guide/index.pl.html
ttp://www.debianusers.pl/article.php?aid=58
http://wiki.cdlinux.pl/index.php/Automatyczne_tworzenie_pakiet%C3%B3w_DEB
https://perso.duckcorp.org/duck/cdbs-doc/cdbs-doc.xhtml


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

22 komentarzy do “Twórcy pakietów – czyli i Ty możesz nim zostać

  • Hag1313

    Przyda się 🙂 Dzięki.

    Tylko takie pytanie: dystrybucja jak nabliższa do oryginalnej to znaczy, że kompilować na systemie bez nałożonych poprawek?

    Pozdrawiam

  • kwalo

    @Hag1313 – poprawki mogą być. Chodzi o to, żeby to było goluteńkie Ubuntu, bez instalowanych dodatkowych pakietów.

    @lukas – możesz sobie postawić wirtualny system, przy pomocy np. virtualbox.

  • skoruppa

    Osobiscie wole checkinstall 🙂 mniej zabawy. Ale jak juz trzeba zrobic jakas bardziej oficjalna paczke (najczesciej jakas aktualizacje) to przyznam sie bez bicia, uzywam svn debiana.
    Np w repo ubuntu mamu najnowsza stabilna wersje 0.8.6b a ja chce najnowsza niestabilna 0.9.0.
    Sciagam sobie zrodleka, rozpakowywuje, wchodze do folderu z zrodlami i sciagam folder debian (o ktorym bylo w artykule troche wyzej) z svna debiana
    svn co svn://svn.debian.org/pkg-multimedia/videolan/vlc/debian debian

    Oczywiscie sa male niezgodnosci w nazwach pakietow miedzy debianem a ubuntu (np w debianie jest libfaad-dev a ubuntu m libfaad2-dev, mimo, ze to te same pakiety). Dlatego po drobnej modyfikacji pliku Control i spelnieniu zalerznosci mozna zrobic wszytsko jedna komenda (configure, make i tworzenie pakietu)

    dpkg-buildpackage -rfakeroot -us -uc

    Idziemy zrobic sobie herbate/kawe, czekamy az sie skompiluje i stworzy paczka deb.
    Jedyne czego mi brak to takiego svna dla ubuntu ^^

  • anonim

    Jak dla mnie słabo opisane co i jak .. nie do końca wszystko tak pięknie działa … w przeciwieństwie do checkinstall które smiga az miło 🙂

    no nic … jeszcze dużo wody w wc upłynie zanim będzie się prościej niż checkinstall’em paczki w debiano pochodznych distro robiło. już choćby slackware ma prościej .. znacznie prościej 🙂

    LOL dla sposobu pakowania… pochwała za chęci opisania problemu – choc marnie.

  • Juraviell

    [quote comment=”4720″]

    Idziemy zrobic sobie cherbate/kawe, czekamy az sie skompiluje i stworzy paczka deb.
    Jedyne czego mi brak to takiego svna dla ubuntu ^^[/quote]

    sorry że się czepiam ale „herbata” pisze sie przez „h”

  • SlavNix Autor wpisu

    [quote comment=”4722″]
    LOL dla sposobu pakowania… pochwała za chęci opisania problemu – choc marnie.[/quote]
    Lubię krytyczne opinie, motywują 😉 Dziękuję.

  • blount

    [quote post=”240″]- Section Sekcja, w której pakiet zostanie umieszczony. Może to być main, non-free lub contrib.[/quote]

    Błąd – sekcje są np. admin, kde, graphics, net, web, x11. Main, non-free czy contrib to podsekcje (main jest domyślna).

  • SlavNix Autor wpisu

    @blount Faktycznie :/ Nie mam pojęcia jak wkradł się ten błąd. Najprawdopodobniej w czasie poprawiania/przestawiania tekstu.

    Dziękuję. Poprawione.

  • buldi

    [quote post=”240″]Większość aplikacji, których użyjecie wykorzysta do kompilacji i instalacji tryptyk komend ./configure, make i make install jak również program Autoconf. [/quote]

    Pewnie powinno być: „skrypty komend.” a nie „tryptyk komend” to raczej tylko literówka.

  • buldi

    ./configure, make i make install jak również program Autoconf.

    Co w przypadku programów opartych o inne systemy wspomagania procesu generowania kodu, np.: scons itp. ?

  • rineo

    [quote post=”240″]Pewnie powinno być: „skrypty komend.” a nie „tryptyk komend” to raczej tylko literówka.[/quote]
    Buldi: tryptyk ponieważ są to trzy nierozerwalnie związane ze sobą polecenia. Zresztą z tej trójki tylko „configure” jest skryptem.

  • Siaco

    [quote comment=”4709″]Fajny arcik! Szkoda tylko, że trzeba mieć czyściutki system bo już bym sie za to zabrał ;].[/quote]

    Proponuję się zainteresować 'chroot-em’. W Debianie przy pomocy np. 'debootstrap’ tworzysz sobie w jednym katalogu czysty podstawowy system. Potem robisz 'chroot ’ i doinstalowujesz wszystko czego potrzebujesz do kompilacji i tylko w tym środowisku budujesz pakiety. W ten sposób możesz je nawet budować na każdą wersję dystrybucji (stable, testing, unstable) w jednym systemie.

    Wytaczanie w tym celu wirtualki to trochę armata na muchy….

    S.

  • cezaryece

    No dobra.. a co jeśli chciałbym stworzyć pakiet deb do zainstalowania nie oprogramowania tylko dodatków, na przykład ikonek do Kadu?
    Czyli mam coś, co ma po instalacji z pakietu deb trafić do odpowiedniego katalogu na dysku, oczywiście pod warunkiem spełnienia zależności (w tym wypadku zainstalownia Kadu).

  • dampol

    [quote comment=”41″]Przyda się 🙂 Dzięki.

    Tylko takie pytanie: dystrybucja jak nabliższa do oryginalnej to znaczy, że kompilować na systemie bez nałożonych poprawek?

    Pozdrawiam[/quote]
    Nie tylko.
    Jak najmniej pakietow

  • QkiZ

    Jak dla mnie to za mało szczegółowy jest ten opis. Autor napisał go jak dla osób które już to robiły, a nie dla osób, które jeszcze nigdy nie tworzyły paczek.