Requirements: build-essential, automake, gnupg, lintian, fakeroot and pbuilder.
Dans cet exemple, nous utiliserons l'application GNU hello. Vous pouvez télécharger l'archive des sources depuis ftp.gnu.org. Pour les besoins de l'exemple, nous utiliserons le dossier ~/hello/
.
mkdir ~/hello cd ~/hello wget http://ftp.gnu.org/gnu/hello/hello-2.1.1.tar.gz
Nous allons également comparer notre paquet avec celui qui est déjà prêt dans les dépôts Ubuntu. Pour le moment, nous allons le placer dans le répertoire Ubuntu
afin de pouvoir s'y pencher plus tard. Afin d'obtenir le paquet source, soyez certain d'avoir la ligne « deb-src » pour le dépôt principal (Main) dans votre /etc/apt/sources.list
. Ensuite, exécutez simplement ceci :
mkdir ubuntu cd ubuntu apt-get source hello cd ..
Contrairement à la majorité des commandes apt-get, il n'est pas nécessaire d'avoir les privilèges du superutilisateur pour obtenir le paquet source, parce qu'il est téléchargé dans le dossier actuel. En fait, il est recommande de n'utiliser apt-get source uniquement comme utilisateur normal, puisque ous pourrez ensuite éditer les fichiers du paquet source sans nécessiter les privilèges de superutilisateur.
Ce que la commande apt-get source fait est :
Télécharge le paquet source. Un paquet source contient habituellement un fichier .dsc décrivant le paquet et fournissant les sommes MD5 du paquet source, un fichier .orig.tar.gz contenant le code source de l'auteur, et un fichier .diff.gz contenant les correctifs (patchs) à appliquer sur le code source avec les informations de mise en paquet.
Décompresser le .orig.tar.gz dans le dossier courant.
Appliquer le .diff.gz décompressé au dossier source non compressé.
Si vous téléchargez manuellement le paquet source (fichiers .dsc, .orig.tar.gz, .diff.gz), vous pouvez les décompresser comme le fait apt-get source en utilisant dpkg-source comme suit :
dpkg-source -x *.dsc
The first thing you will need to do is make a copy of the
original (sometimes called "upstream") tarball in the following
format:
<packagename>_<version>.orig.tar.gz
.
This step does two things. First, it creates two copies of the source
code. If you accidentally change or delete the working copy you can
use the one you downloaded. Second, it is considered poor
packaging practice to change the original source tarball unless
absolutely necessary. See la section intitulée « Common Mistakes » for
reasons.
cp hello-2.1.1.tar.gz hello_2.1.1.orig.tar.gz tar -xzvf hello_2.1.1.orig.tar.gz
The underscore, "_", between the package name (hello) and the version (2.1.1), as opposed to a hyphen, "-", is very important. Your source package will incorrectly be built as a Debian native package.
Nous avons maintenant un répertoire hello-2.1.1
qui contient les fichiers sources. Nous devons maintenant créer le répertoire debian personnalisé où toute l'information de construction de paquet est stockée, nous permettant de séparer les fichiers de construction de paquet des fichiers source de l'application.
mkdir hello-2.1.1/debian cd hello-2.1.1/debian/
Nous devons maintenant créer les fichiers essentiels pour n'importe quel paquet source Ubuntu : changelog
, control
, copyright
, et rules
. Ce sont les fichiers nécessaires à la création des paquets binaires (fichiers .deb) depuis le code source original (upstream). Examinons en détail chacun de ces fichiers.
Le fichier changelog
(journal des changements) est, comme son nom l'indique (pour les anglophones), une liste des changements réalisés pour chaque version. Il a un format spécifique qui donne le nom du paquet, sa version, la distribution, les changements et la personne qui a fait les changements à un moment donné. Si vous avez une clé GPG, soyez certain d'utiliser les même noms et courriels dans le fichier changelog
que ceux que vous avez dans votre clé. Veuillez noter Ce qui suit est un modèle pour changelog
, veuillez noter que son contenu doit être en anglais, même si ce modèle est traduit pour plus de compréhension.
paquet (version) distribution; urgency=urgency * détails du changement plus de détails * d'autres détails -- Nom du mainteneur <courriel>[deux espaces] date
Le format (de la date en particulier) est important. La dte doit être au format défini par la RFC822. Elle peut être obtenue à l'aide du programme 822-date.
Voici un simple fichier changelog
pour hello :
hello (2.1.1-1) dapper; urgency=low * New upstream release with lots of bug fixes. -- Captain Packager <packager@coolness.com> Wed, 5 Apr 2006 22:38:49 -0700
Veuillez noter que la version est suffixée d'un -1, ou ce qui est appelé la révision Debian, qui est utilisée pour que le paquet puisse être mis à jour (pour corriger des bogues par exemple) avec de nouveaux paquets utilisant la même version de source.
Ubuntu et Debian utilisent des schémas de versions de paquets légèrement différents pour éviter les conflits avec la même version source. Si un paquet Debian a été transformé pour Ubuntu, il est suffixé de ubuntuX (où Xet le numéro de révision Ubuntu) après le numéro de version Debian. Donc si le paquet Debian hello a été modifié pour Ubuntu, le numéro complet de version serait 2.1.1-1ubuntu1
. Si le paquet pour une application n'existe pas dans Debian, alors la version Ubuntu est 0 (exemple : 2.1.1-0ubuntu1
).
Étudions maintenant le journal des changements (changelog
) pour le paquet source Ubuntu que nous avons téléchargement précédemment :
less ../../ubuntu/hello-2.1.1/debian/changelog
Notez que dans ce cas, la distribution est unstable (une branche de Debian), parce que le paquet Debian n'a pas été modifié par Ubuntu. Rappelez-vous de définir la distribution pour votre version cible de distribution.
À ce moment, créez un fichier changelog
dans le dossier debian
où vous devriez déjà être.
The control file contains the information that the package manager (such as apt-get, synaptic, and aptitude) uses, build-time dependencies, maintainer information, and much more.
For the Ubuntu hello package, the control file looks something like:
Source: hello Section: devel Priority: optional Maintainer: Captain Packager <packager@coolness.com> Standards-Version: 3.6.1 Package: hello Architecture: any Depends: ${shlibs:Depends} Description: The classic greeting, and a good example The GNU hello program produces a familiar, friendly greeting. It allows non-programmers to use a classic computer science tool which would otherwise be unavailable to them. . Seriously, though: this is an example of how to do a Debian package. It is the Debian version of the GNU Project's `hello world' program (which is itself an example for the GNU Project).
Create control
using the
information above (making sure to provide your information for
the Maintainer field).
The first paragraph gives information about the source package. Let us go through each line:
Source: This is the name of the source package, in this case, hello.
Section: The apt repositories are split up into sections for ease of browsing and categorization of software. In this case, hello belongs in the devel section.
Priority: This sets the importance of the package to users. It should be one of the following:
Required - packages that are essential for the system to work properly. If they are removed it is highly likely that your system will break in an unrecoverable way.
Important - ensemble minimal de paquets pour un système utilisable. Enlever ces paquets ne détruira pas de manière irréversible votre système, mais ils sont généralement considérés comme des outils importants sans lesquels une installation de Linux ne serait pas complète. Note : Cet ensemble n'inclut pas de choses telles que Emacs ou le Système de Fenêtres X.
Standard - Somewhat self explanatory.
Optional (Optionnel) - dans cette catégorie se trouvent essentiellement des paquets non-requis, le gros des paquets. Cependant, ces paquets ne doivent pas entrer en conflit entre eux.
Extra - paquets qui peuvent entrer en conflit avec l'une des catégories ci-dessus. Elle est également utilisée pour des paquets spécialisés qui ne seraient utiles qu'à des personnes qui connaissent la fonction du paquet.
Maintainer : Le mainteneur du paquet avec son courriel
Standards-Version : La version de la Politique Debian (Debian Policy) à laquelle le paquet adhère (dans ce cas, la version 3.6.1). Un moyen simple de trouver la version actuelle es apt-cache show debian-policy | grep Version.
Build-Depends : L'un des champs les plus importants et souvent source de bogues. Cette ligne liste les paquets binaires (et leurs versions si nécessaire) devant être installés pour créer le(s) paquet(s) binaires(s) depuis le paquet source. Les paquets essentiels sont requis pa build-essential et ne doivent pas être inclus dans la ligne Build-Depends. Dans le cas de hello, tous les paquets font partie de build-essential, donc la ligne Build-Depends n'est pas nécessaire. La liste des paquets build-essential peut être trouvée à /usr/share/doc/build-essential/list
.
Le second paragraphe est destiné au paquet binaire qui sera construit depuis la source. Si de multiples paquets binaires sont construits depuis le paquet source, il devrait y avoir une section pour chacun. À nouveau, parcourons les lignes :
Package : Le nom du paquet binaire. Souvent, pour de simples programmes (tels que hello), le nom du paquet source et le paquet binaire sont les mêmes.
Architecture : Les architectures pour lesquelles le paquet binaire sera construit. Par exemple :
all - The source
is not architecture-dependent. Programs that use Python
or other interpreted languages would use this. The
resulting binary package would end with
_all.deb
.
any - The source
is architecture-dependent and should
compile on all the supported architectures. There will be
a .deb file for each architecture (
_i386.deb
for
instance)
A subset of architectures (i386, amd64, ppc, etc.) can be listed to indicate that the source is architecture-dependent and does not work for all architectures supported by Ubuntu.
Depends: The list of
packages that the binary package depends on for functionality. For
hello, we see
${shlibs:Depends}
, which is a variable that
substitutes in the needed shared libraries. See the
dpkg-source
man page for more
information.
Recommends: Used for packages that are highly recommended and usually are installed with the package. Some package managers, most notably aptitude, automatically install Recommended packages.
Suggests: Used for packages that are similar or useful when this package is installed.
Conflicts: Used for packages that will conflict with this package. Both cannot be installed at the same time. If one is being installed, the other will be removed.
Description: Both short and long descriptions are used by package managers. The format is:
Description: <single line synopsis> <extended description over several lines>
Notez qu'il y a un espace devant chaque ligne de la longue description. Plus d'informations sur comment rédiger une bonne description sont disponibles sur http://people.debian.org/~walters/descriptions.html.
Ce fichier fournit les informations sur le droit de copie (copyright). Généralement, l'information au sujet du copyright se trouve dans le fichier COPYING
dans le dossier de la source du programme. Ce fichier devrait inclure des informations telles que le nom de l'auteur et de l'empaqueteur, l'URL d'où vient la source, une ligne de Copyright avec l'année et le détenteur du copyright ainsi que le texte du copyright lui-même. Un exemple serait (NdT : toujours en anglais !) :
This package was debianized by {Your Name} <your email address> {Date} It was downloaded from: {URL of webpage} Upstream Author(s): {Name(s) and email address(es) of author(s)} Copyright: Copyright (C) {Year(s)} by {Author(s)} {Email address(es)} License:
Comme vous pouvez l'imaginer, hello est fourni sous la licence GPL. Dans ce cas, il est plus simple d'insérer le fichier copyright
depuis le paquet Ubuntu :
cp ../../ubuntu/hello-2.1.1/debian/copyright .
Vous devez inclure le copyright complet sauf si c'est la GPL, la LGPL, la licence BSD, la licence Artistique (Artistic License), auquel cas, vous pouvez vous référer au fichier correspondant dans le dossier /usr/share/common-licenses/
.
Notice that the Ubuntu package's
copyright
includes a license statement for
the manual. It is important that all the
files in the source be covered by a license statement.
Le fichier rules
(nom qui signifie « règles ») est un Makefile exécutable qui contient les règles pour la construction du paquet binaire depuis les paquets sources. Pour hello, il sera plus simple d'utiliser le fichier rules
du paquet Ubuntu :
#!/usr/bin/make -f # Sample debian/rules file - for GNU Hello. # Copyright 1994,1995 by Ian Jackson. # I hereby give you perpetual unlimited permission to copy, # modify and relicense this file, provided that you do not remove # my name from the file itself. (I assert my moral right of # paternity under the Copyright, Designs and Patents Act 1988.) # This file may have to be extensively modified package = hello docdir = debian/tmp/usr/share/doc/$(package) CC = gcc CFLAGS = -g -Wall INSTALL_PROGRAM = install ifeq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O2 endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif build: $(checkdir) ./configure --prefix=/usr $(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)" touch build clean: $(checkdir) rm -f build -$(MAKE) -i distclean rm -rf *~ debian/tmp debian/*~ debian/files* debian/substvars binary-indep: checkroot build $(checkdir) # There are no architecture-independent files to be uploaded # generated by this package. If there were any they would be # made here. binary-arch: checkroot build $(checkdir) rm -rf debian/tmp install -d debian/tmp/DEBIAN $(docdir) install -m 755 debian/postinst debian/prerm debian/tmp/DEBIAN $(MAKE) INSTALL_PROGRAM="$(INSTALL_PROGRAM)" \ prefix=$$(pwd)/debian/tmp/usr install cd debian/tmp && mv usr/info usr/man usr/share cp -a NEWS debian/copyright $(docdir) cp -a debian/changelog $(docdir)/changelog.Debian cp -a ChangeLog $(docdir)/changelog cd $(docdir) && gzip -9 changelog changelog.Debian gzip -r9 debian/tmp/usr/share/man gzip -9 debian/tmp/usr/share/info/* dpkg-shlibdeps debian/tmp/usr/bin/hello dpkg-gencontrol -isp chown -R root:root debian/tmp chmod -R u+w,go=rX debian/tmp dpkg --build debian/tmp .. define checkdir test -f src/$(package).c -a -f debian/rules endef binary: binary-indep binary-arch checkroot: $(checkdir) test $$(id -u) = 0 .PHONY: binary binary-arch binary-indep clean checkroot
Let us go through this file in some detail. One of the first parts you will see is the declaration of some variables:
package = hello docdir = debian/tmp/usr/share/doc/$(package) CC = gcc CFLAGS = -g -Wall INSTALL_PROGRAM = install ifeq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O2 endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif
This section sets the CFLAGS for the compiler and also handles the
noopt
and nostrip
DEB_BUILD_OPTIONS for debugging.
Next is the build
rule:
build: $(checkdir) ./configure --prefix=/usr $(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)" touch build
This rule runs ./configure with the proper prefix,
runs make, and creates a build
file that is a timestamp of the
build to prevent erroneous multiple compilations.
The next rule is clean
, which runs make -i distclean
and removes the files that are made during the package building.
clean: $(checkdir) rm -f build -$(MAKE) -i distclean rm -rf *~ debian/tmp debian/*~ debian/files* debian/substvars
Ensuite, nous voyons une règle vide binary-indep
, parce qu'il n'y a pas de fichiers indépendants de l'architecture qui sont crées dans ce paquet.
Il y a, cependant, plusieurs fichiers dépendant de l'architecture, alors binary-arch
est utilisé :
binary-arch: checkroot build $(checkdir) rm -rf debian/tmp install -d debian/tmp/DEBIAN $(docdir) install -m 755 debian/postinst debian/prerm debian/tmp/DEBIAN $(MAKE) INSTALL_PROGRAM="$(INSTALL_PROGRAM)" \ prefix=$$(pwd)/debian/tmp/usr install cd debian/tmp && mv usr/info usr/man usr/share cp -a NEWS debian/copyright $(docdir) cp -a debian/changelog $(docdir)/changelog.Debian cp -a ChangeLog $(docdir)/changelog cd $(docdir) && gzip -9 changelog changelog.Debian gzip -r9 debian/tmp/usr/share/man gzip -9 debian/tmp/usr/share/info/* dpkg-shlibdeps debian/tmp/usr/bin/hello dpkg-gencontrol -isp chown -R root:root debian/tmp chmod -R u+w,go=rX debian/tmp dpkg --build debian/tmp ..
Premièrement, notez que cette règle appelle la règle checkroot
afin de s'assurer que le paquet est construit en tant que superutilisateur et appelle la règle build
pour compiler la source. Les fichiers debian/tmp/DEBIAN
et debian/tmp/usr/share/doc/hello
sont ensuite crées et le fichier postinst
et les scripts prerm>
sont installés dans debian/tmp/DEBIAN
. Ensuite make install est lancé avec un préfixe qui installe dans le répertoire debian/tmp/usr
. Ensuite, les fichiers de documentation (NEWS, ChangeLog et le changelog Debian) sont comprimés par gzip et installés. dpkg-shlibdeps est invoqué pour trouver les dépendances de librairies partagées de l'exécutable hello, et stocke la liste dans le fichier debian/substvars
pour la variable ${shlibs:Depends} dans control
. Ensuite, dpkg-gencontrol est lancé pour créer un fichier de contrôle pour le paquet binaire et réalise les remplacements créés par dpkg-shlibdeps. Finalement, après avoir défini les permissions de debian/tmp
, dpkg --build est lancé pour construire le paquet binaire .deb et le déposer dans le dossier parent.
Les fichiers postinst
(en français : post-installation) et prerm
(en français : pré-effacement) sont des exemples de scripts de mainteneur. Ce sont des scripts shell qui sont exécutés après l'installation et avant l'effacement, respectivement, du paquet. Dans le cas du paquet hello Ubuntu, ils sont utilisés pour installer (et effacer) le fichiers d'information. Continuez et copiez-les vers le répertoire courant debian
.
cp ../../ubuntu/hello-2.1.1/debian/postinst . cp ../../ubuntu/hello-2.1.1/debian/prerm .
Maintenant que nous avons parcouru les fichiers dans le répertoire debian
pour hello en détail, nous pouvons construire les paquets source (et binaire). Déplaçons-nous d'abord à la racine de la source extraite.
cd ..
Now we build the source package using dpkg-buildpackage:
dpkg-buildpackage -S -rfakeroot
The -S flag tells
dpkg-buildpackage to build a source
package, and the -r flag tells it to use
fakeroot to allow us to have fake
root privileges when making the package.
dpkg-buildpackage will take the
.orig.tar.gz
file and produce a
.diff.gz
(the difference between
the original tarball from the author and the directory we
have created, debian/
and its contents)
and a .dsc
file that has the
description and md5sums for the source package. The
.dsc
and
*_source.changes
(used for uploading the
source package) files are signed using your GPG key. If you do not
have a GPG key, add the -us -uc flags to the invocation of
dpkg-buildpackage. Your package
will build but it cannot be uploaded until it is
signed.
In addition to the source package, we can also build the binary package with pbuilder:
sudo pbuilder build ../*.dsc
Using pbuilder to build the
binary packages is very important. It ensures that the build
dependencies are correct, because
pbuilder provides only a minimal
environment, so all the build-time dependencies are
determined by the control
file.
We can check the source package for common mistakes using lintian:
cd .. lintian -i *.dsc