Împachetarea unui program pentru Fedora - Gnocky

Gnocky este o aplicație grafică liberă integrată bine în GNOME, cu care poți trimite SMS de pe calculator. În spate, Gnocky folosește biblioteca liberă gnokii.

Dacă poza de mai jos te convinge să încerci Gnocky, poți afla dintr-un articol anterior cum îl poți configura.

Captură cu Gnocky

Pe Fedora poți testa ultima versiune de Gnocky, de acum 2 ani (decembrie 2008), doar compilând sursele, ceea ce nu este prea comod. Pentru Debian/Ubuntu, există deja un pachet deb, așa că m-am gândit să-l împachetez și pentru Fedora.

Cartea de bucate RPM este, fără îndoială, pagina wiki de pe FedoraProject.org, How to create an RPM package. Îți recomand să o citești pe diagonală și să revii la ea ori de câte ori te afli în încurcătură.  Eu în continuare îți ofer minimul de informații ca să faci un pachet, dacă ești în grabă. Și folosesc ca exemplu împachetarea lui Gnocky.

  1. Compilează programul din surse, ca să vezi ce dependențe are (./configure ți le va spune) și dacă merge. Notează aceste dependențe undeva, preferabil pe o pagină wiki dedicată, ca să știe și alți voinici. :-P
    $ wget http://www.gnokii.org/download/gnocky/gnocky-0.0.7.tar.gz
    $ tar xzvf gnocky-0.0.7.tar.gz
    $ cd gnocky-0.0.7
    $ ./configure # ce zice el că nu ai instalat, instalezi cu yum
    $ sudo yum groupinstall "Development Tools"
    $ sudo yum install gtk2-devel glib2-devel libglade2-devel gnokii-devel gettext-devel
    $ make
    $ ./src/gnocky
    
  2. Creează un utilizator pe care să-l folosești doar pentru împachetare, ca să-ți păstezi setările personale în siguranță.
    $ sudo useradd makerpm
    
  3. Autentifică-te ca noul utilizator și creeză structura de directoare pentru împachetare.
    $ sudo su makerpm
    $ rpmdev-setuptree
    
  4. Intră în directorul de specificații și creează fișierul gnocky.spec (în cazul lui Gnocky). Emacs și vim îți vor insera automat un șablon.
    $ cd ~/rpmbuild/SPECS
    $ emacs gnocky.spec
    
  5. Primul câmp e cel mai simplu. Completează-l cu numele programului. :-)
    Name:           gnocky
    
  6. Vezi ce versiune au sursele pe care le-ai tras. De regulă este inclusă în numele arhivei (gnocky-0.0.7), dar o poți găsi și în directorul rădăcină, într-un fișier README.
    Version:        0.0.7
    
  7. În continuare, scrie versiunea pachetului (pornește de la 1).
    Release:        1%{?dist}
    
  8. „Fură” o scurtă descriere a programului de pe saitul oficial și eventual adapteaz-o.
    Summary:        GLib2/GTK+2 front-end for Gnokii using Glade
    
  9. Vezi unde s-ar încadra în meniul de aplicații din GNOME. Eu am găsit un RPM pentru Mandriva care zicea că s-ar încadra la comunicații. +1 :-D
    Group:          Applications/Communications
    

    Dacă programul tău e în ceață, fii tu primul care-l încadrează! În cartea de bucate scrie că poți afla toate grupurile standard cu:

    $ less /usr/share/doc/rpm-*/GROUPS
    
  10. Completează acum licența (o găsești de regulă în COPYING), legăturile la proiect și la arhiva cu sursele.
    License:        GPLv2
    URL:            http://wiki.gnokii.org/index.php/Gnocky
    Source0:        http://www.gnokii.org/download/gnocky/gnocky-0.0.7.tar.gz
    
  11. Nu-ți bate capul cu următorul câmp, este formatul standard pentru directorul unde programul va fi compilat automat.
    BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
    
  12. Revezi acum dependențele de când l-ai compilat manual și completează câmpul dedicat:
    BuildRequires:  gnokii-devel, libglade2-devel, gtk2-devel, glib2-devel, gettext-devel
    
  13. Taie -devel din coadă și completează câmpul dependențelor pentru rularea programului deja compilat - utilizatorii pachetului nu vor avea nevoie de antetele pentru dezvoltare:
    Requires:  gnokii, libglade2, gtk2, glib2, gettext
    
  14. „Fură” sau compune o descriere a programului pentru următoarea secțiune. Nu trebuie să fie lungă.
    %description
    Set logos, send SMS and manage address book for your mobile phone.
    
  15. Următoarele două secțiuni (%prep și %build) rămân neatinse:
    %prep
    %setup -q -n %{name}-%{version}
    
    %build
    %configure
    make %{?_smp_mflags}
    
  16. La secțiunea de instalare adaugă %find_lang dacă programul este internaționalizat.
    %install
    rm -rf %{buildroot}
    make install DESTDIR=%{buildroot}
    %find_lang %{name}
    
  17. Secțiunea de curățenie rămâne la fel:
    %clean
    rm -rf %{buildroot}
    
  18. La secțiunea de fișiere, arată-i că are fișiere de localizare.
    %files -f %{name}.lang
    

    Înșiră-i fișierele de documentație (cele cu litere mari).

    %doc README TODO COPYING ChangeLog INSTALL AUTHORS BUGS ABOUT-NLS
    

    Lasă neschimbate:

    %defattr(-,root,root,-)
    %{_bindir}/*
    

    și adaugă fișierele de date.

    %{_datadir}/applications/%{name}.desktop
    %{_datadir}/%{name}/
    
  19. Însemnează modificările făcute de tine la pachet.
    %changelog
    * Sat Nov 20 2010 Tibi Turbureanu  0.0.7-13
    - Package for Gnocky 0.0.7
    
  20. Împachetează programul (RPM cu binarele și RPM cu sursele):
     $ rpmbuild -ba gnocky.spec
    
  21. Testează cu rpmlint cele două pachete create. Rezolvă erorile și eventual avertismentele semnalate.
    $ rpmlint gnocky.spec ../RPMS/*/gnocky*.rpm ../SRPMS/gnocky*.rpm
    

În final, fișierul de specificație pentru Gnocky arată ca mai jos. Descarcă pachetul RPM Gnocky pentru a-l testa și tu! ;-)

Name:           gnocky
Version:        0.0.7
Release:        1%{?dist}
Summary:        GLib2/GTK+2 front-end for Gnokii using Glade

Group:          Applications/Communications
License:        GPLv2
URL:            http://wiki.gnokii.org/index.php/Gnocky
Source0:        http://www.gnokii.org/download/gnocky/gnocky-0.0.7.tar.gz
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

BuildRequires:  gnokii-devel, libglade2-devel, gtk2-devel, glib2-devel, gettext-devel
Requires:  gnokii, libglade2, gtk2, glib2, gettext

%description
Set logos, send SMS and manage address book for your mobile phone.

%prep
%setup -q -n %{name}-%{version}

%build
%configure
make %{?_smp_mflags}

%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%find_lang %{name}

%clean
rm -rf %{buildroot}


%files -f %{name}.lang
%defattr(-,root,root,-)
%doc README TODO COPYING ChangeLog INSTALL AUTHORS BUGS ABOUT-NLS
%{_bindir}/*
%{_datadir}/applications/%{name}.desktop
%{_datadir}/%{name}/

%changelog
* Sat Nov 20 2010 Tibi Turbureanu  0.0.7-13
- Package for Gnocky 0.0.

Notă: Articolul este preluat sub licențele libere GNU GFDL 1.3+ și CC-BY-SA 3.0  din jurnalul lui Tibi.

Comentarii

Există două câmpuri: BuildRequires și Requires. Văd că n-ai scris nimic despre Requires, iar BuildRequires este greșit. Nu trebuie tăiat sufixul -devel de la pachetele din BuildRequires pentru că astea sunt chiar pachetele pe care le-ai folosit atunci când ai construit gnocky. BuildRequires sunt dependendențele de care ai nevoie pentru a construi programul. Requires sunt dependențele de care ai nevoie pentru a rula programul. Deci într-adevăr la câmpul de Requires probabil n-ai avea nevoie de pachetele -devel, dar la cel de BuildRequires da.

Câmpul de release nu se folosește pentru release-ul distribuției gazdă. Este un contor care pornește de la 1 și e incrementat de fiecare dată când se lansează un nou pachet cu aceeași versiune a pachetului original. Package manager-ul îl va folosi ca să-și dea seama care este pachetul mai nou și să-l instaleze. Deci în cazul tău ar fi trebuit să fie 1, acum dacă vei schimba fișierul SPEC pentru a integra sugestia de mai sus va trebui făcut 14 pentru ca pachetul să poată fi instalat în locul celui cu release: 13.

Sursa cuprinzătoare cu informații despre cum se fac pachetel este: https://fedoraproject.org/wiki/Packaging:Guidelines . Majoritatea regulilor de acolo sunt aplicabile și în cadrul altor distribuții (e.g. *SUSE)

Mulțumesc pentru observații! Am rectificat. :-) Numărul versiunii a rămas 1 pentru că nu am trimis pachetul la fedoraproject.org.