L'intention d'empaqueter.
Bien entendu, nous n'allons pas déposer une requête à Debian. Nous nous contenterons des dépôts sur les serveurs Launchpad et des sources du projet mkd.
Dans l'intention d'empaqueter on suppose, à priori que l'application n'a jamais été empaquetée, elle s'installe très bien avec une procédure par un fichier de commandes 'install.sh' ou avec 'make' dans un répertoire d'installation contenant le fichier 'Makefile'
PGM = mkd
BINDIR = /usr/bin
BINMODE = 755
MAN_FR = mkd_fr.1
MAN_EN = mkd_en.1
CATMANDIR = /var/cache/man/cat1 # ubuntu / debian
CATMANDIR_FR = /var/cache/man/fr.UTF-8/cat1 debian 
MANDIR = /usr/share/man/man1
MANDIR_FR = /usr/share/man/fr.UTF-8/man1
SRCS = mkd.c asm.c cpp.c
HDRS = version.h asm.h cpp.h find.inc.h internationalisation.h find.inc.c \
 basic.inc.c fortran.inc.c pascal.inc.c shell.inc.c tri.inc.c syn-fr.i syn-eng.i
OBJS =
LIBS =
CFLAGS = -O
LDFLAGS =
SPLINTFLAG = -weak
install: $(PGM) $(MAN_EN) $(MAN_FR)
 # install PGM in BINDIR
 -@if [ -d $(BINDIR) ]; then \
 cp -f $(PGM) $(BINDIR)/$(PGM);\
 chmod $(BINMODE) $(BINDIR)/$(PGM);\
 if [ $(BINDIR) != "/bin" ]; then \
 ln -s $(BINDIR)/$(PGM) /bin/$(PGM);\
 fi \
 else \
 echo "couldn't find $(BINDIR)";\
 fi
 ./install_manuals
 ./install_languages
 ./install_icons
 ./install_mime_database
 # End install
$(PGM): $(SRCS) $(HDRS)
 $(CC) $(CFLAGS) -o $(PGM) $(SRCS)
 @#$(CC) $(LDFLAGS) -o $(PGM) $(OBJS) $(LIBS)
 -@strip $(PGM) # clean ASM and LINK reloc.
$(MAN_EN).gz: manuals
 -$(PGM) -Ctw M manuals $(MAN_EN)
 -@gzip $(MAN_EN) # make en manual $(MAN_EN).gz
$(MAN_FR).gz: manuals
 -$(PGM) -Ctw F manuals $(MAN_FR)
 -@gzip $(MAN_FR) # make en manual $(MAN_FR).gz
clean:
 #rm -f $(PGM) $(OBJS) $(MAN)
Pour empaqueter il est nécessaire de disposer d'un fichier 'Makefile' contenant une directive 'clean' et d'une directive d'installation de l'application dans les répertoires usuels (Compilation, manuels, traductions, etc.)L'empaquetage se fera dans le répertoire debian. Le binaire doit se trouver dans "debian/<app>/usr/bin/", et pas dans "/usr/bin/". Pour que ce soit possible il est nécessaire d'introduire une macro $(DESTDIR).
Modifier le Makefile pour l'empaquetage.
BIN = $(DESTDIR)/usr/bin
CATMANDIR = $(DESTDIR)/var/cache/man
ETC = $(DESTDIR)/etc
DOC = $(DESTDIR)/usr/share/doc
ICONS = $(DESTDIR)/usr/share/icons/hicolor
LANG = $(DESTDIR)/usr/share/locale
MAN = $(DESTDIR)/usr/share/man
MIME = $(DESTDIR)/usr/share/mime
PGM = mkd
SRCS = mkd.c asm.c cpp.c
HDRS = version.h asm.h cpp.h find.inc.h internationalisation.h \
 find.inc.c basic.inc.c fortran.inc.c pascal.inc.c shell.inc.c tri.inc.c syn-fr.i syn-eng.i
OBJS =
LIBS =
CFLAGS = -O
LDFLAGS =
SPLINTFLAG = -weak
$(PGM): 
 gcc -c $(CFLAGS) $(SRCS) $(LIBS)
 gcc -o $(LDFLAGS) $(PGM) $(OBJS) $(LIBS)
 chmod 755 $(PGM)
install: $(PGM)
 # create $(DESTDIR), sub-directories, and copy executable in bin directory:
 install -d $(BIN) $(CATMANDIR) $(ETC) $(DOC) $(ICONS) $(LANG) $(MAN) $(MIME)
 install $(PGM) $(BIN)/.
 # install docs: see file ./install_docs
 # install -d $(DOC)/$(PGM)/html
 # install -m644 doc/*.html $(DOC)/$(PGM)/html/.
 # install icons and update cache: see update in post-install package and see ./install_icons.
 install -d $(ICONS)/256x256/apps $(ICONS)/48x48/apps $(ICONS)/32x32/apps $(ICONS)/16x16/apps
 chmod 644 icons/*
 cp -f icons/mkd-256x256.png $(ICONS)/256x256/apps/mkd.png
 cp -f icons/mkd-48x48.png $(ICONS)/48x48/apps/mkd.png
 cp -f icons/mkd-32x32.png $(ICONS)/32x32/apps/mkd.png
 cp -f icons/mkd-16x16.png $(ICONS)/16x16/apps/mkd.png
 if [ -e "/usr/share/icons/hicolor/16x16/apps/mkd.png" ]; \
 then gtk-update-icon-cache -t /usr/share/icons/hicolor; fi
 # install languages: see file ./install_languages.
 # Installs for tests the local languages, 'de', 'es', 'fr', it, ro, etc.:
 install -d $(LANG)/en/LC_MESSAGES $(LANG)/de/LC_MESSAGES $(LANG)/fr/LC_MESSAGES
 chmod 644 lang/*
 cp -f lang/mkd_en.mo $(LANG)/en/LC_MESSAGES/mkd.mo
 cp -f lang/mkd_fr.mo $(LANG)/fr/LC_MESSAGES/mkd.mo
 # install manuals: see file ./install_manuals
 ## install default manual:
 install -D -m644 lang/mkd_en.1.gz $(MAN)/man1/mkd.1.gz
 ## install 'fr' manual:
 if [ -d "/usr/share/man/fr.UTF-8/man1" ]; \
 then \
 install -d $(MAN)/fr.UTF-8/man1;\
 cp -f lang/mkd_fr.1.gz $(MAN)/fr.UTF-8/man1/mkd.1.gz; \
 elif [ -d "/usr/share/man/fr/" ]; \
 then \
 install -d $(MAN)/fr/man1; \
 cp -f lang/mkd_fr.1.gz $(MAN)/fr/man1/mkd.1.gz ; \
 fi
 # install catman only if selected manual exist: see file ./install_catman.
 if [ -e $(MAN)"/man1" ]; then catman -M $(MAN)/man1/mkd.1.gz; fi
 if [ -e $(MAN)"/fr.UTF-8/man1/mkd.1.gz" ]; then catman -M $(MAN)/fr.UTF-8/man1/mkd.1.gz; fi
 if [ -e $(MAN)"/fr/man1/mkd.1.gz" ]; then catman -M $(MAN)/fr/man1/mkd.1.gz ; fi
 # install and update MIME database: see update in post-install packageand see file ./install_mime_database
 install -D -m644 mkdw.xml $(MIME)/packages/mkdw.xml
 if [-e "/usr/share/mime/packages/mkdw.xml" ]; then update-mime-database /usr/share/mime/; fi
 # clean #
 rm -f $(PGM) $(OBJS) $(MAN) *.o
mkd.1: manuals
 if [ -e "/usr/bin/mkd" ]; \
 then \
 mkd -Ct F manuals mkd.1; \
 gzip -cf mkd.1 > lang/mkd_fr.1.gz; \
 mkd -Ctw M manuals mkd.1; \
 gzip -cf mkd.1 > lang/mkd_en.1.gz; \
 rm -f mkd.1; \
 fi
clean:
 rm -f $(PGM) $(OBJS) $(MAN) *.o *.~
Tester la compilation.
 make -d install DESTDIR=../tests
edeulo@jpl-ubuntu-13:~/Packaging/mkd/mkd_12XXXX/mkd-120302-exercice-0$ find tests
tests
tests/usr
tests/usr/share
tests/usr/share/mime
tests/usr/share/mime/packages
tests/usr/share/mime/packages/mkdw.xml
tests/usr/share/doc
tests/usr/share/doc/mkd
tests/usr/share/doc/mkd/html
tests/usr/share/man
tests/usr/share/man/fr.UTF-8
tests/usr/share/man/fr.UTF-8/man1
tests/usr/share/man/fr.UTF-8/man1/mkd.1.gz
tests/usr/share/man/man1
tests/usr/share/man/man1/mkd.1.gz
tests/usr/share/icons
tests/usr/share/icons/hicolor
tests/usr/share/icons/hicolor/256x256
tests/usr/share/icons/hicolor/256x256/apps
tests/usr/share/icons/hicolor/256x256/apps/mkd.png
tests/usr/share/icons/hicolor/16x16
tests/usr/share/icons/hicolor/16x16/apps
tests/usr/share/icons/hicolor/16x16/apps/mkd.png
tests/usr/share/icons/hicolor/32x32
tests/usr/share/icons/hicolor/32x32/apps
tests/usr/share/icons/hicolor/32x32/apps/mkd.png
tests/usr/share/icons/hicolor/48x48
tests/usr/share/icons/hicolor/48x48/apps
tests/usr/share/icons/hicolor/48x48/apps/mkd.png
tests/usr/share/locale
tests/usr/share/locale/fr
tests/usr/share/locale/fr/LC_MESSAGES
tests/usr/share/locale/fr/LC_MESSAGES/mkd.mo
tests/usr/share/locale/en
tests/usr/share/locale/en/LC_MESSAGES
tests/usr/share/locale/en/LC_MESSAGES/mkd.mo
tests/usr/share/locale/de
tests/usr/share/locale/de/LC_MESSAGES
tests/usr/bin
tests/usr/bin/mkd
tests/var
tests/var/cache
tests/var/cache/man
tests/etc
Créer la configuration d'empaquetage.
 dh_make --createorig
Cette commande va créer le répertoire debian et le fichier .orig.tar.xz au dessus du répertoire racine et se traduit par des questions :
 [s/i/m/l/k/n] On peut choisir s, i ou m
edeulo@jpl-ubuntu-13:~/Packaging/mkd/mkd_12XXXX/mkd-120302-exercice-0/mkd-0~120302$ dh_make --createorig
Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch?
 [s/i/m/l/k/n] m
Maintainer name : Edeulo
Email-Address : edeulo@unknown 
Date : Sun, 12 Jan 2014 18:20:02 +0100
Package Name : mkd
Version : 0~120302
License : blank
Type of Package : Multi-Binary
Hit <enter> to confirm: 
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the mkd Makefiles install into $DESTDIR and not in / .
edeulo@jpl-ubuntu-13:~/Packaging/mkd/mkd_12XXXX/mkd-120302-exercice-0/mkd-0~120302/debian$ ls
changelog docs manpage.xml.ex mkd.doc-base.EX postrm.ex README.source
compat init.d.ex menu.ex mkd-doc.docs preinst.ex rules
control manpage.1.ex mkd.cron.d.ex mkd-doc.install prerm.ex source
copyright manpage.sgml.ex mkd.default.ex postinst.ex README.Debian watch.ex
Source: mkd
Section: devel
Priority: extra
Maintainer: Edeulo <edeulo@free.fr>
Build-Depends: debhelper (>= 8.0.0)
Standards-Version: 3.9.4
Homepage: <insert the upstream URL, if relevant>
Package: mkd
Architecture: any
Description: Exercice "Intention d'empaqueter"
 Voir "mkd (extracteur de documents)" sur Wikibooks
 Ce paquet debian Ubuntu est destiné à installer le binaire
Suggests: mkd-doc
Package: mkd-doc
Architecture: all
Description: Exercice "Intention d'empaqueter"
 Voir "mkd (extracteur de documents)" sur Wikibooks
 Ce paquet debian Ubuntu est destiné à présenter la
 documentation commune à tous les paquets binaires
Recommends: mkd
set -e
case "$1" in
 purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
 echo " postrm : update icon cache "
 gtk-update-icon-cache -t /usr/share/icons/hicolor
 echo " postrm : update MIME database "
 update-mime-database /usr/share/mime
 echo "postrm called with unknown argument \`$1'" >&2
 exit 1
esac
exit 0
Empaqueter.
 debuild -i -us -uc -b
En cas d'erreurs la construction sera annulée et la lecture du fichier mkd_0~120302-1_<processeur>.build vous permettra de savoir où et pourquoi la compilation s'est arrêtée.
Dans notre cas, alors que la compilation s'était bien déroulée dans les tests nous obtenons une erreur : 
gcc -o mkd 
gcc: fatal error: no input files
compilation terminated.
make[1]: *** [mkd] Erreur 4
make[1]: quittant le répertoire « /home/edeulo/Packaging/mkd/mkd_12XXXX/mkd-120302-exercice-0/mkd-0~120302 »
dh_auto_build: make -j1 returned exit code 2
make: *** [build] Erreur 2
dpkg-buildpackage: erreur: debian/rules build a produit une erreur de sortie de type 2
Correction de la ligne OBJS
 OBJS = mkd.o asm.o cpp.o
edeulo@jpl-ubuntu-13:~/Packaging/mkd/mkd_12XXXX/mkd-120302-exercice-0$ ls -al
total 252
drwxr-xr-x 4 edeulo edeulo 4096 janv. 13 12:04 .
drwx------ 6 edeulo edeulo 4096 janv. 12 18:00 ..
-rwx--x--x 1 edeulo edeulo 375 mars 12 2013 
drwx------ 6 edeulo edeulo 4096 janv. 13 12:04 
-rw-r--r-- 1 edeulo edeulo 14058 janv. 13 12:04 mkd_0~120302-1_amd64.build
-rw-r--r-- 1 edeulo edeulo 1004 janv. 13 12:04 mkd_0~120302-1_amd64.changes
-rw-r--r-- 1 edeulo edeulo 2748 janv. 13 12:04 
-rw-r--r-- 1 edeulo edeulo 205340 janv. 12 18:20 
-rw-r--r-- 1 edeulo edeulo 2124 janv. 13 12:04 
drwxr-xr-x 5 edeulo edeulo 4096 janv. 12 16:35 
On peut maintenant mettre à jour l'archive d'origine ".tar.xz"
Notes : 
Conclusion "dh_install" n'a pas fonctionné pour le paquet binaire.
Le manuel de dh_install nous apprend que chaque paquet est construit par un fichier "debian/<paquet>.install". Or, si le répertoire debian contient bien un fichier de construction "mkd-doc.install", il manque le fichier de construction binaire "mkd.install" que nous allons créer. "C'est hélas courant avec ces paquets multiples".
Fichier mkd.install :
Fichier à copier du répertoire "debian/tmp" vers le répertoire "debian/mkd"
usr/bin/mkd usr/bin
usr/share/mime/packages/mkdw.xml usr/share/mime/packages
usr/share/man/fr.UTF-8/man1/mkd.1.gz usr/share/man/fr.UTF-8/man1
usr/share/man/man1/mkd.1.gz usr/share/man/man1
usr/share/icons/hicolor/256x256/apps/mkd.png usr/share/icons/hicolor/256x256/apps
usr/share/icons/hicolor/16x16/apps/mkd.png usr/share/icons/hicolor/16x16/apps
usr/share/icons/hicolor/32x32/apps/mkd.png usr/share/icons/hicolor/32x32/apps
usr/share/icons/hicolor/48x48/apps/mkd.png usr/share/icons/hicolor/48x48/apps
usr/share/locale/fr/LC_MESSAGES/mkd.mo usr/share/locale/fr/LC_MESSAGES
usr/share/locale/en/LC_MESSAGES/mkd.mo usr/share/locale/en/LC_MESSAGES
On relance debuild -i -us -uc -b
Cette fois le paquet binaire est complet.
Préparer le paquet pour un dépôt.
Si l'option -sn de "debuild" ne fonctionne pas il faut utiliser l'option -sa et simuler une nouvelle version .orig.tar.xz
Patch (rustine).
La rustine informatique est destinée à corriger les bogues apparus au cours de l'utilisation du logiciel, ou pour ajouter des fonctionnalités particulières. 
"Dans notre cas, à titre expérimental, on peut appliquer des rustine à des fichiers acceptés par le dépôt et qui ont fait apparaître des erreurs de compilation."
Recréer l'environnement de travail.
echo -e '\E['32';'01'm'"click on New Line to 'start' the Konsole"
echo -e '\E['32';'01'm'"click on Ctrl-C to exit"
tput sgr0 # Reset text attributes to normal without clear
read pwd
pwd
echo $pwd
tput sgr0 # Reset text attributes to normal without clear
/usr/bin/konsole background-mode --workdir pwd dir
read
Créer le patch.
Voir le manuel des commandes unix "diff", "patch", "quilt" (ou dquilt)
Créer un patch consiste à faire la différence une "diff" entre un ancien et un nouveau fichier, puis de faire un "patch" (coller une rustine) afin de ne corriger que la partie modifiée pour mettre à jour ou pour être applicable dans d'autres conditions d'utilisation. Ceci évite de recharger tous les fichiers et de figer une application. On garde ainsi une souplesse d'utilisation.
Un patch pourrait par exemple, ne mettre à jour que des langues déjà installées.
Modifier les fichiers "(Makefile)".