Δημιουργία πακέτων deb από πηγαίο κώδικα

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

Τα πακέτα .deb είναι πακέτα εφαρμογών που χρησιμοποιούνται από τον διαχειριστή πακέτων του Debian και είναι στην ουσία archives τα οποία περιέχουν τα εκτελέσιμα αρχεία, τις βιβλιοθήκες και την τεκμηρίωση για ένα προγραμμα η μία σουίτα σχετικών προγραμμάτων. Το .deb πακέτο περιέχει δυο συμπιεσμένα tar archives, το ένα περιέχει τις πληροφορίες ελέγχου, και το άλλο τα ίδια τα δεδομένα. Η διαχείριση των πακέτων deb γίνεται μέσω του προγράμματος dpkg, και σε ανώτερο επίπεδο, μέσω του διαχειριστή πακέτων των debian-based διανομών.


Προαπαιτούμενα

Για να δημιουργήσουμε ένα deb πακέτο θα χρειαστούμε τον πηγαίο κώδικα , συνήθως σε μορφή tar.gz και ορισμένα εργαλεία που μας παρέχει το debian , συγκεκριμένα τα πακέτα build-essential, dh-make, debhelper, devscripts, fakeroot.

# aptitude install build-essential dh-make debhelper devscripts fakeroot

Στο συγκεκριμένο παράδειγμα θα δημιουργήσουμε deb για το dbhub-0.450. Οπότε κατεβάζουμε τον πηγαίο κώδικα από το http://www.dbhub.org. Δημιουργούμε το directory μέσα στο οποίο θα δουλέψουμε

$ mkdir -p ~/dbhubproject

και μεταφέρουμε το tarball με τον πηγαίο κώδικα εκεί

$ mv dbhub-0.450.tar.gr ~/dbhubproject
$ cd ~/dbhubproject

Αποσυμπιέζουμε

$ tar xfz dbhubproject-4.50.tar.gz

και αλλάζουμε το working directory μας στο directory dbhub-0.450 που δημιουργήθηκε

$ cd dbhub-0.450/

Προετοιμασία του Πακέτου

Τώρα χρησιμοποιούμε το dh_make ως εξής:

$ dh_make -e youremal@address -f ../dbhub-0.450.tar.gz

Θα μας ρωτήσει αν το πακέτο μας είναι single binary, multiple binary κ.ο.κ .Το dbhub περιεχει μόνο ένα εκτελέσιμο αρχείο οπότε διαλέγουμε την πρώτη επιλογή και πατάμε enter. Με την εκτέλεση του dh_make θα δημιουργηθεί στο dir superproject ένα αντίγραφο του πηγαίου κώδικα της μορφής dbhub_0.450.orig.tar.gz ενώ στο WD μας θα δημιουργηθεί ένα directory debian.

Μέσα στο dir debian/ υπάρχουν τώρα τα εξής αρχεία και φάκελοι:

changelog        dbhub.doc-base.EX       init.d.ex        postrm.ex
compat           dirs manpage.1.ex       preinst.ex       README.Debian
control          docs manpage.sgml.ex    prerm.ex         rules
copyright        emacsen-install.ex      manpage.xml.ex   watch.ex
cron.d.ex        emacsen-remove.ex       menu.ex           
dbhub-default.ex emacsen-startup.ex      postinst.ex       

Ας δούμε τώρα τι είναι το κάθε αρχείο, αρχίζοντας με αυτά που χρειάζονται τροποποιήσεις:

Το αρχείο control: αυτό χρησιμοποιείται από προγράμματα όπως το dselect και το dpkg και άλλα εργαλεία του διαχειριστή πακέτων της διανομής μας και περιεχει βασικές πληροφορίες για το πακέτο μας. Η τυπική μορφή του είναι η ακόλουθη:

Source:
Section:
Priority:
Maintainer:
Build-Depends: debhelper (>= 5), autotools-dev
Standards-Version: 3.7.2

Package:
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description:
  • Στη γραμμή 1 είναι το όνομα του πακέτου του πηγαίου κώδικα
  • Στη γραμμή 2 η κατηγορία της διανομής στην οποία υπάγεται το πακέτο . Τα πακέτα του debian χωρίζονται σε 3 κύριες κατηγορίες:
    • main (ελεύθερο λογισμικό)
    • non-free (μη ελεύθερο λογισμικό)
    • contrib (ελεύθερο λογισμικό το οποίο εξαρτάται από μη ελεύθερο)
Κάτω από αυτές υπάρχουν πολλές υποκατηγορίες ανάλογα με το είδος του πακέτου πχ admin, base, net, x11. Το main/ εννοείται αν δεν βάλουμε κάτι, οπότε ας βάλουμε net το οποίο υποδηλώνει main/net.
  • Στην γραμμή 3 δηλώνουμε πόσο σημαντικό είναι για τον χρήστη να εγκαταστήσει το πακέτο Το optional είναι μια καλή επιλογή για το πακέτο μας.
  • Στην γραμμή 4 συμπληρώνουμε το όνομα και τη διεύθυνση e-mail του maintainer (δηλαδή στην περίπτωση μας το δικό μας:)).
  • Στην γραμμή 5 δηλώνονται τα πακέτα που είναι απαραίτητα για τη μεταγλώττιση και εγκατάσταση του πακέτου. Αν έχουμε το πακέτο ήδη εγκατεστημένο, μπορούμε να βρούμε τις εξαρτήσεις αυτές ως εξής:
$ objdump -p /usr/bin/superproject | grep NEEDED

και για κάθε βιβλιοθήκη που θα μας δώσει το οutput εκτελούμε την εντολή

$ dpkg -S libname

Παίρνουμε την -dev έκδοση κάθε πακέτου που μας επιστρέφει και έτσι βρίσκουμε τις απαραίτητες εξαρτήσεις:

  • Στη γραμμή 6 είναι η έκδοση του Debian Policy που ακολουθεί το πακέτο
  • Στη γραμμή 8 είναι το όνομα του πακέτου το οποίο είναι συνήθως (άλλα όχι απαραίτητα ) το ίδιο με το όνομα του πηγαίου κώδικα
  • Στη γραμμή 9 περιγράφεται η αρχιτεκτονική του επεξεργαστή στον οποίο το πακέτο μας μπορεί να εγκατασταθεί αφήνουμε στο any και αναλαμβάνει το dpkg-gencontrol να δώσει την απαιτούμενη τιμή σε κάθε υπολογιστή στον οποίον μεταγλωττίζεται το πακέτο
  • Στη γραμμή 10 έχουμε τις εξαρτήσεις οι οποίες λαμβάνονται υπόψιν από το διαχειριστή πακέτων της διανομής μας. Μπορούμε να έχουμε τα πεδία:
    • Depends: Πακέτα χωρίς τα οποία δε θα εγκατασταθεί το πακέτο μας.
    • Recommends: Το aptitude πχ θα μας προτείνει να εγκαταστήσουμε και αυτά τα πακέτα κατά την εγκατάσταση του πακέτου μας.
    • Suggests: Πακέτα με τα οποία συνεργάζεται καλά το πακέτο μας.
    • Pre-Depends: Πιο ισχυρό από το depends, υποδηλώνει πακέτα τα οποία αν δεν είναι εγκατεστημένα και ρυθμισμένα σωστά το πακέτο μας δε θα εγκατασταθεί Χρησιμοποιείται σπάνια.
    • Conflicts: Πακέτα τα οποία αν δεν απεγκατασταθούν το πακέτο μας δεν μπορεί να εγκατασταθεί.
    • Provides: Αν το πακέτο μας προσφέρει κάποιες λειτουργίες ενός virtual πακέτου, θα πρέπει να αναφέρουμε το πακέτο αυτό εδώ.
    • Replaces: Πακέτα τα οποία το δικό μας αντικαθιστά εξ' ολοκλήρου , η έστω κάποια αρχεία τους.
Για το Depends μπορούμε να χρησιμοποιήσουμε το ${shlibs:Depends}. Έτσι κατά τη διάρκεια της προσωρινής εγκατάστασης για να δημιουργηθεί το πακέτο μας, το dh_shlibdeps θα βρει τις εξαρτήσεις των shared libraries και το dh_controlgen θα τις βάλει στο απαραίτητο πεδίο.
  • Στη γραμμή 11 έχουμε μια σύντομη περιγραφή, ενώ στην γραμμή 12 αρχίζει η εκτενής περιγραφή (μια παράγραφος συνήθως με περισσότερες λεπτομέρειες για το πακέτο μας).

Μετά την επεξεργασία το control file μας θα είναι κάπως έτσι:

Source: dbhub
Section: net
Priority: optional
Maintainer: My name
Build-Depends: debhelper (>= 5), autotools-dev
Standards-Version: 3.7.2
Package: dbhub
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: A Direct Connect hub for Linux/Unix
 dbhub is a direct connect hub for Linux/Unix originated from the opendchub.

Το επόμενο αρχείο που θα εξετάσουμε είναι το copyright. Ας δούμε αυτό που έχει δημιουργήσει το dh_make:

This package was debianized by your name on
Wed, 30 Jan 1008 11:42:16 +0200.

It was downloaded from

Upstream Author(s):

Copyright:

Συμπληρώνουμε το site απ' όπου κατεβάσαμε τον πηγαίο κώδικα, και το όνομα του δημιουργού καθώς και το copyright και την άδεια με την οποία το δημοσίευσε. Η άδεια πρέπει να αναφέρεται ολόκληρη, εκτός και αν είναι κάποια από τις κοινές όπως GNU GPL, LGPL κλπ οπότε μπορούμε να παραπέμψουμε στο dir /usr/share/common-licenses/. Μετά τις αλλαγές το αρχείο copyright είναι κάπως έτσι:

This package was debianized by My name
Fri, 25 Jan 2008 13:56:39 +0200.
It was downloaded from http://www.dbhub.org/

Upstream Author: Centurion (DB Hub)
DarKRaver (since DB Hub 0.450)
Jonatan Nilson

License:
GNU GENERAL PUBLIC LICENSE

The Debian packaging is (C) 2008, My name
is licensed under the GPL, see `/usr/share/common-licenses/GPL'.

Το αρχείο changelog είναι ένα αρχείο με καθορισμένη μορφή που περιγράφεται στο Debian Policy. Χρησιμοποιείται από το dpkg για να βρει την έκδοση του προγράμματος, τη διανομή για την οποία προορίζεται και τη σπουδαιότητα του release αυτού.

Το πρότυπο που φτιάχνει το dh_make μοιάζει κάπως έτσι:

dbhub (0.450-1) testing; urgency=low
* Initial release (Closes: #nnnn)
-- My name

Στην πρώτη γραμμή δηλώνεται το όνομα του πακέτου και η έκδοση του, η διανομή και η αναγκαιότητα. Στην τρίτη γραμμή αναγράφουμε τι αλλαγές κάναμε στο πακέτο και ποια η χρησιμότητα τους, ενώ στην πέμπτη γραμμή το όνομα, το email και την ημερομηνία. Μετά τις απαραίτητες τροποποιήσεις το αρχείο μας γίνεται:

dbhub (0.450-1) testing; urgency=low
* Initial release.
-- My name

Το αρχείο rules είναι ένα Μakefile. Είναι εκτός της εμβέλειας του συγκεκριμένου άρθρου να το αναλύσουμε περαιτέρω, καθώς αν ο πηγαίος κώδικας μας έχει configure script (όπως συμβαίνει στην περίπτωση μας) δε θα χρειαστεί να του κάνουμε αλλαγές.

Περνάμε στο README.Debian. Στο αρχείο αυτό θα πρέπει να περιγράψουμε τυχόν διαφορές μεταξύ του αρχικού πακέτου του πηγαίου κώδικα και της debian εκδοχής του.

Στο αρχείο conffiles μπορούμε να αναφέρουμε το full path για όλα τα αρχεία παραμετροποίησης του πακέτου μας, ώστε να μπορεί ο package manager μας να τα διαχειρίζεται , π.χ. να τα διαγράφει όταν εκτελούμε aptitude remove – - purge, ή να μας ρωτάει για την ανανέωση τους όταν κάνουμε upgrade το πακέτο μας.

Στο αρχείο cron.d.ex αναφέρονται αν χρειάζονται προκαθορισμένες λειτουργίες που πρέπει να γίνονται για να δουλεύει σωστά το πακέτο μας. Στην περίπτωση μας δεν χρειάζεται οπότε μπορούμε να το διαγράψουμε.

Το αρχείο emacsen-.ex μπορούμε να το διαγράψουμε καθώς δεν έχουμε αρχεία για emacs που θα μεταγλωττιστούν κατά την εγκατάσταση του πακέτου.

Ομοίως και το αρχείο init.d.ex το οποίο θα χρησιμοποιούσαμε αν το πακέτο μας ήταν ένας daemon που θα έπρεπε να εκτελείται στην εκκίνηση του συστήματος.

Αν δεν υπάρχει man page στον πηγαίο κώδικα, θα πρέπει να δημιουργήσουμε ένα, επεξεργαζόμενοι κατάλληλα τα αρχεία manpage*.ex.

Στο αρχείο menu δημιουργούμε ένα menu entry για τον window manager. Το menu.ex που φτιάχνει το dh_make έχει την ακόλουθη μορφή:

?package(dbhub):needs="X11|text|vc|wm" section="Apps/see-menu-manual"\
title="dbhub" command="/usr/bin/dbhub"

το οποίο μετά την κατάλληλη τροποποίησή γίνεται:

?package(dbhub):needs="wm" section="Apps/Internet"\
title="dbhub" command="/usr/bin/dbhub"

Πρέπει να το μετονομάσουμε σε menu από menu.ex και το ίδιο ισχύει και για όλα τα .ex αρχεία που επεξεργαζόμαστε.

Στο αρχείο ex.package.doc.base μπορούμε να αναφέρουμε ό,τι αρχεία τεκμηρίωσης τυχαίνει να έχουμε για το πακέτο μας, εκτός από τα manual pages μετονομάζοντας το στην περίπτωση μας π.χ. σε dbhub.doc.base.

Το αρχείο watch.ex χρησιμοποιείται για την παρακολούθηση του site από το οποίο πήραμε τον πηγαίο κώδικα (χρησιμοποιείται από το uscan και uupdate). Στην περίπτωση μας δεν το χρειαζόμαστε οπότε μπορούμε να το διαγράψουμε.

Τέλος τα αρχεία postinst.ex, preinst.ex, postrm.ex, prerm.ex ονομάζονται maintainer scripts και περιγράφουν διαδικασίες που πρέπει να γίνουν κατά την εγκατάσταση και απεγκατάσταση του πακέτου μας. Διαβάζονται και εκτελούνται από το dpkg . Αφού αυτό είναι το πρώτο μας πακέτο, είναι καλύτερο να μην περιπλέξουμε τα πράγματα (έτσι και αλλιώς στην περίπτωση μας δε χρειάζεται) και άρα δε θα χρησιμοποιήσουμε τα scripts αυτά.

Δημιουργία του Πακέτου

Τώρα είμαστε έτοιμοι να δημιουργήσουμε το deb πακέτο μας. Εκτελούμε το configure script στον φάκελο του πηγαίου κώδικα, ενεργοποιώντας τα επιθυμητά flags. Στην περίπτωση μας:

$ cd ~/dbhubproject/dbhub-0.450
$ ./configure –enable-perl

και στη συνέχεια εκτελούμε την εντολή:

$ dpkg-buildpackage -rfakeroot

η οποία θα μεταγλωττίσει τον πηγαίο κώδικα και θα δημιουργήσει το πακέτο μας.

Αν όλα πάνε καλά θα δούμε μέσα στον φάκελο dbhubproject τα ακόλουθα αρχεία:

  • dbhub_0.450-1_i386.changes: Περιέχει λεπτομέρειες για τις αλλαγές που κάναμε στην έκδοση του πακέτου μας.
  • dbhub_0.450-1.orig. tar.gz: Είναι το tarball με τον πηγαίο κώδικα όπως τον κατεβάσαμε.
  • dbhub_0.450-1.dsc: Περιέχει μια περίληψη των αρχείων του πηγαίου κώδικα και δημιουργείται από το αρχείο control.
  • dbhub_0.450-1_i386.deb: Το πακέτο μας! Το εγκαθιστούμε με dpkg -i κανονικά όπως κάθε άλλο πακέτο.

Έλεγχος του Πακέτου

Τελειώσαμε... ή μάλλον όχι! Το ότι δημιουργήθηκε το πακέτο μας, δεν σημαίνει απαραίτητα ότι όλα είναι εντάξει. Θα πρέπει να ελέγξουμε αν το πακέτο μας συμβαδίζει με το debian policy. Το debian μας παρέχει το κατάλληλο εργαλείο, και ονομάζεται lintian. Οπότε

# aptitude install lintian

και για να κάνουμε τον έλεγχο εκτελούμε την εντολή:

$ lintian -i dbhub_0.450-1_i386.deb

Θα μας βγάλει error ή warnings αν έχουμε κάνει οποιοδήποτε λάθος, η αν η δομή του πακέτου μας δεν είναι debian compliant. Αφού ελέγξουμε με το lintian το πακέτο μας, είμαστε πλέον έτοιμοι να το μοιραστούμε.

Διαβάστε οπωσδήποτε τον επίσημο οδηγό: http://www.debian.org/doc/maint-guide/