Next Previous Contents

7. Χτίζοντας RPM για πολλές αρχιτεκτονικές

Το RPM μπορεί να χρησιμοποιηθεί για να χτίσετε πακέτα για Intel i386, Digital Alpha που τρέχουν Linux και σε Sparc. Έχει αναφερθεί ότι δουλεύει επίσης και σε σταθμούς εργασίας SGI και HP. Υπάρχουν διάφορα χαρακτηριστικά που κάνουν το χτίσιμο των πακέτων εύκολο σε όλες τις πλατφόρμες. Το πρώτο είναι η ντιρεκτίβα ``optflags'' στο /etc/rpmrc. Μπορεί να χρησιμοποιηθεί για να θέσετε flags που χρησιμοποιούνται όταν χτίζετε λογισμικό, σε τιμές που εξαρτώνται από την αρχιτεκτονική του συστήματος. Άλλο ένα χαρακτηριστικό είναι τα ``arch'' macros στο αρχείο προδιαγραφών (spec file). Μπορούν να χρησιμοποιηθούν για να κάνετε διάφορα πράγματα ανάλογα με την αρχιτεκτονική του συστήματος στην οποία το χτίζετε. Άλλο ένα χαρακτηριστικό είναι η ντιρεκτίβα ``Exclude'' στην επικεφαλίδα (header).

7.1 Ένα απλό αρχείο προδιαγραφών (spec File)

Το παρακάτω είναι τμήμα του αρχείου προδιαγραφών (spec file) για το πακέτο ``fileutils''. Είναι ρυθμισμένο για να χτίζεται και σε Alpha και σε Intel.

Summary: GNU File Utilities
Name: fileutils
Version: 3.16
Release: 1
Copyright: GPL
Group: Utilities/File
Source0: prep.ai.mit.edu:/pub/gnu/fileutils-3.16.tar.gz
Source1: DIR_COLORS
Patch: fileutils-3.16-mktime.patch

%description
These are the GNU file management utilities.  It includes programs
to copy, move, list, etc, files.

The ls program in this package now incorporates color ls!

%prep
%setup

%ifarch alpha
%patch -p1
autoconf
%endif
%build
configure --prefix=/usr --exec-prefix=/
make CFLAGS="$RPM_OPT_FLAGS" LDFLAGS=-s

%install
rm -f /usr/info/fileutils*
make install
gzip -9nf /usr/info/fileutils*

.
.
.

7.2 Optflags

Σε αυτό το παράδειγμα, μπορείτε να δείτε πώς χρησιμοποιείται η ντιρεκτίβα ``optflags'' από το /etc/rpmrc. Ανάλογα με το πάνω σε ποια αρχιτεκτονική θα χτίσετε, δίνετε την κατάλληλη τιμή στο RPM_OPT_FLAGS. Πρέπει να κάνετε patch το Makefile έτσι ώστε το πακέτο σας να χρησιμοποιεί αυτή τη μεταβλητή αντί των κανονικών ντιρεκτίβων που θα μπορούσατε να χρησιμοποιήσετε (όπως -m486 και -O2). Μπορείτε να πάρετε μια καλή ιδέα για το τι χρειάζεται να κάνετε εγκαθιστώντας το πηγαίο κώδικα του πακέτου και αποσυμπιέστε τον κώδικα και εξετάστε το Makefile. Κοιτάξτε τότε το patch για το Makefile και δείτε τι αλλαγές πρέπει να κάνετε.

7.3 Macros

Το %ifarch macro είναι πολύ σημαντικό σε όλα αυτά. Τις περισσότερες φορές θα χρειαστεί να εφαρμόσετε ένα-δύο patch ειδικά για μια συγκεκριμένη αρχιτεκτονική. Σε αυτή την περίπτωση, το RPM θα σας επιτρέψει να εφαρμόσετε αυτό το patch σε μία αρχιτεκτονική μόνο.

Στο παραπάνω παράδειγμα, το fileutils έχει ένα patch για μηχανές 64 bit. Προφανώς, αυτό θα πρέπει να εφαρμοστεί μόνο σε Alpha για την ώρα. Έτσι, προσθέτουμε ένα %ifarch macro γύρω από το 64 bit patch όπως παρακάτω:

%ifarch axp
%patch1 -p1
%endif
Αυτό εξασφαλίζει ότι το patch δε θα εφαρμοστεί σε οποιαδήποτε αρχιτεκτονική εκτός από alpha.

7.4 Αφαιρώντας αρχιτεκτονικές από Πακέτα

Για να μπορείτε να συντηρείτε πακέτα RPMs πηγαίου κώδικα σε έναν κατάλογο για όλες τις πλατφόρμες, έχουμε υλοποιήσει την ικανότητα να "αφαιρείτε" πακέτα ώστε να μη χτιστούν σε συγκεκριμένες αρχιτεκτονικές. Αυτό γίνεται ώστε να μπορείτε να κάνετε ακόμη πράγματα όπως

rpm --rebuild /usr/src/SRPMS/*.rpm
και να χτίσετε τα σωστά πακέτα. Αν δεν έχετε μεταφέρει μια εφαρμογή σε μια συγκεκριμένη πλατφόρμα, το μόνο που πρέπει να κάνετε είναι να προσθέσετε μια γραμμή σαν αυτή :
ExcludeArch: axp
στην επικεφαλίδα του αρχείου προδιαγραφών του πακέτου με τον κώδικα. Στη συνέχεια, ξαναχτίστε το πακέτο στην πλατφόρμα για την οποία προορίζεται. Θα έχετε τότε ένα πακέτο πηγαίου κώδικα που παίζει σε Intel και μπορεί εύκολα να μεταφερθεί σε Alpha.

7.5 Τελειώνοντας

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


Next Previous Contents