Slackware Package Management - SlackBuild how-to

Από Κοινότητα Ελεύθερου Λογισμικού ΕΜΠ
Μετάβαση σε: πλοήγηση, αναζήτηση

Ένας από τους λόγους για τους οποίους πολλοί χρήστες επιλέγουν το Slackware είναι ο απλός τρόπος με τον οποίο διαχειρίζεται τα πακέτα. Το Slackware δεν έχει μηχανισμό ελέγχου των εξαρτήσεων (dependency checking) και τα πακέτα είναι απλά .tgz που περιέχουν σε δενδρική μορφή τα αρχεία που πρέπει να εγκατασταθούν. Το σύστημα διαχείρισης των πακέτων είναι αρκετά απλό σε σχέση, για παράδειγμα, με το apt-get/dpkg του Debian ωστόσο προσφέρει ιδιαίτερη ευελιξία στον χρήστη που επιθυμεί να δημιουργήσει δικά του πακέτα από πηγαίο κώδικα.

Δομή του πακέτου

Όπως είπαμε πρόκειται για απλά tgz (gzipped tar) πακέτα. Εκτός από τα προς εγκατάσταση αρχεία περιέχουν και την directory install με πρόσθετες πληροφορίες ελέγχου. Tο slack-desc είναι μια σύντομη περιγραφή του πακέτου και το bourne script doinst.sh είναι το script που εκτελείται κατά την εγκατάσταση του πακέτου, πχ. για να δημιουργηθούν κάποια απαραίτητα links (κατά τη δημιουργία ενός πακέτου το doinst.sh δημιουργείται συνήθως αυτόματα από το makepkg). Για παράδειγμα, η δομή ενός πακέτου που περιλαμβάνει το εκτελέσιμο foo και τη βιβλιοθήκη bar.so θα είναι:

usr/bin/foo
usr/lib/bar.so
install/slack-desc
install/doinst.sh

Για το όνομα του πακέτου χρησιμοποιείται η σύμβαση $NAME-$VERSION-$ARCH-$BUILD.tgz, για παράδειγμα vlc-0.8.5-i686-1vp.tgz. Το BUILD είναι η "τοπική" έκδοση. Είναι απλά ένας αριθμός για τα επίσημα πακέτα της διανομής, ενώ στα ανεπίσημα συνηθίζεται να ακολουθούν 2 ή 3 χαρακτήρες του δημιουργού για να τα ξεχωρίζουμε.

slack-desc

Το slack-desc είναι ακριβώς 11 γραμμές (χωρίς τα σχόλια). Κάθε γραμμή ξεκινάει με το όνομα του πακέτου ακολουθούμενο από : . Η πρώτη γραμμή έχει τη μορφή $ΝΑΜΕ: $NAME ($DESCRIPTION), όπου $ΝΑΜΕ το όνομα του πακέτου και $DESCRIPTION μια πολύ σύντομη περιγραφή. Η δεύτερη γραμμή είναι κενή (μετά το $ΝΑΜΕ:) και οι υπόλοιπες περιγράφουν το πακέτο. Ακολουθεί παράδειγμα:

python: python (object-oriented interpreted programming language)
python:
python: Python is an interpreted, interactive, object-oriented programming
python: language that combines remarkable power with very clear syntax.  
python: Python's basic power can be extended with your own modules written in
python: C or C++.  Python is also adaptable as an extension language for
python: existing applications. 
python:
python:
python:
python:

Εργαλεία

Η διανομή παρέχει command line utilities για την εγκατάσταση του λογισμικού. Η εντολή installpkg packet.tgz εγκαθιστά ένα πακέτο. Η εντολή removepkg packet αφαιρεί ένα εγκατεστημένο πακέτο, η upgradepkg αναβαθμίζει ένα πακέτο, η explodepkg αποσυμπιέζει ένα πακέτο στην τρέχουσα directory, η makepkg δημιουργεί ένα πακέτο με τα περιεχόμενα της τρέχουσας directory. Η εντολή pkgtool παρέχει ένα interface για τη διαχείριση του λογισμικού. Όλα τα παραπάνω εργαλεία είναι shell scripts και περισσότερες πληροφορίες για αυτά μπορούμε να βρούμε στις αντίστοιχες man pages.

Directories

Στο /var/log/packages βρίσκουμε αρχεία κειμένου με την περιγραφή (όπως αυτή δίνεται στο slack-desc) και όλα τα αρχεία ενός πακέτου. Η directory αυτή είναι πολύ χρήσιμη. Με

grep etc/rc.d/rc.sshd 

(χωρίς / πριν το etc) μπορούμε να βρούμε σε ποιο πακέτο ανήκει το /etc/rc.d/rc.sshd, με

ls /var/log/packages/*vp 

μπορούμε να βρούμε όλα τα πακέτα που έχει δημιουργήσει ο vp, με

ls -l /var/log/packages 

μπορούμε να δούμε ακριβείς ημερομηνίες για την εγκατάσταση του κάθε πακέτου κλπ. Στο /var/log/scripts βρίσκονται τα doinst.sh των πακέτων. Στις directories /var/log/removed_packages και /var/log/removed_scripts περιέχονται οι περιγραφές και τα scripts των πακέτων που έχουν αφαιρεθεί.

SlackBuilds

Πρόκειται για scripts που δημιουργούν ένα Slackware πακέτο από το πακέτο πηγαίου κώδικα. Συνίσταται να δημιουργούμε ένα SlackBuild για κάθε πακέτο που εγκαθιστούμε από πηγαίο κώδικα για να μην χρειαστεί να επαναλάβουμε τη διαδικασία με το χέρι για την αναβάθμιση του πακέτου ή για τη μεταγλώττισή του με άλλες παραμέτρους. Τα SlackBuilds τα τρέχουμε από το directory στο οποίο βρίσκονται τα πακέτα πηγαίου κώδικα.

Συνήθως χρειάζεται να αποσυμπιέσουμε το αρχείο πηγαίου κώδικα, να εκτελέσουμε το configure script για τη δημιουργία κατάλληλου Makefile για το σύστημά μας, να κάνουμε compile με make, να εγκαταστήσουμε σε μια προσωρινή directory με make install, να δημιουργήσουμε το slack-desc, να φροντίσουμε κάποιες λεπτομέρειες και να συμπιέσουμε το πακέτο. Ακολουθεί ένα SlackBuild με σχόλια για την κατανόηση της διαδικασίας.

#!/bin/sh

NAME=example
# όχι παύλες στην έκδοση
VERSION=0.0.1
# 2-4 λέξεις
DESCRIPTION="perigrafi paketou"
# τοπική έκδοση
BUILD=1vp

# η τρέχουσα directory, εδώ βρίσκεται το αρχείο πηγαίου κώδικα
CWD=`pwd`
# προσωρινή directory
TMP=${TMP:-/tmp}
# εκεί πηγαίνουν τα αρχεία που θα πακετάρουμε
PKG=$TMP/package-$NAME

# ο τελικός προορισμός του πακέτου, πχ /usr, /usr/local, /opt
PREFIX=/usr
# αν δεν ορίσουμε αρχιτεκτονική με μεταβλητή περιβάλλοντος επιλέγεται η i486
ARCH=${ARCH:-i486}

# επιλέγουμε CFLAGS ανάλογα με την αρχιτεκτονική
if [ "$ARCH" = "i386" ]; then
    SLKCFLAGS="-O2 -march=i386 -mtune=i686"
elif [ "$ARCH" = "i486" ]; then
    SLKCFLAGS="-O2 -march=i486 -mtune=i686"
elif [ "$ARCH" = "i686" ]; then
    SLKCFLAGS="-O2 -march=i686"
elif [ "$ARCH" = "s390" ]; then
    SLKCFLAGS="-O2"
elif [ "$ARCH" = "x86_64" ]; then
    SLKCFLAGS="-O2"
fi

cd $TMP
# αποσυμπίεση
if [ ! -d $NAME-$VERSION ]; then
    if [ -f $CWD/$NAME-$VERSION.tar.gz ]; then
        tar xzvf $CWD/$NAME-$VERSION.tar.gz
    elif [ -f $CWD/$NAME-$VERSION.tar.bz2 ]; then
        tar xjvf $CWD/$NAME-$VERSION.tar.bz2
    fi
fi

rm -rf $PKG
mkdir $PKG

cd $NAME-$VERSION
# το configure script δημιουργεί ένα Makefile κατάλληλο για το σύστημά μας
# περνάμε ώς μεταβλητές περιβάλλοντος τα CFLAGS
CFLAGS="$SLKCFLAGS" CXXFLAGS="$SLKCFLAGS" \
./configure \
    --prefix=$PREFIX \
    --sysconfdir=/etc \
    --localstatedir=/var \
    --with-someoption || exit 1

# τώρα γίνεται το compile
make || exit 1

# εγκατάσταση στην directory $PKG για να δημιουργήσουμε το πακέτο με makepkg
# πολλά Makefiles δεν υποστηρίζουν DESTDIR και η διαδικασία είναι διαφορετική
make install DESTDIR=$PKG || exit 1

# στο Slackware οι man pages είναι συμπιεσμένες
gzip -9 $PKG/usr/man/man?/*.?

# προσθέτουμε το documentation στο πακέτο
mkdir -p $PKG/usr/doc/$NAME-$VERSION
cp AUTHORS ChangeLog COPYING FAQ INSTALL NEWS README THANKS TODO \
    $PKG/usr/doc/$NAME-$VERSION

# μέχρι το 10.2 το /bin, /sbin, /usr/bin κλπ και τα περιεχόμενά τους ανήκουν
# στο group bin. Έχει αλλάξει στο -current, δεν χρειάζονται τα παρακάτω
#chown -R root:bin $PKG$PREFIX/bin
#chown -R root:bin $PKG$PREFIX/sbin

mkdir $PKG/install

cat >$PKG/install/slack-desc <<END
$NAME: $NAME ($DESCRIPTION)
$NAME:
$NAME: A description of our package. It could be a separate file, but I prefer
$NAME: including a "cat" command creating the slack-desc file in the
$NAME: SlackBuild script. The slack-desc has to be exactly 11 lines!
$NAME:
$NAME:
$NAME:
$NAME:
$NAME:
$NAME:
END

# κάνουμε strip τα binaries (αφαιρούμε τα debug symbols)
find $PKG | xargs file | grep "executable" | grep ELF | \
    cut -f 1 -d : | xargs strip --strip-unneeded 2 >/dev/null
find $PKG | xargs file | grep "shared object" | grep ELF | \
    cut -f 1 -d : | xargs strip --strip-unneeded 2 >/dev/null

cd $PKG

# -l y για να διαγραφούν τα symbolic links και να προστεθούν στο doinst.sh
# -c n γιατί έχουμε φροντίσει μόνοι μας για τα permissions
makepkg -l y -c n $TMP/$NAME-$VERSION-$ARCH-$BUILD.tgz

# προαιρετικά καθαρίζουμε το $TMP
if [ "$1" = "--cleanup" ]; then
    rm -rf $TMP/$NAME-$VERSION
    rm -rf $PKG
fi

# τώρα στο /tmp υπάρχει ένα έτοιμο πακέτο!

Το ύφος των SlackBuild προφανώς διαφέρει ανάλογα με τον χρήστη. Το παραπάνω παράδειγμα διαφέρει αρκετά από τα scripts του Patrick. Το παράδειγμα δουλεύει στο 90% των περιπτώσεων, σε όσα πακέτα δηλαδή χρησιμοποιούν configure script, make και υπακούουν στη μεταβλητή DESTDIR στο make install. Καλό είναι να επιβεβαιώνουμε το τελευταίο με grep DESTDIR Makefile για να μην καταλήξουμε με σκόρπια αρχεία στο /usr. Αν δεν ισχύει αυτό το script θα είναι αρκετά διαφορετικό (αυτό ξεφεύγει από τον σκοπό του παρόντος κειμένου). Για να δημιουργήσουμε ένα σωστό πακέτο ίσως χρειάζεται να προσέξουμε και άλλες λεπτομέρειες.

Άλλα εργαλεία

Υπάρχουν πρόσθετα εργαλεία που υπόσχονται ευκολότερη διαχείριση των πακέτων στο Slackware. Τα slapt-get, swaret, slackpkg αποτελούν εργαλεία ανάλογα με το apt-get στο Debian. Δεν είναι πάντα ασφαλής ο έλεγχος εξαρτήσεων που προσφέρουν αλλά είναι βολική η αυτοματοποιημένη εγκατάσταση των επίσημων patches με αυτά. Επίσης το εργαλείο checkpkg μπορεί να χρησιμοποιηθεί για να δοκιμάσουμε κατά πόσον ένα πακέτο ανταποκρίνεται στα standards ποιότητας του Slackware.

Χρήσιμα links