Next Previous Contents

6. Χτίζοντας RPMs

Είναι αρκετά εύκολο να χτίσετε RPMs, ειδικότερα αν μπορείτε να καταφέρετε να χτίσετε από μόνο του το λογισμικό που σας ενδιαφέρει να πακετάρετε.

Η βασική διαδικασία για να χτίσετε ένα RPM είναι η ακόλουθη:

Υπό φυσιολογικές συνθήκες, το RPM δημιουργεί τόσο το πακέτο του εκτελέσιμου όσο και του πηγαίου κώδικα.

6.1 Το αρχείο rpmrc

Για την ώρα, η μόνη ρύθμιση του RPM διατίθεται μέσω του αρχείου /etc/rpmrc. Ακολουθεί ένα παράδειγμα:

require_vendor: 1
distribution: I roll my own!
require_distribution: 1
topdir: /usr/src/me
vendor: Mickiesoft
packager:  Mickeysoft Packaging Account <packages@mickiesoft.com>

optflags: i386 -O2 -m486 -fno-strength-reduce
optflags: alpha -O2
optflags: sparc -O2

signature: pgp
pgp_name: Mickeysoft Packaging Account
pgp_path: /home/packages/.pgp

tmppath: /usr/tmp

Η γραμμή require_vendor κάνει το RPM να ζητά να βρει μια γραμμή πωλητή (vendor). Αυτή μπορεί να προέλθει από το αρχείο /etc/rpmrc ή από την επικεφαλίδα του ίδιου του αρχείου προδιαγραφών (spec file). Για να το απενεργοποιήσετε, αλλάξτε τον αριθμό σε 0. Το ίδιο ισχύει για τις γραμμές require_distribution και require_group.

Η επόμενη γραμμή είναι σχετική με τη διανομή distribution. Μπορείτε να τη δηλώσετε εδώ ή αργότερα στην επικεφαλίδα του αρχείου προδιαγραφών (spec file). Όταν χτίζετε το πακέτο για κάποια συγκεκριμένη διανομή, είναι καλή ιδέα να βεβαιωθείτε ότι αυτή η γραμμή είναι σωστή, ακόμη κι αν δεν απαιτείται. Η γραμμή vendor δουλεύει αντίστοιχα, αλλά μπορεί να γράφει οτιδήποτε (π.χ. Joe's Software and Rock Music Emporium).

Το RPM έχει υποστήριξη για να χτίσετε πακέτα σε πολλαπλές αρχιτεκτονικές. Το αρχείο rpmrc μπορεί να κρατά μια μεταβλητή ``optflags'' για να χτίσετε πράγματα που απαιτούν συγκεκριμένα flags ανάλογα με την αρχιτεκτονική κατά το χτίσιμό τους. Δείτε τα παρακάτω τμήματα για το πώς να χρησιμοποιήσετε αυτή τη μεταβλητή.

Υπάρχουν και άλλα πολλά επιπλέον macros που μπορείτε να χρησιμοποιήσετε για να δείτε τα tags και τα διαθέσιμα flags.

rpm --showrc

6.2 Το αρχείο προδιαγραφών (Spec File)

Θα ξεκινήσουμε με συζήτηση για το αρχείο προδιαγραφών. Τα αρχεία προδιαγραφών απαιτούνται για να χτίσετε ένα πακέτο. Το αρχείο προδιαγραφών είναι μια περιγραφή του λογισμικού μαζί με εντολές και οδηγίες για το πώς θα στηθούν και μία λίστα για όλα τα εκτελέσιμα που εγκαταστάθηκαν.

Καλό είναι να ονομάσετε το αρχείο προδιαγραφών σύμφωνα με τυπικές συμβάσεις. Θα πρέπει να είναι το πακέτο όνομα-παύλα-αριθμός έκδοσης (version number)-παύλα- αριθμός σειράς (release number)-τελεία-spec.

Ακολουθεί ένα μικρό παράδειγμα αρχείου προδιαγραφών (vim-3.0-1.spec):

Summary: ejects ejectable media and controls auto ejection
Name: eject
Version: 1.4
Release: 3
Copyright: GPL
Group: Utilities/System
Source: sunsite.unc.edu:/pub/Linux/utils/disk-management/eject-1.4.tar.gz
Patch: eject-1.4-make.patch
Patch1: eject-1.4-jaz.patch
%description
Αυτό το πρόγραμμα επιτρέπει στο χρήστη να βγάζει (eject) τα μέσα που υποστηρίζουν αυτόματη εξαγωγή όπως CD-ROMs,Jaz και Zip drives, και οδηγούς δισκέτας σε μηχανές SPARC.

%prep
%setup
%patch -p1
%patch1 -p1

%build
make RPM_OPT_FLAGS="$RPM_OPT_FLAGS"

%install
install -s -m 755 -o 0 -g 0 eject /usr/bin/eject
install -m 644 -o 0 -g 0 eject.1 /usr/man/man1

%files
%doc README COPYING ChangeLog

/usr/bin/eject
/usr/man/man1/eject.1

6.3 Η επικεφαλίδα

Η επικεφαλίδα έχει μερικά σταθερά πεδία που πρέπει να συμπληρωθούν. Δίνονται επίσης και μερικές υποδείξεις. Τα πεδία πρέπει να συμπληρωθούν όπως φαίνεται παρακάτω:

6.4 Prep

Αυτό είναι το δεύτερο τμήμα στο αρχείο προδιαγραφών. Χρησιμοποιείται για να ετοιμάσετε τον κώδικα για χτίσιμο. Εδώ πρέπει να κάνετε οτιδήποτε χρειαστεί για να κάνετε patch τους κώδικες και να τους εγκαταστήσετε όπως πρέπει για να γράψετε make.

Σημειώστε το εξής: Κάθε ένα από αυτά τα τμήματα είναι πραγματικά χώρος για να εκτελέσετε σκριπτάκια φλοιού (shell scripts). Μπορείτε απλά να φτιάξετε ένα sh script και να το βάλετε μετά το %prep tag για να ξεπακετάρετε και να κάνετε patch τον κώδικά σας. Παρόλαυτά, έχουμε φτιάξει macros για να βοηθήσουμε σ'αυτό.

Το πρώτο απ'αυτά τα macros είναι το %setup macro. Στην απλούστερή του μορφή (χωρίς επιλογές από τη γραμμή εντολών), απλά ξεπακετάρει τον κώδικα και μπαίνει στον κατάλογο με τον κώδικα. Παίρνει επίσης τις παρακάτω επιλογές:

Το επόμενο από τα διαθέσιμα macros είναι το %patch macro. Αυτό το macro βοηθά στην αυτοματοποίηση της διαδικασίας της εφαρμογής μπαλωμάτων (patches) στους κώδικες. Παίρνει πολλές επιλογές, οι οποίες φαίνονται παρακάτω:

Αυτά πρέπει να είναι όλα τα macros που χρειάζεστε. Αφού τα έχετε αυτά σωστά, μπορείτε να κάνετε οποιαδήποτε εγκατάσταση θέλετε με sh σκριπτάκια. Οτιδήποτε συμπεριλάβετε μέχρι το %build macro (το οποίο θα συζητηθεί στο επόμενο τμήμα), εκτελείται μέσω sh. Κοιτάξτε το παραπάνω παράδειγμα για τους τύπους των πραγμάτων που μπορεί να θέλετε να κάνετε.

6.5 Χτίσιμο (Build)

Δεν υπάρχουν αλήθεια macros σε αυτό το τμήμα. Θα πρέπει απλά να βάλετε τις εντολές που θα χρειαστεί να χρησιμοποιήσετε για να χτίσετε το λογισμικό αφού έχετε ξεπακετάρει τον κώδικα, τον έχετε κάνει patch και έχετε μπει στον κατάλογο. Αυτό είναι απλά ένα ακόμη σύνολο εντολών που περνιούνται στο sh, έτσι ώστε όλες οι νόμιμες εντολές sh μπορούν να μπουν εδώ (συμπεριλαμβανομένων των σχολίων).

Ο τρέχων κατάλογος που δουλεύετε γίνεται reset σε κάθε ένα από αυτά τα τμήματα στο πιο ψηλό επίπεδο του καταλόγου που περιέχει τον κώδικα , να το έχετε υπόψη σας. Μπορείτε να μπείτε στους υποκαταλόγους με cd αν χρειαστεί.

6.6 Εγκατάσταση

Ούτε και εδώ υπάρχουν, πραγματικά, macros. Θέλετε βασικά να βάλετε ότι εντολές χρειάζονται για την εγκατάσταση. Αν έχετε στη διάθεσή σας το make install στο πακέτο που χτίζετε, βάλτε το εκεί. Αν όχι, μπορείτε είτε να κάνετε patch το makefile ώστε να γράψετε make install και στη συνέχεια να ζητήσετε να γίνει εδώ το make install , ή μπορείτε να τα εγκαταστήσετε εδώ με το χέρι χρησιμοποιώντας sh εντολές. Μπορείτε να θεωρήσετε τον τρέχων κατάλογο σαν το πιο ψηλό επίπεδο του καταλόγου με τον κώδικα.

6.7 Προαιρετικά σκριπτάκια πριν και μετά την Εγκατάσταση/Απεγκατάσταση

Μπορείτε να προσθέσετε σκριπτάκια που να τρέχουν πριν και μετά την εγκατάσταση/ απεγκατάσταση των εκτελέσιμων πακέτων. Ο κύριος λόγος γι'αυτό είναι να κάνετε πράγματα όπως να τρέξετε το ldconfig αφού εγκαταστήσετε ή αφαιρέσετε πακέτα που περιέχουν διαμοιραζόμενες βιβλιοθήκες. Τα macros για κάθε ένα από τα σκριπτάκια είναι τα παρακάτω:

Τα περιεχόμενα αυτών των τμημάτων μπορεί να είναι οποιουδήποτε τύπου sh script, αν και δε χρειάζεστε το #!/bin/sh.

6.8 Αρχεία

Αυτό είναι το τμήμα όπου πρέπει να δώσετε τη λίστα των αρχείων για το εκτελέσιμο πακέτο. Το RPM δεν έχει τρόπο να γνωρίζει τι εκτελέσιμα εγκαταστάθηκαν σαν αποτέλεσμα του make install. ΔΕΝ ΥΠΑΡΧΕΙ τρόπος να το κάνετε αυτό. Μερικοί προτείνουν να εκτελέσετε τη find πριν και μετά την εγκατάσταση του πακέτου. Σε ένα πολυχρηστικό σύστημα, αυτό είναι απαράδεκτο καθώς είναι δυνατό να δημιουργηθούν άλλα αρχεία κατά τη διαδικασία χτισίματος ενός πακέτου, τα οποία δεν έχουν απολύτως καμία σχέση με το ίδιο το πακέτο.

Υπάρχουν μερικά διαθέσιμα macros που κάνουν τέτοιες ειδικές λειτουργίες. Αυτά είναι τα παρακάτω :

Η μεγαλύτερη παγίδα στη λίστα αρχείων είναι η εμφάνιση καταλόγων. Αν εμφανίσετε το /usr/bin κατά λάθος, το εκτελέσιμο πακέτο σας θα περιέχει κάθε αρχείο στο /usr/bin στο σύστημά σας.

6.9 Χτίζοντας το

Ο δενδροειδής κατάλογος του πηγαίου κώδικα

Το πρώτο που χρειάζεστε είναι ένα καλά ρυθμισμένο δένδρο για χτίσιμο (build tree). Αυτό ρυθμίζεται χρησιμοποιώντας το αρχείο /etc/rpmrc. Οι περισσότεροι θα χρησιμοποιήσουν απλά το /usr/src.

Μπορεί να χρειαστεί να δημιουργήσετε τους παρακάτω καταλόγους για να φτιάξετε ένα δένδρο για χτίσιμο (build tree):

Έλεγχος στο χτίσιμο

Το πρώτο πράγμα που πιθανά να θέλετε να κάνετε είναι να πάρετε τον κώδικα και να χτίσετε το πακέτο χωρίς να χρησιμοποιήσετε καθόλου το RPM. Για να το κάνετε αυτό, ξεπακετάρετε τον πηγαίο κώδικα, και αλλάξτε το όνομα του καταλόγου σε $NAME.orig. Ξεπακετάρετε τον κώδικα ξανά. Χρησιμοποιήστε τον κώδικα για να χτίσετε το πακέτο. Πηγαίνετε στον κατάλογο με τον κώδικα και ακολουθήστε τις οδηγίες για το χτίσιμο. Αν πρέπει να αλλάξετε πράγματα, θα χρειαστείτε ένα μπάλωμα (patch). Μόλις το χτίσετε, καθαρίστε τον κατάλογο με τον πηγαίο κώδικα. Σιγουρευτείτε ότι διαγράψατε όλα τα αρχεία που δημιουργήθηκαν από το script configure. Στη συνέχεια, βγείτε από τον κατάλογο με τον πηγαίο κώδικα στον πιο πάνω γράφοντας cd . Κάντε κάτι σαν το παρακάτω:

        diff -uNr dirname.orig dirname > ../SOURCES/dirname-linux.patch
Αυτό θα σας δημιουργήσει ένα patch το οποίο μπορείτε να χρησιμοποιήσετε στο αρχείο προδιαγραφών σας (spec file). Σημειώστε ότι το ``linux'' που βλέπετε στο όνομα του patch είναι απλά αναγνωριστικό. Μπορείτε να χρησιμοποιήσετε κάτι πιο επεξηγηματικό όπως ``config'' ή ``bugs'' ώστε να εξηγήσετε γιατί χρειάστηκε να φτιάξετε αυτό το patch. Είναι επίσης καλή ιδέα να κοιτάξετε το patch αρχείο που φτιάχνετε πριν να το χρησιμοποιήσετε ώστε να σιγουρευτείτε ότι δεν συμπεριλαμβάνονται κατά λάθος τυχόν εκτελέσιμα.

Δημιουργώντας τη λίστα αρχείων

Τώρα που έχετε τον κώδικα για το χτίσιμο του πακέτου και ξέρετε πώς θα το κάνετε, χτίστε το και εγκαταστήστε το. Κοιτάξτε την έξοδο της διαδικασίας εγκατάστασης και χτίστε τη λίστα αρχείων σας από αυτή που θα χρησιμοποιήσετε στο αρχείο προδιαγραφών. Συνήθως, χτίζουμε το αρχείο προδιαγραφών παράλληλα με όλα αυτά τα βήματα. Μπορείτε να δημιουργήσετε το αρχικό και να συμπληρώσετε τα εύκολα τμήματα, και στη συνέχεια να συμπληρώνετε και τα υπόλοιπα βήματα καθώς προχωράτε.

Χτίζοντας το Πακέτο με RPM

Από τη στιγμή που έχετε ένα αρχείο προδιαγραφών (spec file), είστε έτοιμοι να δοκιμάσετε να χτίσετε το πακέτο σας. Ο πιο χρήσιμος τρόπος να το κάνετε είναι με μια εντολή σαν την ακόλουθη :

        rpm -ba foobar-1.0.spec

Υπάρχουν επίσης και άλλες χρήσιμες επιλογές με το switch -b :

Υπάρχουν αρκετές παραλλαγές στο -b switch. Αυτές είναι οι ακόλουθες :

6.10 Ελέγξτε το

Αφού φτιάξατε ένα εκτελέσιμο και ένα με τον πηγαίο κώδικα rpm για το πακέτο σας, χρειάζεται να το ελέγξετε. Ο ευκολότερος και καλύτερος τρόπος είναι να χρησιμοποιήσετε ένα τελείως διαφορετικό μηχάνημα για να το δοκιμάσετε. Στο κάτω-κάτω, έχετε κάνει τόσα make install στο μηχάνημά σας, που θα πρέπει να εγκατασταθεί καλά.

Μπορείτε να ελέγξετε το πακέτο γράφοντας rpm -u packagename, αλλά αυτό μπορεί να σας εξαπατήσει επειδή στο χτίσιμο του πακέτου, κάνατε make install. Αν αφήσετε κάτι έξω από τη λίστα αρχείων σας, δε θα απεγκατασταθούν. Θα εγκαταστήσετε ξανά το εκτελέσιμο πακέτο (binary package) και το σύστημά σας θα λειτουργεί και πάλι, αλλά το rpm δεν είναι εντάξει. Σιγουρευτείτε και έχετε υπόψη σας ότι μπορεί εσείς να γράφετε rpm -ba package, πολλοί όμως εγκαθιστούν το πακέτο σας κάνοντας rpm -i package. Σιγουρευτείτε ότι δεν κάνετε τίποτα στα τμήματα build ή install που θα χρειαστεί να γίνει όταν τα εκτελέσιμα πακέτα εγκαθίστανται μόνα τους.

6.11 Τι να κάνετε με τα νέα σας RPMs

Μόλις φτιάξετε το δικό σας νέο RPM για κάτι (υποθέτουμε ότι είναι κάτι που δεν υπάρχει σε RPM), μπορείτε να προσφέρετε τη δουλειά σας και σε άλλους (επίσης υποθέτουμε ότι φτιάξατε RPM ενός προγράμματος που διανείμεται ελεύθερα). Για να το κάνετε αυτό, θα θελήσετε να το ανεβάσετε στο ftp.redhat.com.

6.12 Και τώρα;

Διαβάστε παρακαλώ τα παραπάνω τμήματα σχετικά με τον Έλεγχο και του τι να κάνετε με τα νέα RPMs. Θέλουμε όσα RPMs είναι δυνατό να έχουμε, και θέλουμε μάλιστα να είναι και καλά RPMs. Παρακαλώ δώστε αρκετό χρόνο στο τεστάρισμα των πακέτων RPMs και κάντε τον κόπο να τα βάλετε στο internet για το καλό όλων μας. Επίσης, παρακαλώ σιγουρευτείτε ότι κάνετε upload ελεύθερα διαθέσιμο λογισμικό. Εμπορικό και shareware λογισμικό δε θα πρέπει να γίνεται upload εκτός κι αν έχουν αναφέρεται ρητά ότι επιτρέπεται στην άδεια πνευματικής ιδιοκτησίας. Αυτό περιλαμβάνει το λογισμικό Netscape, ssh, pgp, κλπ.


Next Previous Contents