Packaging/Python

Ο οδηγός δεν τέλειωσε ακόμη!

Αυτό το άρθρο είναι ένας οδηγός / "how to" / "tutorial" για δημιουργία python πακέτου με ελάχιστες εξαρτήσεις.

Πήραμε ως παράδειγμα το πρόγραμμα Vault: https://github.com/Clepto/Vault

Αναγκαία πακέτα

Εγκαθιστούμε τα αναγκαία πακέτα:

$ sudo apt-get install debhelper dh-make lintian ubuntu-dev-tools devscripts
[...]
  • Το dh-make πακέτο περιέχει την εντολή dh_make η οποία βοηθάει στην αρχική δημιουργία του πακέτου.

  • Το debhelper είναι μια σειρά από εντολές/εργαλεία που βοηθάνε στο πακετάρισμα.

  • Το lintian προσφέρει έλεγχο του πακέτου, αν συνάδει σύμφωνα με τα standards του debian, που υπάρχει στο "debian policy": http://www.debian.org/doc/debian-policy/#contents

  • Το ubuntu-dev-tools προσφέρει μια εντολή για εύκολη δημιουργία πακέτων, το pbuilder-dist. Δημιουργεί ένα "εικονικό" λειτουργικό σύστημα στο φάκελο pbuilder στον προσωπικό σας φάκελο ("~/pbuilder") χωρίς να εγκαθιστά πακέτα στο σύστημα σας. Προσφέρει καθαρό περιβάλλον δημιουργίας και δοκιμής πακέτων. Επίσης, μπορείτε να δημιουργήσετε πολλά εικονικά συστήματα, π.χ. ένα για ubuntu 10.04 (lucid lynx), ένα για ubuntu 11.04 (natty narwhal) και ένα για ubuntu 11.10 (oneiric ocelot).

  • To devscripts προσφέρει την εντολή "debuild" για δημιουργία του debian source πακέτου.

Προετοιμασία φακέλων

Λήψη του προγράμματος:

$ wget https://github.com/downloads/Clepto/Vault/vault-1.0.0.tar.gz -O vault-1.0.0.tar.gz
$ tar xzvf vault-1.0.0.tar.gz
[...]
$ dir
vault-1.0.0 vault-1.0.0.tar.gz
$ cd vault-1.0.0
$ dir
PKG-INFO  README  setup.py  vault

setup.py

Είναι σημαντικό να υπάρχει το setup.py. Μας βοηθάει πολύ στην εγκατάσταση και δημιουργία πακέτου.

Αν δεν υπάρχει, ζητάμε από τον προγραμματιστή να το δημιουργήσει. Το setup.py του vault:

   1 $ cat setup.py 
   2 #!/usr/bin/python
   3 # -*- coding: utf-8 -*-
   4 
   5 import os
   6 from distutils.core import setup
   7 
   8 data_files = [("share/icons/", ["vault/data/vault.png"]),
   9               ("share/applications/", ["vault/data/vault.desktop"])]
  10 
  11 setup(
  12     name = "vault",
  13     packages = ["vault"],
  14     scripts = ["vault/vault"],
  15     package_data = {"vault": ["qrc_resources/*","translations/*"]},
  16     data_files = data_files,
  17     version = "1.0.0",
  18     description = "GUI application for creating and managing encrypted folders.",
  19     author = "Chris Triantafillis",
  20     author_email = "christriant1995@gmail.com",
  21     license = "GPLv3",
  22     platforms = 'Linux',
  23     url = "https://github.com/Clepto/Vault",
  24     keywords = ["folders", "encrypted", "vault"],
  25     classifiers = [
  26         "Programming Language :: Python",
  27         "License :: OSI Approved :: GNU General Public License (GPL)",
  28         "Operating System :: POSIX :: Linux",
  29         "Environment :: X11 Applications :: Qt",
  30         "Natural Language :: English",
  31         "Natural Language :: Greek",
  32         "Intended Audience :: End Users/Desktop",
  33         "Topic :: Utilities"],
  34     long_description = """
  35 Vault is a GUI application for creating and managing encrypted folders. 
  36 Vault is written in Python and QT. It uses EncFS (man encfs, to see more)
  37 for the encryption.
  38 """
  39 )
  40 

Ελέγχουμε αν το setup.py δουλεύει:

$ python setup.py -nv install
running install
running build
running build_py
creating build
creating build/lib.linux-x86_64-2.7
creating build/lib.linux-x86_64-2.7/vault
copying vault/qrc_resources.py -> build/lib.linux-x86_64-2.7/vault
copying vault/createpasswd_dlg.py -> build/lib.linux-x86_64-2.7/vault
copying vault/__init__.py -> build/lib.linux-x86_64-2.7/vault
copying vault/vault.py -> build/lib.linux-x86_64-2.7/vault
copying vault/passwd_dlg.py -> build/lib.linux-x86_64-2.7/vault
creating build/lib.linux-x86_64-2.7/vault/qrc_resources
copying vault/qrc_resources/resources.qrc -> build/lib.linux-x86_64-2.7/vault/qrc_resources
creating build/lib.linux-x86_64-2.7/vault/translations
copying vault/translations/vault_el.ts -> build/lib.linux-x86_64-2.7/vault/translations
copying vault/translations/vault.pro -> build/lib.linux-x86_64-2.7/vault/translations
copying vault/translations/vault_el.qm -> build/lib.linux-x86_64-2.7/vault/translations
running build_scripts
creating build/scripts-2.7
copying and adjusting vault/vault -> build/scripts-2.7
changing mode of build/scripts-2.7/vault
running install_lib
warning: install_lib: 'build/lib.linux-x86_64-2.7' does not exist -- no Python modules to install

running install_scripts
running install_data
creating /usr/local/share/icons
copying vault/data/vault.png -> /usr/local/share/icons/
creating /usr/local/share/applications
copying vault/data/vault.desktop -> /usr/local/share/applications/
running install_egg_info
Writing /usr/local/lib/python2.7/dist-packages/vault-1.0.0.egg-info

Πολύ ωραία! Μια χαρά δουλεύει, όλα τα αρχεία είναι εδώ!

dh_make

Δημιουργία πακέτου με το dh_make:

$ dh_make --help
dh_make - prepare Debian packaging for an original source archive, version 0.59

Copyright (C) 1998-2011 Craig Small <csmall@debian.org>
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  Usage: dh_make [options]
  -c, --copyright <type>    use <type> of license in copyright file
                            (apache|artistic|bsd|gpl|gpl2|gpl3|lgpl|lgpl2|
                             lgpl3|x11)
  -e, --email <address>     use <address> as the maintainer e-mail address
  -n, --native              the program is Debian native, don't generate .orig
  -f, --file <file>         specify file to use as the original source archive
      --createorig          create orig.tar.gz file
  -s, --single              set package class to single
  -i, --indep               set package class to arch-independent
  -m, --multi               set package class to multiple binary
  -l, --library             set package class to library
  -k, --kmod                set package class to kernel module
      --kpatch              set package class to kernel patch
  -a, --addmissing          reprocess package and add missing files
  -t, --templates <dir>     apply customizing templates in <dir>
  -d  --defaultless         skip the default debian and package class templates
  -o, --overlay <dir>       reprocess package using template in <dir>
  -p, --packagename <name>  force package name to be <name>
  -r, --rulesformat <fmt>   Set the format of debian/rules file
                            (old|dh7|cdbs)
  -h, --help                display this help screen and exit
  -v, --version             show the version and exit

By Craig Small <csmall@debian.org>
Based on deb-make by Christoph Lameter <clameter@debian.org>.
Custom template support by Bruce Sass <bmsass@shaw.ca>.

Επειδή είναι ένα απλό πρόγραμμα (με μια εντολή), εκτελούμε με την επιλογή "-s" και παράλληλα ορίζουμε το αρχείο .tar.gz που κατεβάσαμε (άλλως "upstream tarball"):

$ dh_make -c gpl3 -s -f ../vault-1.0.0.tar.gz
Maintainer name  : Savvas Radevic
Email-Address    : vicedar@gmail.com 
Date             : Sun, 22 Jan 2012 00:58:23 +0100
Package Name     : vault
Version          : 1.0.0
License          : gpl3
Type of Package  : Single
Hit <enter> to confirm: 
Currently there is no top level Makefile. This may require additional tuning.
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the vault Makefiles install into $DESTDIR and not in / .

debian/

Δημιουργήθηκε ένας φάκελος debian/ και μια σειρά αρχείων:

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

Τα περισσότερα από αυτά είναι παραδείγματα (*.ex) και δεν τα χρειαζόμαστε για ένα πακέτο python. Αν χρειάζονται, πρέπει να μετονομαστούν και να αφαιρεθεί το ".ex".
Κοιτάξτε τα κεφάλαια 4 και 5 στο http://www.debian.org/doc/manuals/maint-guide/

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

$ dir debian/
changelog  compat  control  copyright  docs  rules  source  watch.ex

Επίσης μετονομάζουμε το watch.ex σε watch:

$ mv -v debian/watch.ex debian/watch
`debian/watch.ex' -> `debian/watch'

debian/compat

Ανοίγουμε το debian/compat

Περισσότερα εδώ: http://www.debian.org/doc/manuals/maint-guide/dother.en.html#compat

Βλέπουμε ότι περιέχει τον αριθμό "8". Είναι η έκδοση debhelper που υποστηρίζει. Το τροποποιούμε και αντί "8" χρησιμοποιούμε την έκδοση "7". Αποθηκεύουμε τις αλλαγές.

Τελικό αποτέλεσμα:

$ cat debian/compat
7

debian/control

Ανοίγουμε το debian/control:

Περισσότερα εδώ: http://www.debian.org/doc/manuals/maint-guide/dreq.en.html#control
..κι εδώ: http://www.debian.org/doc/debian-policy/ch-controlfields.html

Στο control αναφέρονται τα πακέτα που δημιουργούνται. Στην περίπτωση μας θέλουμε ένα debian binary πακέτο (αυτό που παίρνει ο χρήστης) κι ένα πακέτο debian source (π.χ. αν κάποιος θέλει να κάνει build το πακέτο μόνος του).

Το debian binary είναι το "Package" και το debian source είναι το "Source".

Προσέξτε ότι μεταξύ τους υπάρχει μια κενή γραμμή, με την οποία ξεχωρίζουμε τους ορισμούς για τα πακέτα.

Συνήθως πρέπει να αλλάξετε τα ακόλουθα:

debian/control Section

1) το Section (το "είδος" προγράμματος/πακέτου).

Περισσότερα εδώ: http://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections Μια λίστα με τα sections και τις επεξηγήσεις τους θα βρείτε εδώ: http://packages.debian.org/unstable/

Χρησιμοποιήστε τα ονόματα όπως αναφέρονται στον πρώτο σύνδεσμο. Εγώ θα αλλάξω τη γραμμή "Section: unknown" σε "Section: utils" μιας και πρόκειται για utility.

debian/control Build-Depends

2) το Build-Depends:

Τα πακέτα που είναι απαραίτητα για να φτιαχθεί το πακέτο. Όποιο πακέτο χρειάζεται κατά το build.
Για δημιουργία ενός πακέτου python, χρειαζόμαστε το debhelper 7.0.50~ ή νεότερη έκδοση και τις python εκδόσεις (python-all).

  • Γιατί python-all;

$ apt-cache show python-all
[...]
 This package is used as a build dependency for other packages to
 avoid hardcoded dependencies on specific Python runtimes.
[...]

Μπορεί να χρειαστούν και άλλα πακέτα, θα κοιτάξετε το λεγόμενο "buildlog" αρχείο όπου θα δείτε αν λείπει κάτι από τα αρχεία ή αν σταμάτησε η εγκατάσταση κάπου.

Οπόταν για το vault πακέτο χρησιμοποιούμε: Build-Depends: debhelper (>= 7.0.50~), python-all

debian/control Homepage

3) Αλλάζουμε το "Homepage":

Homepage: https://github.com/Clepto/Vault

debian/control Description

4) Αλλάζουμε το "Description".

Προσοχή! Η πρώτη γραμμή είναι ο τίτλος (μια περιεκτική πρόταση) και όλες οι υπολοιπες γραμμές που αρχίζουν με κενό χαρακτήρα είναι η επεξήγηση. Φροντίστε να είναι αρκετά μεγάλο. Εξηγείστε τι κάνει, τι είναι, τι προσφέρει, τι χρειάζεται επιπλέον κτλ κτλ.

Αποτέλεσμα:

Description: encfs gui to create and manage folder encryption
 Vault is a GUI application for creating and managing encrypted folders.
 Vault is written in Python and QT. It uses EncFS (man encfs, to see more)
 for the encryption.

Προσέξτε τον κενό χαρακτήρα στην αργή της κάθε γραμμής μετά το "Description".
Περισσότερα εδώ: http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description

debian/control Depends

5) "Depends": Το debian binary πακέτο που εγκαθιστά ο χρήστης μπορεί να χρειάζεται μερικά επιπλέον πακέτα που δεν αναγνωρίζει το σύστημα πακέτων (debhelper).

Το debhelper αυτόματα βρίσκει μερικά πακέτα, και συνήθως το θέτουμε ως: Depends: ${shlibs:Depends}, ${misc:Depends}

Για πακέτα python συνήθως χρειαζόμαστε να ορίσουμε τα αναγκαία πακέτα, όπως στην περίπτωση μας το encfs και το python-qt4: Depends: ${shlibs:Depends}, ${misc:Depends}, encfs, python-qt4

Μπορεί να μην είναι όλα τα πακέτα απολύτως απαραίτητα ("Depends"), μπορεί να προσφέρουν ένα επιπλέον χαρακτηριστικό (feature) γι' αυτό υπάρχουν τα "Recommends", "Suggests" κτλ.
Περισσότερα εδώ: http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps

debian/control Architecture

6) "Architecture": Η αρχιτεκτονική που υποστηρίζει το πακέτο.

Η τιμή μπορεί να είναι π.χ. "i386", "amd64", "any" (όταν δημιουργηθεί το πακέτο θα πάρει τιμή "i386" ή "amd64" ανάλογα με το εικονικό σύστημα pbuilder που έχετε) ή "all" (για όλες τις αρχιτεκτονικές δημιουργεί ένα πακέτο).

Το αλλάζουμε σε "all". Τα προγράμματα σε python δεν γίνονται compile και δεν εξαρτώνται από την αρχιτεκτονική του συστήματος: Architecture: all

Τελικό αποτέλεσμα:

$ cat debian/control 
Source: vault
Section: utils
Priority: extra
Maintainer: Savvas Radevic <vicedar@gmail.com>
Build-Depends: debhelper (>= 7.0.50~), python-all
Standards-Version: 3.9.2
Homepage: https://github.com/Clepto/Vault

Package: vault
Architecture: all
Depends: ${shlibs:Depends}, ${misc:Depends}, encfs, python-qt4
Description: encfs gui to create and manage folder encryption
 Vault is a GUI application for creating and managing encrypted folders.
 Vault is written in Python and QT. It uses EncFS (man encfs, to see more)
 for the encryption.

debian/rules

Ανοίγουμε το debian/rules και διαβάζουμε:

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

Πολλές φορές οι επιπλέον πληροφορίες που προσφέρει το DH_VERBOSE (debhelper verbose) είναι βοηθητικές, γι' αυτό προτιμήστε να το ενεργοποιήσετε αφαιρώντας τον χαρακτήρα "#":

# Uncomment this to turn on verbose mode.
export DH_VERBOSE=1

Επίσης:

%:
        dh $@

Θα πρέπει να μάθετε περισσότερα για το λεγόμενο "makefile". Για το debian υπάρχουν διάφοροι ορισμοί, για τους οποίους θα μιλήσουμε σε κάποιο κατοπινό στάδιο.
Περισσότερα για το rules εδώ: http://www.debian.org/doc/manuals/maint-guide/dreq.en.html#rules

Αυτό που θα αλλάξουμε είναι να πούμε στο debhelper "χρησιμοποίησε το setup.py για την εγκατάσταση". Αυτό το κάνουμε με τον εξής τρόπο:

%:
        dh $@ --with python2

Περισσότερα για το dh_python2 μπορείτε να βρείτε εδώ: http://manpages.debian.net/cgi-bin/man.cgi?query=dh_python2&apropos=0&sektion=0&manpath=Debian+unstable+%28sid%29&format=html&locale=en
...ή εκτελώντας man dh_python2

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

Τελικό αποτέλεσμα:

$ cat debian/rules 
#!/usr/bin/make -f
# -*- makefile -*-

# Uncomment this to turn on verbose mode.
export DH_VERBOSE=1

%:
        dh $@ --with python2

debian/changelog

Τέλος, ανοίγουμε το debian/changelog: $ cat debian/changelog vault (1.0.0-1) unstable; urgency=low

  • Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP>

Το "Closes: #nnnn" είναι όταν θελετε να δημιουργήσετε πακέτο που θα προστεθεί στα αποθετήρια debian. Το #nnnn αναφέρεται σε ένα αριθμό bug report (αναφοράς "σφάλματος"), όπου δηλώνετε πρόθεση να δημιουργήσετε το πακέτο για το εν λόγω πρόγραμμα ("ITP" / "Intention to package"). Παράδειγμα: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=654970

Το "unstable" αν θέλουμε το αλλάζουμε. Αν το πακέτο δεν θα ανεβεί σε PPA δεν παίζει σημασία. Για PPA πακέτα είναι καλό να μπεί ως "lucid" αν το πακέτο είναι για το ubuntu 10.04, "natty" για το 11.04, "oneiric" για το 11.10.

Για την έκδοση του πακέτου ("1.0.0-1") διαβάστε εδώ: http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version

Τελικό αποτέλεσμα:

$ cat debian/changelog
vault (1.0.0-1) unstable; urgency=low

  * Initial release

 -- Savvas Radevic <vicedar@gmail.com>  Sun, 22 Jan 2012 00:58:23 +0100

debuild

Για τη δημιουργία του πακέτου εκτελούμε:

$ debuild -S -sa
[...]
You need a passphrase to unlock the secret key for
user: "Savvas Radevic <vicedar@gmail.com>"
1024-bit DSA key, ID 94185BB9, created 2008-03-30
[...]

Θα σας ζητήσει να γράψετε τον κωδικό του δημιουργού. Αυτός είναι ο κωδικός που δώσατε στο gpg key που ήδη δημιουργήσατε.

Δημιουργήθηκαν τα αρχεία του debian source package:

$ dir -1 ../
vault-1.0.0
vault_1.0.0-1.debian.tar.gz
vault_1.0.0-1.dsc
vault_1.0.0-1_source.build
vault_1.0.0-1_source.changes
vault_1.0.0.orig.tar.gz
vault-1.0.0.tar.gz

lintian

Ελέγχουμε το source πακέτο με lintian (με τη βοηθεια του αρχείου .changes):

$ lintian -Ii ../vault_1.0.0-1_source.changes
(κεφαλαίο "I" και πεζό "i")
I: vault source: debian-watch-contains-dh_make-template
N: 
N:    The watch file contains a standard template included by dh_make. Please
N:    remove them once you have implemented the watch file.
N:    
N:    Severity: wishlist, Certainty: certain
N:    
N:    Check: watch-file, Type: source
N: 

debian/watch

Ουπς! Ξεχάσαμε να αλλάξουμε το αρχείο debian/watch. Χρησιμεύει στην ανίχνευση καινούριων εκδόσεων. Ανοίγουμε το αρχείο debian/watch.

Περισσότερα για το debian/watch εδώ: http://www.debian.org/doc/manuals/maint-guide/dother.en.html#watch
..κι εδώ: http://manpages.debian.net/cgi-bin/man.cgi?query=uscan&apropos=0&sektion=0&manpath=Debian+unstable+%28sid%29&format=html&locale=en (man uscan)

Αναφέρονται μερικά παραδείγματα χρήσης. Για το Vault ξέρουμε ότι το upstream tarball αρχείο του vault βρίσκεται εδώ: https://github.com/downloads/Clepto/Vault/vault-1.0.0.tar.gz

Άρα αλλάζουμε το watch ως εξής:

version=3
https://github.com/Clepto/Vault/downloads/ \
/downloads/Clepto/Vault/vault-(.*).tar.gz \
debian uupdate

Το (.*) είναι regular expression, το οποίο βοηθάει στην αναγνώριση μιας ομάδας χαρακτήρων (αριθμών, γραμμάτων, κ.ά.). Δε θα το αναλύσουμε εις βάθος, αλλά το (.*) αναγνωρίζει τους χαρακτήρες "1.0.0" της έκδοσης. Το παραπάνω debian/watch ψάχνει στην ιστοσελίδα "https://github.com/Clepto/Vault/downloads/" για οποιαδήποτε αρχεία ή anchor href links που να έχουν "/downloads/Clepto/Vault/vault-(.*).tar.gz". Το debian uupdate βοηθάει όταν κάνετε αναβάθμιση της έκδοσης.

Περισσότερα για regular expressions θα βρείτε εδώ:

uscan

Ελέγχουμε το αρχείο debian/watch με την εντολή "uscan --report":

$ uscan --report
-- Scanning for watchfiles in .
-- Found watchfile in ./debian
-- In debian/watch, processing watchfile line:
   https://github.com/Clepto/Vault/downloads/ /downloads/Clepto/Vault/vault-(.*).tar.gz debian uupdate
-- Found the following matching hrefs:
     /downloads/Clepto/Vault/vault-1.0.0.tar.gz
Newest version on remote site is 1.0.0, local version is 1.0.0
 => Package is up to date
-- Scan finished

Το uscan συγκρίνει την έκδοση που υπάρχει στο debian/changelog με αυτήν που βρίσκει στην ιστοσελίδα που ορίσατε στο debian/watch.

Έχουμε την τελευταία έκδοση. Όλα καλά!

debuild 2

Ξαναδημιουργούμε το debian source πακέτο με το debuild:

$ debuild -S -sa
[...]

lintian 2

Ξαναελέχουμε το πακέτο με το lintian:

$ lintian -Ii ../vault_1.0.0-1_source.changes
(καμία απάντηση = δεν υπάρχει σφάλμα!)

Περίφημα! Συνεχίζουμε δημιουργώντας το εικονικό σύστημα για να φτιάξουμε το debian binary πακέτο.

pbuilder-dist create

Δημιουργούμε ένα εικονικό σύστημα για το ubuntu 11.10 (oneiric ocelot). Χρειάζεστε διαδικτυο για αυτή τη λειτουργία:

$ pbuilder-dist oneiric create
[sudo] password for savvas: 
W: /home/savvas/.pbuilderrc does not exist
I: Logging to /home/savvas/pbuilder/oneiric_result/last_operation.log
I: Distribution is oneiric.
I: Building the build environment
I: running debootstrap
/usr/sbin/debootstrap
I: Retrieving Release
I: Retrieving Release.gpg
[...]

Προσέξτε ότι αρχίζει να κατεβάζει αρχεία για το εικονικό σύστημα.

Η τελευταία ενεργεια που κάνατε (pbuilder-dist oneric create, pbuilder-dist oneric build, pbuilder-dist oneric update κτλ...) θα αποθηκευθεί στον προσωπικό σας φάκελο στο ~/pbuilder/oneiric_result/last_operation.log

pbuilder-dist build

Όταν τελειώσει, δίνουμε εντολή για δημιουργία του debian binary πακέτου (του πακέτου που εγκαθιστούν οι χρήστες):

$ pbuilder-dist oneiric build ../vault_1.0.0-1.dsc 
[sudo] password for savvas: 
W: /home/savvas/.pbuilderrc does not exist
I: Logging to /home/savvas/pbuilder/oneiric_result/last_operation.log
I: using fakeroot in build.
I: Current time: Sun Jan 22 22:58:03 CET 2012
I: pbuilder-time-stamp: 1327269483
I: Building the build Environment
I: extracting base tarball [/home/savvas/pbuilder/oneiric-base.tgz]
I: creating local configuration
I: copying local configuration
I: Installing apt-lines
I: mounting /proc filesystem
I: mounting /dev/pts filesystem
I: Mounting /var/cache/pbuilder/ccache
I: policy-rc.d already exists
I: Obtaining the cached apt archive contents
I: Setting up ccache
I: Installing the build-deps
 -> Attempting to satisfy build-dependencies
 -> Creating pbuilder-satisfydepends-dummy package
[...]
dpkg-deb: building package `vault' in `../vault_1.0.0-1_all.deb'.
 dpkg-genchanges  >../vault_1.0.0-1_amd64.changes
dpkg-genchanges: including full source code in upload
 dpkg-source --after-build vault-1.0.0
dpkg-buildpackage: full upload (original source is included)
I: Copying back the cached apt archive contents
I: unmounting /var/cache/pbuilder/ccache filesystem
I: unmounting dev/pts filesystem
I: unmounting proc filesystem
I: cleaning the build env 
I: removing directory /var/cache/pbuilder/build//17477 and its subdirectories
I: Current time: Sun Jan 22 22:59:46 CET 2012
I: pbuilder-time-stamp: 1327269586

Θα κατεβάσει τα αναγκαία πακέτα και θα προσπαθήσει να δημιουργήσει το πακέτο. Το αποτέλεσμα θα αποθηκευθεί στον προσωπικό σας φάκελο στο ~/pbuilder/oneiric_result/last_operation.log

Έτοιμο το πακέτο μας λοιπόν, βρίσκεται στο φάκελο ~/pbuilder/oneiric_result/

lintian binary

Ελέγχουμε πάλι τα πακέτα, αυτή τη φορά το binary και το source πακέτο, με το lintian:

$ lintian -Ii ~/pbuilder/oneiric_result/vault_1.0.0-1_amd64.changes
Σ'εσάς μπορεί να διαφέρει το amd64 (αν έχετε 32-bit σύστημα π.χ.)

W: vault: new-package-should-close-itp-bug
[...]
E: vault: helper-templates-in-copyright
[...]
W: vault: copyright-has-url-from-dh_make-boilerplate
[...]
E: vault: copyright-contains-dh_make-todo-boilerplate
[...]
W: vault: binary-without-manpage usr/bin/vault
[...]
E: vault: python-script-but-no-python-dep usr/bin/vault
[...]

lintian ${python:Depends}

Ένα ένα τα λύνουμε, αρχίζουμε από το τελευταίο:

1. "E: vault: python-script-but-no-python-dep usr/bin/vault"

N: 
N:    Packages with Python scripts should depend on the package python. Those
N:    with scripts that specify a specific version of Python must depend on
N:    that version of Python (exactly).
N:    
N:    For example, if a script in the package uses #!/usr/bin/python, the
N:    package needs a dependency on python. If a script uses
N:    #!/usr/bin/python2.6, the package needs a dependency on python2.6. A
N:    dependency on python (>= 2.6) is not correct, since later versions of
N:    Python may not provide the /usr/bin/python2.6 binary.
N:    
N:    If you are using debhelper, adding ${python:Depends} to the Depends
N:    field and ensuring dh_pysupport or dh_pycentral are run during the build
N:    should take care of adding the correct dependency.
N:    
N:    In some cases a weaker relationship, such as Suggests or Recommends,
N:    will be more appropriate.
N:    
N:    Severity: important, Certainty: certain
N:    
N:    Check: scripts, Type: binary

Αυτό το σφάλμα μας εξηγεί πως ξεχάσαμε κάτι στο debian/control, το ${python:Depends} επειδή λογικά το πακέτο μας χρειάζεται μια έκδοση python. Ανοίγουμε ξανά το debian control.

Αλλάζουμε τη γραμμή "Depends":  Depends: ${shlibs:Depends}, ${misc:Depends}, encfs, python-qt4, ${python:Depends} 

Επίσης προσθέτουμε ακόμη μια γραμμή για το πακέτο source: XS-Python-Version: >= 2.6
..και για το πακέτο binary: X-Python-Version: >= 2.6

  • Από πού βρήκα το X-Python-Version; Αναφέρεται στο wiki:

http://wiki.debian.org/Python/Packaging#Example_2:_Python_application
http://wiki.debian.org/Python/TransitionToDHPython2

  • Γιατί έκδοση python νεότερη από 2.6; Στο αρχείο vault/vault.py υπάρχει αυτός ο έλεγχος:

if not (py_version >= '2.6' and py_version < '3'):
    exit('Error: You need python 2.6 or python2.7 to run this program.')

Ο προγραμματιστής αναφέρει ότι χρειάζεται έκδοση 2.6 και άνω (python 2.x, όχι python 3.x).
Τελικό αποτέλεσμα του debian/control:

$ cat debian/control 
Source: vault
Section: utils
Priority: extra
Maintainer: Savvas Radevic <vicedar@gmail.com>
Build-Depends: debhelper (>= 7.0.50~), python-all
Standards-Version: 3.9.2
Homepage: https://github.com/Clepto/Vault
XS-Python-Version: >= 2.6

Package: vault
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, encfs, python-qt4, ${python:Depends}
Description: encfs gui to create and manage folder encryption
 Vault is a GUI application for creating and managing encrypted folders.
 Vault is written in Python and QT. It uses EncFS (man encfs, to see more)
 for the encryption.
X-Python-Version: >= 2.6

2) E: vault: helper-templates-in-copyright
W: vault: copyright-has-url-from-dh_make-boilerplate
E: vault: copyright-contains-dh_make-todo-boilerplate

Ουπς πάλι, ξεχάσαμε να συμπληρώσουμε τα στοιχεία στο debian/copyright. Ανοιγουμε το debian/copyright λοιπόν:

$ cat debian/copyright
Format: http://dep.debian.net/deps/dep5
Upstream-Name: vault
Source: <url://example.com>

Files: *
Copyright: <years> <put author's name and email here>
           <years> <likewise for another author>
License: GPL-3.0+

Files: debian/*
Copyright: 2012 Savvas Radevic <vicedar@gmail.com>
License: GPL-3.0+

License: GPL-3.0+
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
 .
 This package is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 .
 You should have received a copy of the GNU General Public License
 along with this program. If not, see <http://www.gnu.org/licenses/>.
 .
 On Debian systems, the complete text of the GNU General
 Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".

# Please also look if there are files or directories which have a
# different copyright/license attached and list them here.

Περισσότερα για το debian/copyright θα βρείτε εδώ: http://www.debian.org/doc/manuals/maint-guide/dreq.en.html#copyright
..κι εδώ: http://dep.debian.net/deps/dep5
..κι εδώ: http://www.debian.org/doc/debian-policy/ch-docs.html#s-copyrightfile

Συμπληρώνουμε τα στοιχεία "Source" και "Copyright". Αφαιρούμε τις τελευταίες γραμμές που αρχίζουν με τον χαρακτήρα "#" (comments).

Τελικό αποτέλεσμα:

$ cat debian/copyright 
Format: http://dep.debian.net/deps/dep5
Upstream-Name: vault
Source: https://github.com/downloads/Clepto/Vault/vault-1.0.0.tar.gz

Files: *
Copyright: 2012 Chris Triantafillis <christriant1995@gmail.com>
License: GPL-3.0+

Files: debian/*
Copyright: 2012 Savvas Radevic <vicedar@gmail.com>
License: GPL-3.0+

License: GPL-3.0+
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
 .
 This package is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 .
 You should have received a copy of the GNU General Public License
 along with this program. If not, see <http://www.gnu.org/licenses/>.
 .
 On Debian systems, the complete text of the GNU General
 Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".

lintian TODO

3) W: vault: new-package-should-close-itp-bug
W: vault: binary-without-manpage usr/bin/vault

Το πρώτο αναφέρει ότι έπρεπε να χρησιμοποιήσουμε το (Closes: #1234) στο debian/changelog. Επειδή το πακέτο δεν θα πάει στο debian αποθετήριο, το αγνοούμε.

Το δεύτερο είναι το manpage. Στο debian δίνουν σημασία στο σωστό manpage το οποίο θα περιγράφει το τι κάνει η εντολή. Θα αγνοήσουμε όμως κι αυτό το σφάλμα για τον ίδιο λόγο, το πακέτο δεν θα πάει στο debian αποθετήριο.

Για αρχή 2 σφάλματα είναι πολύ καλή κατάσταση.

debuild 3/pbuilder-dist build 2

Δημιουργούμε ξανά λοιπόν το πακέτο μας.

$ debuild -S -sa
[...]
$ pbuilder-dist oneiric build ../vault_1.0.0-1.dsc
[...]

lintian

Ελέγχουμε ξανά με lintian:

$ lintian -Ii ~/pbuilder/oneiric_result/vault_1.0.0-1_amd64.changes
W: vault: new-package-should-close-itp-bug
W: vault: binary-without-manpage usr/bin/vault

dpkg -i

Περίφημα, δημιουργήσαμε ένα πακέτο για python πρόγραμμα με τη βοήθεια του debhelper! Δε φτάνει παρά να το δοκιμάσουμε.

Οι παρακάτω εντολές θα εγκαταστήσουν το πακέτο και όλα τα εξαρτώμενα πακέτα που χρειάζεται:

sudo dpkg -i ~/pbuilder/oneiric_result/vault_1.0.0-1_all.deb
[...]
sudo apt-get -f install
[...]


Packaging

Packaging/Python (last edited 05-02-2012 16:01:51 by ?medigeek)