How to create RPMS

slackware | Παρ, 08/08/2008 - 11:45 | 7' | 0

Καλημέρα,

Είναι φορές που έχουμε κάνει εγκατάσταση κάποια πακέτα απο πηγαίο κώδικα κάθε φορά που πρέπει...οπότε όλοι σκεφτόμαστε "γιατί δεν τα φτιάχνουν ένα rpm να τελειώνουμε?".

Σήμερα θα δούμε πως μπορούμε να φτιάξουμε εμείς ενα δικό μας rpm file απο ενα tarball, σε red hat like OS.

Πριν ξεκινήσουμε θα χρειαστούμε το rpmbuild και ενα tarball. αν δεν εχουμε το rpmbuild το κατεβαζουμε και το κανουμε install απο το παρακατω link
http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/r/rp/rpmbuilder/rpmbuilder-0.5.1.tar.gz
Φυσικα θα χρησιμοποιησουμε το rpmbuilder-0.5.1.tar.gz για να φτιαξουμε ενα rpm πακετο.

Επίσης θα πρέπει να υπάρχουν οι παρακάτω φάκελοι με τα δικαιώματα που βλέπετε



drwxrwxr-x 4 root users 4096 Aug 6 08:20 /usr/src/redhat/BUILD
drwxrwxr-x 8 root users 4096 Aug 3 15:51 /usr/src/redhat/RPMS
drwxrwxr-x 2 root users 4096 Aug 4 21:48 /usr/src/redhat/SOURCES
drwxrwxr-x 2 root users 4096 Aug 29 2006 /usr/src/redhat/SPECS
drwxrwxr-x 2 root users 4096 Aug 6 08:20 /usr/src/redhat/SRPMS

Στο SOURCES μπαίνουν τα tar.gz ή tar ή tgz αρχεία

Στο SPECS τα *.spec αρχεία

Στο RPMS βάζει τα rpm που δημιουργεί και στο SRPMS τα src-rpm αρχεία.

Όλα τα rpms χρησιμοποιούν ένα spec file το οποίο και χρησιμοποιούν για να μπορέσουν να φτιάξουν το τελικό rpm με τα binaries.

Tα spec files περιέχουν πληροφορία τόσο για το που θα γίνει Install όταν ο user δώσει rpm -ivh <rpmfile>.rpm , όσο και ποιά είναι τα dependencied, με ποιά κάνει conflict κλπ.

Ας δούμε την δομή που έχει ένα spec file


Name: rpmbuilder
Summary: rpmbuilder
Version: 0.5
Release: 1
License: GPL
Group: free
Source: %{name}-%{version}.tar.gz

Μεχρι το Group δεν χρειάζονται κάποιες παραπάνω εξηγήσεις, οπότε πάμε στο Source.

To Source μας λέει ποιό θα είναι το tarball από το οποίο θα φτιάξει το rpm. Το %{} χρησιμοποιούνται για να παίρνει δυναμικά τα στοιχεία που χρειάζεται.

οπότε αν το tarball είναι το rpmbuilder-0.5.1.tar.gz τότε το spec θα αντιστοιχίσει το rpmbuilder στο name και το 0.5.1 στο version.

Το κομμάτι που ακολουθεί είναι αρκετά σημαντικό



BuildRoot: %{_tmppath}/build-root-%{name}
Packager: slackware
Distribution: Red Hat
Prefix: /

Το BuildRoot του λέει που να κάνει προσωρινά εγκατάσταση ώστε να πάρει τα binaries και ότι άλλο χρειάζεται για να φτιαχτεί το τελικό πακέτο.

To %{_tmppath} μπορεί να είναι είτε σε καποιους απο του temporary folders (var/tmp η /tmp). Σε αυτούς τους folders θα φτιάξει τον φάκελο build-root-%{name} για την εγκατάσταση.

Ο Packager προσδιορίζει πως θα ονομάζεται το rpm πακέτο.

O Distribution προσδιορίζει την έκδοση για την οποία θα μπορεί να γίνει εγκατάσταση και το

Prefix που θα γίνει εγκατάσταση... Εδώ θα μείνουμε λίγο παραπάνω.

By default μόνο ο root έχει το δικαίωμα να κάνει εγκατάσταση πακέτα είτε αυτά αφορούν όλο το σύστημα, είτε αφορούν ένα υποσύνολο πχ /sbin, /home/slackware .

Υπάρχουν περιπτώσεις όπου δεν θα μπορούμε να έχουμε root δικαιώματα, και θα πρέπει να εγκαταστήσουμε μια εφαρμογή σε ένα απλό user στο $ΗΟΜΕ του.

Αν βάλουμε Prefix: /home θα πάρουμε error mkdir permission denied, αν βάλουμε Prefix: /tmp error mkdir permission denied, και δεν μπορούμε να έχουμε root access αλλά ουτε να τρέξουμε sudo.

Σε αυτή την περίπτωση το Prefix θα πρέπει να δηλωθεί με / έτσι θα μπορέσουμε να το κάνουμε εγκατάσταση στο $HOME folder του user.



%description
test test

%prep
rm -rf $RPM_BUILD_ROOT
mkdir $RPM_BUILD_ROOT

%setup -q

%build
CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" \
./configure --prefix=%{prefix}
make -j 2

To %description μας δίνει μια περιγραφή του τι κάνει αυτο που θέλουμε να εγκαταστήσουμε

Το %prep προετοιμάζει το έδαφος για το build

Το %setup -q θα αναλάβει να κάνει extract το tarball, να βρει το directory και να μπει σε αυτό ώστε να ξεκινήσει το install.

To %build αναλαμβάνει να κάνει configure στο path που έχουμε δωσει στο prefix και στην συνέχεια κάνει make

Συνεχίζουμε με το installation και το clean up απο το source



%install
make DESTDIR=$RPM_BUILD_ROOT install-strip

cd $RPM_BUILD_ROOT

find . -type d -fprint $RPM_BUILD_DIR/file.list.%{name}.dirs
find . -type f -fprint $RPM_BUILD_DIR/file.list.%{name}.files.tmp
sed '/\/man\//s/$/.gz/g' $RPM_BUILD_DIR/file.list.%{name}.files.tmp > $RPM_BUIL
D_DIR/file.list.%{name}.files
find . -type l -fprint $RPM_BUILD_DIR/file.list.%{name}.libs
sed '1,2d;s,^\.,\%attr(-\,root\,root) \%dir ,' $RPM_BUILD_DIR/file.list.%{name}
.dirs > $RPM_BUILD_DIR/file.list.%{name}
sed 's,^\.,\%attr(-\,root\,root) ,' $RPM_BUILD_DIR/file.list.%{name}.files >> $
RPM_BUILD_DIR/file.list.%{name}
sed 's,^\.,\%attr(-\,root\,root) ,' $RPM_BUILD_DIR/file.list.%{name}.libs >> $R
PM_BUILD_DIR/file.list.%{name}

%clean
rm -rf $RPM_BUILD_ROOT
rm -rf $RPM_BUILD_DIR/file.list.%{name}
rm -rf $RPM_BUILD_DIR/file.list.%{name}.libs
rm -rf $RPM_BUILD_DIR/file.list.%{name}.files
rm -rf $RPM_BUILD_DIR/file.list.%{name}.files.tmp
rm -rf $RPM_BUILD_DIR/file.list.%{name}.dirs

%files -f ../file.list.%{name}

%defattr(-,root,users,0777)

To %install κάνει την εγκατάσταση, είναι στην ουσία το make install.

To %clean καθαρίζει τα αρχεία από το install, το οποίο εκτελείτε στο τέλος

To %files καθορίζει ποιά αρχεία θα γίνουν packt και τέλος το

%defattr(-,root,users,0777) καθοριζει ποιός User, ποιό Group τι δικαιώματα θα έχει στο rpm. Βάζοντας 0777 εξασφαλίζουμε ότι θα γίνει Install σαν απλός user στο directory μας.

Έχοντας φτιάξει το desc file δίνουμε απο την γραμμή εντολών [siva@redhatlike]$rpmbuild -ba slack.spec και θα ετοιμάσει το slackware.rpm

Δώσε αστέρια!

MO: (ψήφοι: 0)