Δημιουργία πακέτων RPM από source code


Πολλές φορές μας έχει τύχει να θέλουμε ένα πρόγραμμα για την Red Hat based διανομή μας (Red Hat Enterprise, Fedora, Scientific Linux, CentOS κτλ) και να μην μπορούμε να το βρούμε επειδή κανείς δεν φρόντισε να δημιουργήσει ένα RPM πακέτο για αυτό και προφανώς επειδή δεν υπάρχει στα αποθετήρια.
images
Προσθήκη λεζάντας
                                                      
 Σε αυτό τον οδηγό θα δούμε πως θα φτιάξουμε τα δικά μας RPM πακέτα. Η δημιουργία RPM πακέτων δεν είναι φυσικά αναγκαίος τρόπος για την εγκατάσταση προγραμμάτων από τον πηγαίο κώδικά τους, καθώς υπάρχει και η δυνατότητα του χειροκίνητου compile.




 Παρ' όλα αυτά ο τρόπος αυτός είναι πολύ πιο δύσκολος για έναν χρήστη που δεν έχει ασχοληθεί και τόσο σε σχέση με ένα διπλό κλικ στο έτοιμο, προμεταγλωτισμένο RPM πακέτο. Η δημιουργία RPM πακέτων είναι μία από τις δραστηριότητες των κοινοτήτων του Fedora ώστε να γίνουν όσο το δυνατόν περισσότερες εφαρμογές εύκολα διαθέσιμες στους χρήστες της διανομής.

  Προαπαιτούμενα Πακέτα 

Υπάρχουν αρκετά πακέτα που χρειάζονται γι αυτή την διαδικασία, τα οποία εξαρτώνται και από την γλώσσα προγραμματισμού που έχει χρησιμοποιηθεί για την συγγραφή του κάθε προγράμματος. Για  να είμαστε σίγουροι ότι τα έχουμε όλα εγκαθιστάμε το group Development-tools δίνοντας ως root:
yum groupinstall development-tools
Ακόμα θα χρειαστούμε και τον fedora packager, τον οποίο θα αποκτήσουμε δίνοντας
yum install fedora-packager
  Δημιουργία RPMbuild

 Από εδώ και πέρα ΔΕΝ χρειάζεται να είστε root χρήστες. Δίνοντας exit επιστρέφετε ξανά στην κανονική λειτουργία απλού χρήστη. Αρχικά θα χρειαστεί να δημιουργήσουμε έναν κατάλογο, ο οποίος θα περιέχει όλους τους υποκαταλόγους  που χρειάζονται.  Αυτό μπορεί να γίνει με μία κίνηση δίνοντας:
rpmdev-setuptree
Η εντολή αυτή θα δημιουργήσει έναν φάκελο με την ονομασία rpmbuild στον κατάλογο στον οποίο βρίσκεστε εκείνη την στιγμή. Αν πλοηγηθούμε σε αυτόν θα δούμε πως έχουν δημιουργηθεί έξι φάκελοι μέσα σε αυτόν.  Αυτή την στιγμή χρειαζόμαστε τον φάκελο SOURCES.

Εκεί θα βάλουμε τον source code του προγράμματος που θέλουμε. Στο παράδειγμά μας θα χρησιμοποιήσουμε το Gnu Hello, το οποίο εμφανίζει hello world στην οθόνη, παίρνοντας όμως και κάποιες παραμέτρους. (Το ίδιο παράδειγμα χρησιμοποιείται και στο επίσημο tutorial του fedoraproject.org).  Το πρόγραμμα αυτό είναι γραμμένο σε C.

 Μπορούμε απλώς να κατεβάσουμε το συμπιεσμένο αρχείο από το site του και να το επικολλήσουμε στον φάκελο source ή να χρησιμοποιήσουμε το wget για να να το κατεβάσουμε.
cd ~/rpmbuild/SOURCES

         wget  http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz


 Δημιουργία Spec file 

 Το Spec file είναι το βασικό αρχείο για την δημιουργία RPM πακέτων.  Περιέχει όλες τις πληροφορίες για το πρόγραμμα και λειτουργεί σαν οδηγός για την δημιουργία του πακέτου.
 Το αρχείο αυτό πρέπει να βρίσκεται στον φάκελο SPECS, οπότε μεταβαίνουμε σε αυτόν
cd ~/rpmbuild/SPECS
Μπορούμε να δημιουργήσουμε με έναν απλό κειμενογράφο το spec file (το οποίο πρέπει να έχει κατάληξη .spec). Δίνοντας όμως
rpmdev-newspec hello
θα έχουμε το hello.spec μαζί με τον βασικό κορμό του. Ανοίγοντάς το τώρα με κάποιον κειμενογράφο προσθέτουμε τα στοιχεία που χρειάζονται.

 Αν το πακέτο που φτιάχνεται προορίζεται για διανομή σαν επίσημο πακέτο του fedora πρέπει να συμπληρώσετε  τα στοιχεία ακολουθώντας τους κανόνες που θα βρείτε εδώ. Eίναι σημαντικό να προσθέσετε τα tags post και preun όπως φαίνεται παρακάτω:

%post
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :

%preun
if [ $1 = 0 ] ; then
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
fi

Επίσης είναι σημαντικό το BuiltRequires να έχει την τιμή gettext και να υπάρχουν δύο requires, ένα post και ένα preun. H τελική μορφή του spec αρχείου μας πρέπει να είναι όπως φαίνεται παρακάτω:
Name:           hello
Version:        2.8
Release:        1%{?dist}
Summary:        The "Hello World" program from GNU

License:        GPLv3+
URL:            http://ftp.gnu.org/gnu/%{name}
Source0:        http://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.gz

BuildRequires: gettext

Requires(post): info
Requires(preun): info

%description 
The "Hello World" program, done with all bells and whistles of a proper FOSS 
project, including configuration, build, internationalization, help files, etc.

%prep
%setup -q

%build
%configure
make %{?_smp_mflags}

%install
%make_install
%find_lang %{name}
rm -f %{buildroot}/%{_infodir}/dir

%post
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :

%preun
if [ $1 = 0 ] ; then
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
fi

%files -f %{name}.lang
%doc AUTHORS ChangeLog COPYING NEWS README THANKS TODO
%{_mandir}/man1/hello.1.gz
%{_infodir}/%{name}.info.gz
%{_bindir}/hello

%changelog
* Tue Sep 06 2011 The Coon of Ty <Ty@coon.org> 2.8-1
- Initial version of the package


 

Δημιουργία RPM
images (1)
                                                   

Πλέον είμαστε έτοιμοι για να δημιουργήσουμε το rmp μας. Αυτό γίνεται πολύ απλά δίνοντας
rpmbuild -ba hello.spec
ενώ φυσικά είμαστε μέσα στον φάκελο που είναι το spec. Αφού ολοκληρωθεί η διαδικασία στον φάκελο SRPMS θα βρίσκεται ένα αρχείο με κατάληψη src.rpm. Όπως μπορείτε εύκολα να διαπιστώσετε το αρχείο αυτό δεν μπορεί ακόμα να εγκατασταθεί, καθώς είναι απλώς ένα συμπιεσμένο αρχείο που περιέχει τον κώδικα του προγράμματος και το spec αρχείο που δημιουργήσαμε. Για να εξάγουμε το spec αρχείο από το .scr.rpm αρκεί να δώσουμε
rpm -i όνομα
To πακέτο αυτό πάντως δεν είναι απαραίτητο. Στον φάκελο RPMS θα βρίσκεται το πακέτο που χρειαζόμαστε. Για να το εγκαταστήσουμε είτε πατάμε διπλό κλικ πάνω του είτε πηγαίνουμε στον φάκελό του και δίνουμε
rpm -i όνομα
  Αν θέλουμε να δημιουργηθεί μόνο το rpm πακέτο (και όχι και το src.rpm) βάζουμε σαν παράμετρο -bb αντί για -ba στο rpmbuild.

Σχόλια

Δημοφιλείς αναρτήσεις από αυτό το ιστολόγιο

Από ΓΛΩΣΣΑ ( Γ' Λυκείου ) σε BASH

[σκέψεις & συναισθήματα] Όταν δεις τον κόσμο διαφορετικά... (offtopic)

Phet – εικονικά πειράματα ανοικτού κώδικα