Contents
|
Ο οδηγός δεν τέλειωσε ακόμη!
Αυτό το άρθρο είναι ένας οδηγός / "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" (για όλες τις αρχιτεκτονικές δημιουργεί ένα πακέτο).
Για άλλες τιμές κοιτάξτε εδώ: dpkg-architecture -L
Περισσότερα για το Architecture: http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Architecture
Το αλλάζουμε σε "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>
-- Savvas Radevic <vicedar@gmail.com> Sun, 22 Jan 2012 00:58:23 +0100
Το "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
lintian debian/copyright
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 [...]
