Δομή των πακέτων στο Arch Linux

Το packaging είναι μια από τις πιο ενδιαφέρουσες μορφές συνεισφοράς σε μια κοινότητα Linux.
Στον σημερινό οδηγό του Arch Linux, θα κάνουμε μια εισαγωγή στη δομή των πακέτων του Arch Linux αλλά και στο πως φτιάχνονται.

Ανατομία πακέτου στο Arch Linux

Τα αρχεία που κατεβάζουμε από τα επίσημα αποθετήρια του Arch Linux είναι της μορφής package.pkg.tar.zst. Είναι ένα συμπιεσμένο πακέτο σε μορφή zstd και περιέχει:

  1. Τα binary αρχεία
  2. .PKGINFO: Περιέχει όλα τα δεδομένα που χρειάζονται από τον διαχειριστή πακέτων(pacman) για την αντιμετώπιση πακέτων, εξαρτήσεων κ.α.
  3. .BUILDINFO: Περιέχει πληροφορίες για reproducible builds.
  4. .MTREE: Περιέχει hashes και timestamps των αρχείων, τα οποία περιλαμβάνονται στην τοπική βάση δεδομένων ώστε ο pacman να μπορεί να επαληθεύσει την ακεραιότητα του πακέτου
  5. .INSTALL: Ένα προαιρετικό αρχείο το οποίο εκτελεί εντολές μετά την εγκατάσταση/αναβάθμιση/διαγραφή του πακέτου.
  6. .Changelog: Ένα προαιρετικό αρχείο που ο συντηρητής του πακέτου συμπληρώνει τις αλλαγές στο πακέτου. (Δεν υπάρχει σε όλα τα πακέτα).
    Εφόσον μάθαμε τι περιέχει ένα αρχείο που κατεβάζουμε από τα επίσημα αποθετήρια, ήρθε η ώρα να δούμε πως δημιουργείτε το πακέτο. Για να δημιουργηθεί ένα πακέτο χρειάζεται:
  7. PKGBUILD: Ένα αρχείο που περιέχει μέσα όλες τις πληροφορίες του πακέτου καθώς και τον τρόπο που θα δημιουργηθεί.
  8. makepkg: Είναι το εργαλείο που χρησιμοποιεί το PKGBUILD ώστε να δημιουργηθεί το package.pkg.tar.zst.

PKGBUILD

Το PKGBUILD όπως είπαμε είναι ένα αρχείο που περιγράφει το πως θα δημιουργηθεί το πακέτο και έχει συγκεκριμένες μεταβλητές, συναρτήσεις και οδηγίες για την σωστή σύνταξη του. Τα υποχρεωτικά πεδία για ένα λειτουργικό PKGBUILD είναι τα:
• pkgname
• pkgver
• pkgrel
• arch
• licence
• source
• package ()
Ας τα αναλύσουμε ένα ένα:

  1. pkgname: Περιέχει το όνομα του πακέτου. Το όνομα μπορεί να περιέχει αλφαριθμητικά και οποιοδήποτε από τους ακόλουθους χαρακτήρες: ‘@ . _ + -‘. Με την μόνη απαγόρευση ότι τα ονόματα δεν μπορούν να ξεκινάνε με παύλες ή με τελείες.

  2. pkgver: Περιέχει την έκδοση του προγράμματος. Η μεταβλητή δεν επιτρέπεται να έχει άνω ή κάτω τελεία, παύλες ή κενό διάστημα.

  3. pkgrel: Είναι ο αριθμός έκδοσης ειδικά για την διανομή. Επιτρέπει τους συντηρητές των πακέτων να κάνουν κάποιες ενημερώσεις στην ίδια έκδοση του προγράμματος. Συνήθως η τιμή του είναι 1.

  4. arch: Ορίζει τους τύπους αρχιτεκτονικής που υποστηρίζει το πρόγραμμα ( γ.π arch=’i686′ ‘x86_64′). Αν το πρόγραμμα δεν περιέχει περιορισμό στην αρχιτεκτονική τότε η τιμή του είναι 5. any (arch=’any’). Αποδεκτοί χαρακτήρες είναι οι αλφαριθμητικοί και η κάτω παύλα (_).
    license: Σε αυτήν την μεταβλητή ορίζουμε την άδεια χρήσης του προγράμματος.

  5. source: Είναι η μεταβλητή που περιέχει το link για την λήψη του κώδικα του λογισμικού.

  6. package() : Η συγκεκριμένη συνάρτηση χρησιμοποήται πάντα τελευταία καθώς το περιεχόμενο της ασχολείται με την μετακίνηση των αρχείων στις κατάλληλες θέσεις στο σύστημα που θα γίνει η εγκατάσταση.

Ένα πιο σύνθετο αρχείο PKGBUILD περιέχει περισσότερες συναρτήσεις και μεταβλητές. Μπορείτε να δείτε περισσότερες πληροφορίες για το PKGBUILD εδώ.

makepkg

Το makepkg είναι ένα script που αυτοματοποιεί την δημιουργία των πακέτων. Το πλεονέκτημα μιας αυτοματοποιημένης δημιουργίας είναι ότι αν φτιαχτεί το script τότε το makepkg αναλαμβάνει τα υπόλοιπα. Δηλ. κατεβάζει και ελέγχει τους κώδικες, ελέγχει τις εξαρτήσεις του, δημιουργεί το πακέτο, εγκαθιστά το αρχείο σε ένα fakeroot περιβάλλον και στο σύνολο δημιουργεί το πακέτο για να το χρησιμοποιήσει ο pacman.
Το makepkg ορίζει δύο μεταβλητές οι οποίες βοηθάνε στην δημιουργία και την εγκατάσταση:

  1. srcdir: Είναι ένας κατάλογος που περιέχει τα αποσυμπιεσμένα αρχεία του λογισμικου/κώδικά.

  2. pkgdir: Ο συγκεκριμένος κατάλογος περιέχει το τα πακέτα του εγκατεστημένου πακέτου καθώς και την θέση που θα πάρουν κατά την εγκατάσταση.

Ας γράψουμε το πρώτο μας PKGBUILD

Έστω ότι έχουμε το παρόν script https://github.com/JohnGavr/ytd101/releases.
Είναι ένα script που έχω γράψει και που κατεβάζει mp3 ή mp4 αρχεία από το youtube με την βοήθεια του youtube-dl και τα αποθηκεύει στο φάκελο Music.
Εμείς μέσα από αυτό το πακέτο θέλουμε όταν γίνεται εγκατάσταση να μεταφέρει το script στο /usr/bin ώστε να μπορεί ο χρήστης να το εκτελέσει απευθείας από το τερματικό του χωρίς να χρειαστεί να δημιουργήσει κάποιο alias.

Σύμφωνα με τα παραπάνω, το PKGBUILD διαμορφώνεται κάπως έτσι:

    pkgver=1.0
    pkgrel=1
    pkgdesc="A youtube download script in Shell Scripting"
    arch=( 'any' )
    url="https://github.com/JohnGavr/ytd101"
    license=('MIT')
    depends=('youtube-dl' 'ffmpeg')
    source=("${pkgname}-${pkgver}.tar.gz::https://github.com/JohnGavr/ytd101/archive/v${pkgver}.tar.gz")
    package() {
    cd "$pkgname-$pkgver"
    install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
    install -Dm755 ytd "$pkgdir/usr/bin/ytd"
    }

Το καινούριο που βλέπουμε στο PKGBUILD είναι η εντολή install. Το εργαλείο install αντιγράφει αρχεία από το srcdir στο pkgdir. Ας δούμε τις παραμέτρους αναλυτικά

• -D : Δημιουργεί όλες τις τοποθεσίες εκτός τις τελευταίες και αντιγράφει το αρχείο από το srcdir στην αντίστοιχη τοποθεσία στο pkgdir.

-m : Θέτει τα δικαιώματα στα αρχεία. Ενδεικτικά:
644: Έχει δικαίωμα read και write ο κάτοχος του αρχείο και οι υπόλοιποι χρήστες απλά μπορούν να το διαβάσουν.
755: Είναι το ίδιο με το προηγούμενο με την μόνη διαφορά ότι είναι εκτελέσιμο από όλους τους χρήστες

Πηγή:

8 Likes