cosmetic changes
[packaging-tutorial.git] / packaging-tutorial.tex
1 \documentclass[10pt,final]{beamer}
2 \mode<presentation>
3 \usetheme{debian}
4 \usepackage{debiantutorial}
5
6 \hypersetup{pdftitle={Debian Packaging Tutorial},bookmarks}
7 \title{Debian Packaging Tutorial}
8 \author[]{Lucas Nussbaum\\{\small\texttt{lucas@debian.org}}}
9 \date{\footnotesize version 0.1 - 2011-05-23}
10
11 \begin{document}
12
13 \frame{\titlepage}
14
15 \begin{frame}{About this tutorial}
16   \begin{itemize}
17   \item Goal: \textbf{tell you what you really need to know about Debian packaging}
18     \begin{itemize}
19       \hbr
20     \item Modify existing packages
21       \hbr
22     \item Create your own packages
23             \hbr
24     \item Interact with the Debian community
25       \hbr
26     \item Become a Debian power-user
27     \end{itemize}
28     \br
29   \item Covers the most important points, but is not complete
30     \begin{itemize}
31     \item You will need to read more documentation
32     \end{itemize}
33     \br
34   \item Most of the content also applies to Debian derivatives distributions
35     \begin{itemize}
36       \hbr
37     \item That includes Ubuntu
38     \end{itemize}
39   \end{itemize}
40 \end{frame}
41
42 \begin{frame}{Outline}
43   \tableofcontents[hideallsubsections]
44 \end{frame}
45
46 \section{Introduction}
47
48 \subsection{Debian}
49
50 \begin{frame}{Debian}
51         \begin{itemize}
52                 \item \textbf{GNU/Linux distribution}
53                         \br
54                 \item 1st major distro developed ``openly in the spirit of GNU''
55                         \br
56                 \item \textbf{Non-commercial}, built collaboratively by over 1,000 volunteers
57                         \br
58                 \item 3 main features:
59                         \begin{itemize}
60                                 \item \textbf{Quality} -- culture of technical excellence\\
61                                         {\small\sl We release when it's ready}
62                                         \hbr
63                                 \item \textbf{Freedom} -- devs and users bound by the \textsl{Social Contract}\\
64                                         Promoting the culture of Free Software since 1993
65                                         \hbr
66                                 \item \textbf{Independence} -- no (single) company babysitting Debian\\
67                                         And open decision-making process (\textsl{do-ocracy} + \textsl{democracy})
68                         \end{itemize}
69                         \br
70                 \item \textbf{Amateur} in the best sense: done for the love of it
71         \end{itemize}
72 \end{frame}
73
74 \subsection{Debian packages}
75 \begin{frame}{Debian packages}
76 \begin{itemize}
77 \item \textbf{.deb} files (binary packages)
78         \br
79 \item A very powerful and convenient way to distribute software to users
80         \br
81 \item One of the two most common packages format (with RPM)
82         \br
83 \item Universal:
84         \begin{itemize}
85                 \item 30,000 binary packages in Debian\\
86                         $\rightarrow$ most of the available free software is packaged in Debian!
87                         \hbr
88                 \item For 12 ports (architectures), including 2 non-Linux (Hurd; KFreeBSD)
89                         \hbr
90                 \item Also used by 120 Debian derivatives distributions
91         \end{itemize}
92 \end{itemize}
93 \end{frame}
94
95
96 \subsection{The Deb package format}
97
98 \begin{frame}[fragile]{The Deb package format}
99   \begin{itemize}
100   \item \texttt{.deb} file: an \texttt{ar} archive
101     \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
102 $ ar tv wget_1.12-2.1_i386.deb
103 rw-r--r-- 0/0      4 Sep  5 15:43 2010 debian-binary
104 rw-r--r-- 0/0   2403 Sep  5 15:43 2010 control.tar.gz
105 rw-r--r-- 0/0 751613 Sep  5 15:43 2010 data.tar.gz
106     \end{lstlisting} % $
107     \begin{itemize}
108     \item \texttt{debian-binary}: version of the deb file format, \texttt{"2.0\textbackslash{}n"}
109     \item \texttt{control.tar.gz}: metadata about the package\\
110       {\small \texttt{\textbf{control}, md5sums, (pre|post)(rm|inst), triggers, shlibs}, \ldots}
111     \item \texttt{data.tar.gz}: data files of the package
112     \end{itemize}
113     \br
114   \item You could create your \texttt{.deb} files manually\\
115     {\footnotesize \url{http://tldp.org/HOWTO/html\_single/Debian-Binary-Package-Building-HOWTO/}}
116     \br
117   \item But most people don't do it that way
118   \end{itemize}
119   \br
120   \centerline{\textbf{This tutorial: create Debian packages, the Debian way}}
121 \end{frame}
122
123 \subsection{Tools you will need}
124 \begin{frame}{Tools you will need}
125   \begin{itemize}
126   \item A Debian (or Ubuntu) system (with root access)
127     \br
128   \item Some packages:
129     \begin{itemize}
130     \item \textbf{build-essential}: has dependencies on the packages that will
131       be assumed to be available on the developers' machine (no need to specify
132       them in the \texttt{Build-Depends:} control field of your package)
133       \begin{itemize}
134       \item includes a dependency on \textbf{dpkg-dev}, which contains basic
135         Debian-specific tools to create packages
136       \end{itemize}
137       \hbr
138     \item \textbf{devscripts}: contains many useful scripts for Debian
139       maintainers
140     \end{itemize}
141   \end{itemize}
142
143   \br
144   Many other tools will also be mentioned later, such as \textbf{debhelper},
145   \textbf{cdbs}, \textbf{quilt}, \textbf{pbuilder}, \textbf{sbuild},
146   \textbf{lintian}, \textbf{svn-buildpackage}, \textbf{git-buildpackage},
147   \ldots\\
148   Install them when you need them.
149 \end{frame}
150
151 \subsection{General packaging workflow}
152 \begin{frame}{General packaging workflow}
153   \begin{center}
154     \begin{tikzpicture}[
155       node1/.style={shape=rectangle,draw=rouge,fill=debianbackgroundblue,thick},
156       arr/.style={very thick}, command/.style={text=rouge,font=\ttfamily}, ]
157       
158       \node[node1] (www) at (0, 0) {Web};
159       \node[node1] (us) at (2.5, 0) {upstream source};
160       \node[node1] (da) at (-2.5, 0) {Debian mirror};
161       \node[node1] (sp) at (0, -2) {source package};
162       \draw[arr,<-,dashed,thick] (sp) -- (2.5,-2) node[right=0cm,text width=2.98cm,text centered,font=\small\sl] {where most of the manual work is done};
163       \node[node1] (bin) at (0, -4) {one or several binary packages};
164       \draw[arr,<-,dashed,thick] (bin) -- (3.5,-4) node[right,text centered,font=\small\ttfamily\sl] {.deb\normalfont};
165       \draw[arr,->] (us) -- (sp) node[pos=0.5,right,command] {dh\_make};
166       \draw[arr,->] (da) -- (sp) node[pos=0.5,left,command] {apt-get source};
167       \draw[arr,->] (www) -- (sp) node[pos=0.5,left,command] {dget};
168       \draw[arr,->] (sp) -- (bin) node[pos=0.5,right,text width=6cm] {\textttc{debuild} (build and test with \textttc{lintian}) or \textttc{dpkg-buildpackage}};
169       \draw[arr,->] (bin) -- (1,-6) node[pos=0.5,right] {install (\textttc{debi})};
170       % \draw[arr,->] (bin) -- (-1,-6) node[pos=0.5,left] {upload (\textttc{dput})};
171       \draw[transparent] (bin) -- (-1,-6) node[pos=0.5,left,opaque] {upload (\textttc{dput})};
172       \draw[arr,->,rounded corners] (bin) -- (-1,-6) -- (-4.5,-6) -- (-4.5,0) -- (da);
173       \useasboundingbox (-4,-6) rectangle (6,0); % hack hack hack
174     \end{tikzpicture}
175   \end{center}
176 \end{frame}
177
178 \subsection{Rebuilding dash}
179 \begin{frame}{Example: rebuilding dash}
180 \begin{enumerate}
181 \item Install build-essential, devscripts and debhelper (needed to build dash)\\
182   {\texttt{apt-get install build-essential devscripts debhelper}}
183   \hbr
184 \item Create a working directory, and get in it:\\
185  \texttt{mkdir /tmp/debian-tutorial ; cd /tmp/debian-tutorial}
186   \hbr
187 \item Grab the \texttt{dash} source package\\
188   \texttt{apt-get source dash}\\ 
189   {\small (This needs you to have \texttt{deb-src} lines in your \texttt{/etc/apt/sources.list})}
190   \hbr
191 \item Build the package\\
192   {\texttt{cd dash-*\\ debuild -us -uc}}
193
194   \hbr
195 \item Check that it worked
196         \begin{itemize}
197                 \item  There are some new \texttt{.deb} files in the parent directory
198         \end{itemize}
199     \hbr
200 \item Look at the \texttt{debian/} directory
201         \begin{itemize}
202                 \item That's where the packaging work is done
203         \end{itemize}
204 \end{enumerate}
205 \end{frame}
206
207 \section{Creating source packages}
208 \subsection{Source packages basics}
209 \begin{frame}{Source package}
210   \begin{itemize}
211   \item One source package can generate several binary packages\\
212     {\small e.g the \texttt{\bfseries libtar} source generates the
213       \texttt{\bfseries libtar0} and \texttt{\bfseries libtar-dev} binary
214       packages} \hbr
215   \item Two kinds of packages: (if unsure, use non-native)
216     \begin{itemize}
217       \small
218     \item Native packages: normally for Debian specific software (\textsl{dpkg}, \textsl{apt})
219     \item Non-native packages: software developed outside Debian
220     \end{itemize}
221     \hbr
222   \item Main file: \texttt{.dsc} (meta-data)
223     \hbr
224   \item Other files depending on the version of the source format
225     \begin{itemize}
226     \item 1.0 -- native: \texttt{package\_version.tar.gz}
227       \hbr
228     \item 1.0 -- non-native:
229       \begin{itemize}
230       \item \texttt{pkg\_ver.orig.tar.gz} : upstream source
231       \item \texttt{pkg\_debver.diff.gz} : patch to add Debian-specific changes
232       \end{itemize}
233       \hbr
234     \item 3.0 (quilt):
235       \begin{itemize}
236       \item \texttt{pkg\_ver.orig.tar.gz} : upstream source
237       \item \texttt{pkg\_debver.debian.tar.gz} : tarball with the Debian changes
238       \end{itemize}
239     \end{itemize}
240   \end{itemize}
241   \br
242   (See \texttt{dpkg-source(1)} for exact details)
243 \end{frame}
244
245 \begin{frame}[fragile]{Source package example (wget\_1.12-2.1.dsc)}
246   \begin{lstlisting}[basicstyle=\ttfamily\small]
247 Format: 3.0 (quilt)
248 Source: wget
249 Binary: wget
250 Architecture: any
251 Version: 1.12-2.1
252 Maintainer: Noel Kothe <noel@debian.org>
253 Homepage: http://www.gnu.org/software/wget/
254 Standards-Version: 3.8.4
255 Build-Depends: debhelper (>> 5.0.0), gettext, texinfo,
256  libssl-dev (>= 0.9.8), dpatch, info2man
257 Checksums-Sha1: 
258  50d4ed2441e67[..]1ee0e94248 2464747 wget_1.12.orig.tar.gz
259  d4c1c8bbe431d[..]dd7cef3611 48308 wget_1.12-2.1.debian.tar.gz
260 Checksums-Sha256: 
261  7578ed0974e12[..]dcba65b572 2464747 wget_1.12.orig.tar.gz
262  1e9b0c4c00eae[..]89c402ad78 48308 wget_1.12-2.1.debian.tar.gz
263 Files: 
264  141461b9c04e4[..]9d1f2abf83 2464747 wget_1.12.orig.tar.gz
265  e93123c934e3c[..]2f380278c2 48308 wget_1.12-2.1.debian.tar.gz
266 \end{lstlisting}
267 \end{frame}
268
269 \subsection{Retrieving source packages}
270 \begin{frame}{Retrieving an existing source package}
271   \begin{itemize}
272   \item From the Debian archive:
273     \begin{itemize}
274     \item \texttt{apt-get source \textsl{package}}
275     \item \texttt{apt-get source \textsl{package=version}}
276     \item \texttt{apt-get source \textsl{package/release}}
277     \end{itemize}
278     (You need \texttt{deb-src} lines in \texttt{sources.list})
279     \br
280   \item From the Internet:
281     \begin{itemize}
282     \item \texttt{dget \textsl{url-to.dsc}}
283     \item \texttt{dget http://snapshot.debian.org/archive/debian-archive/\\20090802T004153Z/debian/dists/bo/main/source/web/\\
284         wget\_1.4.4-6.dsc}\\ 
285       (\href{http://snapshot.debian.org/}{\ttfamily snapshot.d.o} provides all packages from Debian since 2005)
286     \end{itemize}
287     \br
288   \item From the (declared) version control system:
289     \begin{itemize}
290     \item \texttt{debcheckout \textsl{package}}
291     \end{itemize}
292     \br
293   \item Once downloaded, extract with \texttt{dpkg-source -x \textsl{file.dsc}}
294   \end{itemize}
295 \end{frame}
296
297 \subsection{Creating a basic source package}
298 \begin{frame}{Creating a basic source package}
299   \begin{itemize}
300   \item Download the upstream source\\
301     (\textsl{upstream source} = the one from the software's original developers)
302     \hbr
303   \item Rename to \texttt{<\textsl{source\_package}>\_<\textsl{upstream\_version}>.orig.tar.gz}\\
304     (example: \texttt{simgrid\_3.6.orig.tar.gz})
305     \hbr
306   \item Untar it
307     \hbr
308   \item \texttt{cd \textsl{upstream\_source} \&\& dh\_make} (from the \textbf{dh-make} package)
309     \hbr
310   \item There are some alternatives to \texttt{dh\_make} for specific sets of
311     packages: \textbf{dh-make-perl}, \textbf{dh-make-php}, \ldots \hbr
312   \item \texttt{debian/} directory created, with a lot of files in it
313   \end{itemize}
314 \end{frame}
315
316 \subsection{Files in debian/}
317 \begin{frame}{Files in debian/}
318   All the packaging work should be made by modifying files in \texttt{debian/}
319   \hbr
320   \begin{itemize}
321   \item Main files:
322     \begin{itemize}
323     \item \textbf{control} -- meta-data about the package (dependencies, etc)
324     \item \textbf{rules} -- specifies how to build the package
325     \item \textbf{copyright} -- copyright information for the package
326     \item \textbf{changelog} -- history of the Debian package
327     \end{itemize}
328     \hbr
329   \item Other files:
330     \begin{itemize}
331     \item compat
332     \item watch
333     \item dh\_install* targets\\
334       {\small *.dirs, *.docs, *.manpages, \ldots}
335     \item maintainer scripts\\
336       {\small *.postinst, *.prerm, \ldots}
337     \item source/format
338     \item patches/ -- if you need to modify the upstream sources
339     \end{itemize}
340     \hbr
341   \item Several files use a format based on RFC 822 (mail headers)
342   \end{itemize}
343 \end{frame}
344
345 \begin{frame}[fragile]{debian/changelog}
346   \begin{itemize}
347   \item Lists the Debian packaging changes
348   \item Gives the current version of the package
349   \begin{center}
350     \begin{tikzpicture}
351             \draw (0,0) node[above right] {\large 1.2.1.1-5};
352             \draw [decorate,decoration={brace}] (2,0) -- (1.45,0) node[at start,below,text width=1.6cm,text centered] {\small  Debian revision};
353             \draw [decorate,decoration={brace}] (1.4,0) -- (0,0) node[midway,below,text width=1.6cm,text centered] { \small Upstream version};
354 \end{tikzpicture}
355 \end{center}
356
357
358           %%
359   \item Edited manually or with \texttt{dch}
360   \item Special format to automatically close Debian or Ubuntu bugs\\
361     Debian: \texttt{Closes:~\#595268}; Ubuntu: \texttt{LP:~\#616929}
362   \item Installed as \texttt{/usr/share/doc/\textit{package}/changelog.Debian.gz}
363   \end{itemize}
364   \seprule
365   \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
366 mpich2 (1.2.1.1-5) unstable; urgency=low
367
368   * Use /usr/bin/python instead of /usr/bin/python2.5. Allow
369     to drop dependency on python2.5.  Closes: #595268
370   * Make /usr/bin/mpdroot setuid. This is the default after
371     the installation of mpich2 from source, too. LP: #616929
372     + Add corresponding lintian override.
373
374  -- Lucas Nussbaum <lucas@debian.org>  Wed, 15 Sep 2010 18:13:44 +0200
375 \end{lstlisting}
376 \end{frame}
377
378 \begin{frame}[fragile]{debian/control}
379   \hbr
380   \begin{itemize}
381   \item Package metadata
382     \begin{itemize}
383     \item For the source package itself
384     \item For each binary package built from this source
385     \end{itemize}
386     \hbr
387   \item Package name, section, priority, maintainer, uploaders,
388     build-dependencies, dependencies, description, homepage, \ldots \hbr
389   \item Documentation: Debian Policy chapter 5\\
390     \url{http://www.debian.org/doc/debian-policy/ch-controlfields.html}
391   \end{itemize}
392   \seprule
393 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
394 Source: wget
395 Section: web
396 Priority: important
397 Maintainer: Noel Kothe <noel@debian.org>
398 Build-Depends: debhelper (>> 5.0.0), gettext, texinfo,
399  libssl-dev (>= 0.9.8), dpatch, info2man
400 Standards-Version: 3.8.4
401 Homepage: http://www.gnu.org/software/wget/
402
403 Package: wget
404 Architecture: any
405 Depends: ${shlibs:Depends}, ${misc:Depends}
406 Description: retrieves files from the web
407  Wget is a network utility to retrieve files from the Web
408 \end{lstlisting}
409 \end{frame}
410
411 \begin{frame}{Architecture: all or any}
412   Two kinds of binary packages:
413   \hbr
414   \begin{itemize}
415   \item Packages with different contents on each Debian architecture
416     \begin{itemize}
417     \item Example: C program
418     \item \texttt{Architecture:\ any} in \texttt{debian/control}
419       \begin{itemize}
420       \item Or, if it only works on a subset of architectures:\\
421         \texttt{Architecture:\ amd64 i386 ia64 hurd-i386}
422       \end{itemize}
423     \item buildd.debian.org: builds all the other architectures for you on upload
424     \item Named \texttt{\textsl{package}\_\textsl{version}\_\textsl{architecture}.deb}
425     \end{itemize}
426     \br
427   \item Packages with the same content on all architectures
428     \begin{itemize}
429     \item Example: Perl library
430     \item \texttt{Architecture:\ all} in \texttt{debian/control}
431     \item Named \texttt{\textsl{package}\_\textsl{version}\_\textbf{all}.deb}
432     \end{itemize}
433   \end{itemize}
434   \br
435   A source package can generate a mix of \texttt{Architecture:\ any} and \texttt{Architecture:\ all} binary packages
436 \end{frame}
437
438 \begin{frame}[fragile]{debian/rules}
439   \hbr
440   \begin{itemize}
441   \item Makefile
442     \br
443   \item Interface used to build Debian packages
444     \br
445   \item Documented in Debian Policy, chapter 4.8\\
446     {\small \texttt{http://www.debian.org/doc/debian-policy/ch-source.html\#s-debianrules}}
447     \br
448   \item Five required targets:
449     \begin{itemize}
450     \item \texttt{build}: should perform all the configuration and compilation
451       \hbr
452     \item \texttt{binary, binary-arch, binary-indep}: build the binary packages
453       \begin{itemize}
454       \item \texttt{dpkg-buildpackage} will call \texttt{binary} to build all
455         the packages, or \texttt{binary-arch} to build only the
456         \texttt{Architecture:~any} packages
457       \end{itemize}
458       \hbr
459     \item \texttt{clean}: clean up the source directory
460     \end{itemize}
461   \end{itemize}
462 \end{frame}
463
464 \subsection{Packaging helpers}
465 \begin{frame}{Packaging helpers -- debhelper}
466   \begin{itemize}
467   \item You could write shell code in \texttt{debian/rules} directly
468     \begin{itemize}
469     \item See the \texttt{adduser} package for example
470     \end{itemize}
471     \hbr
472   \item Better practice (used by most packages): use a \textsl{Packaging helper}
473     \hbr
474   \item Most popular one: \textbf{debhelper} (used by 98\% of packages)
475     \hbr
476   \item Goals:
477     \begin{itemize}
478     \item Factor the common tasks in standard tools used by all packages
479     \item Fix some packaging bugs once for all packages
480     \end{itemize}
481     {\footnotesize dh\_installdirs, dh\_installchangelogs, dh\_installdocs,
482       dh\_installexamples, dh\_install, dh\_installdebconf, dh\_installinit,
483       dh\_link, dh\_strip, dh\_compress, dh\_fixperms, dh\_perl,
484       dh\_makeshlibs, dh\_installdeb, dh\_shlibdeps, dh\_gencontrol,
485       dh\_md5sums, dh\_builddeb, \ldots}
486     \begin{itemize}
487     \item Called from \texttt{debian/rules}
488     \item Configurable using command parameters or files in \texttt{debian/}
489     \end{itemize}
490     {\footnotesize \ttfamily dirs, \textsl{package}.docs, \textsl{package}.examples,
491       \textsl{package}.install, \textsl{package}.manpages, \ldots} \hbr
492   \item Third-party helpers for sets of packages: \textbf{python-support},
493     \textbf{dh\_ocaml}, \ldots \hbr
494   \item Gotcha: \texttt{debian/compat}: Debhelper compatibility version (use "7")
495   \end{itemize}
496 \end{frame}
497
498 \begin{frame}[fragile]{debian/rules using debhelper (1/2)}
499   \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
500 #!/usr/bin/make -f
501
502 # Uncomment this to turn on verbose mode.
503 #export DH_VERBOSE=1
504
505 build: 
506         $(MAKE)
507         #docbook-to-man debian/packagename.sgml > packagename.1
508
509 clean: 
510         dh_testdir
511         dh_testroot
512         rm -f build-stamp configure-stamp
513         $(MAKE) clean
514         dh_clean 
515
516 install: build
517         dh_testdir
518         dh_testroot
519         dh_clean -k 
520         dh_installdirs
521         # Add here commands to install the package into debian/packagename.
522         $(MAKE) DESTDIR=$(CURDIR)/debian/packagename install
523 \end{lstlisting}
524 \end{frame}
525
526 \begin{frame}[fragile]{debian/rules using debhelper (2/2)}
527   \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
528
529 # Build architecture-independent files here.
530 binary-indep: build install
531
532 # Build architecture-dependent files here.
533 binary-arch: build install
534         dh_testdir
535         dh_testroot
536         dh_installchangelogs 
537         dh_installdocs
538         dh_installexamples
539         dh_install
540         dh_installman
541         dh_link
542         dh_strip
543         dh_compress
544         dh_fixperms
545         dh_installdeb
546         dh_shlibdeps
547         dh_gencontrol
548         dh_md5sums
549         dh_builddeb
550
551 binary: binary-indep binary-arch
552 .PHONY: build clean binary-indep binary-arch binary install configure
553 \end{lstlisting}
554 \end{frame}
555
556 \begin{frame}[fragile]{CDBS}
557   \hbr
558   \begin{itemize}
559   \item With debhelper, still a lot of redundancy between packages
560     \hbr
561   \item Second-level helpers that factor common functionality
562     \begin{itemize}
563     \item Building with \texttt{./configure \&\& make \&\& make install} or CMake
564     \item Support for Perl, Python, Ruby, GNOME, KDE, Java, Haskell, \ldots
565     \end{itemize}
566     \hbr
567   \item CDBS:
568     \begin{itemize}
569     \item Introduced in 2005, based on advanced \textsl{GNU make} magic
570     \item Documentation: \texttt{/usr/share/doc/cdbs/}
571     \item But some people hate it:
572       \begin{itemize}
573       \item Sometimes difficult to customize package builds:\\
574         "\textsl{twisty maze of makefiles and environment variables}"
575       \item Slower than plain debhelper (many useless calls to \texttt{dh\_*})
576       \end{itemize}
577     \end{itemize}
578   \end{itemize}
579   \seprule
580       \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
581 #!/usr/bin/make -f
582 include /usr/share/cdbs/1/rules/debhelper.mk
583 include /usr/share/cdbs/1/class/autotools.mk
584
585 # add an action after the build
586 build/mypackage::
587     /bin/bash debian/scripts/foo.sh
588       \end{lstlisting}
589 \end{frame}
590
591 \begin{frame}[fragile]{Dh (aka Debhelper 7, or dh7)}
592   \begin{itemize}
593   \item Introduced in 2008 as a \textsl{CDBS killer}
594     \hbr
595   \item \textbf{dh} command that calls \texttt{dh\_*}
596     \hbr
597   \item Simple \textsl{debian/rules}, listing only overrides
598     \hbr
599   \item Easier to customize than CDBS
600     \hbr
601   \item Doc: manpages (\texttt{debhelper(7)}, \texttt{dh(1)}) + slides from DebConf9 talk\\
602     \url{http://kitenet.net/~joey/talks/debhelper/debhelper-slides.pdf}
603   \end{itemize}
604   \seprule
605     \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
606 #!/usr/bin/make -f
607 %:
608     dh $@
609
610 override_dh_auto_configure:
611      dh_auto_configure -- --with-kitchen-sink
612
613 override_dh_auto_build:
614      make world
615
616     \end{lstlisting}%$
617 \end{frame}
618
619 \begin{frame}{Classic debhelper vs CDBS vs dh}
620   \hbr
621   \begin{itemize}
622   \item Mind shares:\\
623     Classic debhelper: 41\% \hskip 1em CDBS: 23\% \hskip 1em  dh: 34\%
624     \hbr
625   \item Which one should I learn?
626     \begin{itemize}
627     \item Probably a bit of all of them
628     \item You need to know debhelper to use dh and CDBS
629     \item You might have to modify CDBS packages
630     \end{itemize}
631     \hbr
632   \item Which one should I use for a new package?
633     \begin{itemize}
634     \item \textbf{dh} (only solution with an increasing mind share)
635     \end{itemize}
636   \end{itemize}
637   
638   \hbr
639   \begin{center}
640     \begin{tikzpicture}
641 \begin{axis}[small,label style={font=\footnotesize},xlabel={\small Time},ylabel={\small Market share (\%)},
642         date coordinates in=x,height=4.85cm,width=9cm,xticklabel={\month/\year},
643              legend style={font=\footnotesize,at={(1.02,1)},anchor=north west},max space between ticks=82,try min ticks=5,ymin=0]
644         \addplot[mark=none,blue,thick,style=densely dotted] table[x=date,y=dh] {cdbs-dh7.txt};
645         \addplot[mark=none,red,thick,style=dashed] table[x=date,y=dh7] {cdbs-dh7.txt};
646         \addplot[mark=none,green,thick] table[x=date,y=cdbs] {cdbs-dh7.txt};
647         \legend{debhelper, dh, CDBS}
648 \end{axis}
649 \end{tikzpicture}
650 \end{center}
651
652 \end{frame}
653
654 \section{Building and testing packages}
655 \subsection{Building packages}
656 \begin{frame}{Building packages}
657   \begin{itemize}
658   \item \textttc{apt-get build-dep mypackage}\\
659     Installs the \textsl{build-dependencies} (for a package in the archive)
660     
661     \br
662   \item \textttc{debuild}: build, test with \texttt{lintian}, sign with GPG
663     \br
664   \item Also possible to call \textttc{dpkg-buildpackage} directly
665     \begin{itemize}
666     \item Usually with \texttt{dpkg-buildpackage -us -uc}
667     \end{itemize}
668     \br
669   \item It is better to build packages in a clean \& minimal environment
670     \begin{itemize}
671     \item \textttc{pbuilder} -- helper to build packages in a \textsl{chroot}\\
672       Good documentation: \url{https://wiki.ubuntu.com/PbuilderHowto}\\
673       (optimization: \textttc{cowbuilder} \textttc{ccache} \textttc{distcc})
674       \hbr
675     \item \textttc{schroot} and \textttc{sbuild}: used on the Debian build daemons\\
676       (not as simple as \texttt{pbuilder}, but allows LVM snapshots\\
677        see: \url{https://help.ubuntu.com/community/SbuildLVMHowto} )
678     \end{itemize}
679     \br
680   \item Generate \texttt{.deb} files and a \texttt{.changes} file
681     \begin{itemize}
682     \item \texttt{.changes}: describes what was built; used to upload the package
683     \end{itemize}
684   \end{itemize}
685 \end{frame}
686 \subsection{Installing and testing packages}
687 \begin{frame}{Installing and testing packages}
688   \begin{itemize}
689   \item Install the package locally: \textttc{debi} (will use \texttt{.changes}
690     to know what to install) \br
691   \item List the content of the package: \texttt{{\color{rouge}debc}
692       ../mypackage<TAB>.changes} \br
693   \item Compare the package with a previous version:\\
694     \texttt{{\color{rouge}debdiff} ../mypackage\_1\_*.changes ../mypackage\_2\_*.changes}\\
695     or to compare the sources:\\
696     \texttt{{\color{rouge}debdiff} ../mypackage\_1\_*.dsc ../mypackage\_2\_*.dsc}\\
697     \br
698   \item Check the package with \texttt{lintian} (static analyzer):\\
699     \texttt{{\color{rouge}lintian} ../mypackage<TAB>.changes}\\
700     \texttt{lintian -i}: gives more information about the errors \br
701   \item Upload the package to Debian (\textttc{dput}) (needs configuration) \br
702   \item Manage a private Debian archive with \textttc{reprepro}\\
703     Documentation: \url{http://mirrorer.alioth.debian.org/}
704   \end{itemize}
705 \end{frame}
706 \section{Practical session 1: modifying the grep package}
707 \begin{frame}{Practical session 1: modifying the grep package}
708   \begin{enumerate}
709   \item Go to \url{http://ftp.debian.org/debian/pool/main/g/grep/} and
710     download version 2.6.3-3 of the package
711   \item Look at the files in \texttt{debian/}.
712     \begin{itemize}
713     \item               How many binary packages are generated by this source package?
714     \item               Which packaging helper does this package use?
715     \end{itemize}
716     \hbr
717   \item Build the package
718     \hbr
719   \item We are now going to modify the package. Add a changelog entry and increase the version number.
720     \hbr
721   \item Now disable perl-regexp support (it is a \texttt{./configure} option)
722     \hbr
723   \item Rebuild the package
724     \hbr
725   \item Compare the original and the new package with debdiff
726     \hbr
727   \item Install the newly built package
728     \hbr
729   \item Cry if you messed up ;)
730   \end{enumerate}
731 \end{frame}
732
733 \section{Advanced packaging topics}
734 \subsection{debian/copyright}
735 \begin{frame}[fragile]{debian/copyright}
736   \hbr
737   \begin{itemize}
738   \item Copyright and license information for the source and the packaging
739   \item Traditionally written as a text file
740   \item New machine-readable format: \url{http://dep.debian.net/deps/dep5/}
741   \end{itemize}
742   \seprule
743   \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
744 Format: <VERSIONED_FORMAT_URL>
745 Upstream-Name: X Solitaire
746 Source: ftp://ftp.example.com/pub/games
747
748 Files: *
749 Copyright: Copyright 1998 John Doe <jdoe@example.com>
750 License: GPL-2+
751  This program is free software; you can redistribute it
752  [...]
753  .
754  On Debian systems, the full text of the GNU General Public
755  License version 2 can be found in the file
756  `/usr/share/common-licenses/GPL-2'.
757
758 Files: debian/*
759 Copyright: Copyright 1998 Jane Smith <jsmith@example.net>
760 License:
761  [LICENSE TEXT]
762 \end{lstlisting}
763 \end{frame}
764
765
766
767 \subsection{Modifying the upstream source}
768 \begin{frame}{Modifying the upstream source}
769   Often needed:
770   \begin{itemize}
771   \item Fix bugs or add customizations that are specific to Debian
772     \hbr
773   \item Backport fixes from a newer upstream release
774   \end{itemize}
775   \br
776   Several methods to do it:
777   \begin{itemize}
778   \item Modifying the files directly
779     \begin{itemize}
780     \item Simple
781     \item But no way to track and document the changes
782     \end{itemize}
783     \hbr
784   \item Using patch systems
785     \begin{itemize}
786     \item Eases contributing your changes to upstream
787     \item Helps sharing the fixes with derivatives
788     \item Gives more exposure to the changes\\
789       \url{http://patch-tracker.debian.org/}
790     \end{itemize}
791   \end{itemize}
792 \end{frame}
793
794 \begin{frame}{Patch systems}
795   \begin{itemize}
796   \item Principle: changes are stored as patches in \texttt{debian/patches/}
797     \br
798   \item Applied and unapplied during build
799     \br
800   \item Past: several implementations -- \textsl{simple-patchsys} (\textsl{cdbs}),
801     \textsl{dpatch}, \textbf{\textsl{quilt}}
802     \begin{itemize}
803   \item Each supports two \texttt{debian/rules} targets:
804     \begin{itemize}
805     \item \texttt{debian/rules patch}: apply all patches
806     \item \texttt{debian/rules unpatch}: de-apply all patches
807     \end{itemize}
808           \hbr
809   \item More documentation: \url{http://wiki.debian.org/debian/patches}
810   \end{itemize}
811   \br
812   \item \textbf{New source package format with built-in patch system: 3.0 (quilt)}
813   \begin{itemize}
814   \item Recommended solution
815           \hbr
816   \item You need to learn \textsl{quilt}\\
817     \url{http://pkg-perl.alioth.debian.org/howto/quilt.html}
818     
819   \end{itemize}
820   \end{itemize}
821 \end{frame}
822
823 \begin{frame}[fragile]{Documentation of patches}
824   \begin{itemize}
825           \item Standard headers at the beginning of the patch
826     \hbr
827   \item Documented in DEP-3 - Patch Tagging Guidelines\\
828     \url{http://dep.debian.net/deps/dep3/}
829   \end{itemize}
830 \begin{itemize}
831 \item All patches are published on \url{http://patch-tracker.debian.org/}
832 \end{itemize}
833 \seprule
834   \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
835 Description: Fix widget frobnication speeds
836  Frobnicating widgets too quickly tended to cause explosions.
837 Forwarded: http://lists.example.com/2010/03/1234.html
838 Author: John Doe <johndoe-guest@users.alioth.debian.org>
839 Applied-Upstream: 1.2, http://bzr.foo.com/frobnicator/revision/123
840 Last-Update: 2010-03-29
841
842 --- a/src/widgets.c
843 +++ b/src/widgets.c
844 @@ -101,9 +101,6 @@ struct {
845 \end{lstlisting}
846 \end{frame}
847
848 \subsection{Doing things during installation and removal}
849 \begin{frame}{Doing things during installation and removal}
850   \begin{itemize}
851   \item Decompressing the package is sometimes not enough
852     \hbr
853   \item Create/remove system users, start/stop services, manage \textsl{alternatives}
854     \hbr
855   \item Done in \textsl{maintainer scripts}\\
856     \texttt{preinst, postinst, prerm, postrm}
857     \begin{itemize}
858             \item  Snippets for common actions can be generated by debhelper
859     \end{itemize}
860     \hbr
861   \item Documentation:
862     \begin{itemize}
863     \item Debian Policy Manual, chapter 6\\
864       {\footnotesize \url{http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html}}
865       
866       \hbr
867     \item Debian Developer's Reference, chapter 6.4\\
868       {\scriptsize \url{http://www.debian.org/doc/developers-reference/best-pkging-practices.html}}
869       \hbr
870     \item {\footnotesize \url{http://people.debian.org/~srivasta/MaintainerScripts.html}}
871     \end{itemize}
872     \br
873   \item Prompting the user
874     \begin{itemize}
875     \item Must be done with \textbf{debconf}
876       \hbr
877     \item Documentation: \texttt{debconf-devel(7)} (\texttt{debconf-doc} package)
878     \end{itemize}
879   \end{itemize}
880 \end{frame}
881
882 \begin{frame}[fragile]{Monitoring upstream versions}
883   \begin{itemize}
884   \item Specify where to look in \texttt{debian/watch} (see \texttt{uscan(1)})
885     \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
886 version=3
887
888 http://tmrc.mit.edu/mirror/twisted/Twisted/(\d\.\d)/ \
889   Twisted-([\d\.]*)\.tar\.bz2
890     \end{lstlisting}
891     \br
892   \item Debian infrastructure that makes use of \texttt{debian/watch}:\\
893     \textbf{Debian External Health Status}\\
894     \url{http://dehs.alioth.debian.org/}
895     \br
896   \item Maintainer warned by emails sent to the Package Tracking System\\
897     \url{http://packages.qa.debian.org/}
898     \br
899   \item \texttt{uscan}: run a manual check
900     \br
901   \item \texttt{uupdate}: try to update your package to the latest upstream version
902   \end{itemize}
903 \end{frame}
904
905 \subsection{Packaging with a VCS (SVN, Git \& friends)}
906 \begin{frame}[fragile]{Packaging with a VCS (SVN, Git, etc.)}
907   \begin{itemize}
908   \item Several tools to help manage branches and tags for your packaging work:\\
909     \texttt{svn-buildpackage}, \texttt{git-buildpackage}
910     \hbr
911   \item Example: \texttt{git-buildpackage}
912     \begin{itemize}
913     \item \texttt{upstream} branch to track upstream with \texttt{upstream/\textsl{version}} tags
914     \item \texttt{master} branch tracks the Debian package
915     \item \texttt{debian/\textsl{version}} tags for each upload
916     \item \texttt{pristine-tar} branch to be able to rebuild the upstream tarball
917     \end{itemize}
918     \hbr
919   \item \texttt{Vcs-*} fields in \texttt{debian/control} to locate the repository
920           \begin{itemize}
921                 \item \url{http://wiki.debian.org/Alioth/Git}
922                 \item \url{http://wiki.debian.org/Alioth/Svn}
923         \end{itemize}
924 \end{itemize}
925   \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
926 Vcs-Browser: http://git.debian.org/?p=devscripts/devscripts.git
927 Vcs-Git: git://git.debian.org/devscripts/devscripts.git
928   \end{lstlisting}
929   \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
930 Vcs-Browser: http://svn.debian.org/viewsvn/pkg-perl/trunk/libwww-perl/
931 Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libwww-perl
932   \end{lstlisting}
933   \begin{itemize}
934   \item VCS-agnostic interface: \texttt{debcheckout}, \texttt{debcommit},
935     \texttt{debrelease}\\
936     \begin{itemize}
937             \item     \texttt{debcheckout grep} $\rightarrow$ checks out the source package
938     from Git
939     \end{itemize}
940 \end{itemize}
941 \end{frame}
942
943 \section{Maintaining packages in Debian}
944 \subsection{Several ways to contribute to Debian}
945 \begin{frame}{Several ways to contribute to Debian}
946   \begin{itemize}
947   \item \textbf{Worst} way to contribute:
948     \begin{enumerate}
949     \item Package your own application
950     \item Get it into Debian
951     \item Disappear
952     \end{enumerate}
953     \br
954   \item Adopt existing unmaintained packages (\textsl{orphaned packages})
955     \begin{itemize}
956     \item Many unmaintained packages in Debian
957     \item Including some that you use daily!
958     \end{itemize}
959     \br
960   \item Get involved in packaging teams
961     \begin{itemize}
962     \item Many teams that focus on set of packages, and need help
963     \item List available at \url{http://wiki.debian.org/Teams}
964     \item An excellent way to learn from more experienced contributors
965     \end{itemize}
966     \br
967   \item Bring new software to Debian
968     \begin{itemize}
969     \item Only if it's interesting/useful enough, please
970     \item Are there alternatives already packaged in Debian?
971     \end{itemize}
972   \end{itemize}
973 \end{frame}
974
975 \subsection{More interested in Ubuntu?}
976 \begin{frame}{More interested in Ubuntu?}
977   \begin{itemize}
978   \item Ubuntu mainly manages the divergence with Debian
979     \br
980   \item No real focus on specific packages\\
981     Instead, collaboration with Debian teams
982     \br
983   \item Usually recommend uploading new packages to Debian first\\
984     \url{https://wiki.ubuntu.com/UbuntuDevelopment/NewPackages}
985     \br
986   \item Possibly a better plan:
987     \begin{itemize}
988     \item Get involved in a Debian team and act as a bridge with Ubuntu
989       \hbr
990     \item Help reduce divergence, triage bugs in Launchpad
991       \hbr
992     \item Many Debian tools can help:
993       \begin{itemize}
994       \item Ubuntu column on the Developer's packages overview
995       \item Ubuntu box on the Package Tracking System
996       \item Receive launchpad bugmail via the PTS
997       \end{itemize}
998     \end{itemize}
999   \end{itemize}
1000 \end{frame}
1001
1002 \subsection{Adopting orphaned packages}
1003 \begin{frame}{Adopting orphaned packages}
1004   \begin{itemize}
1005   \item Full list: \url{http://www.debian.org/devel/wnpp/}
1006     \hbr
1007   \item Installed on your machine: \texttt{wnpp-alert}
1008     \hbr
1009   \item Different states:
1010     \begin{itemize}
1011     \item \textbf{O}rphaned: the package is unmaintained\\
1012       Feel free to adopt it
1013     \item \textbf{RFA}: \textbf{R}equest \textbf{F}or \textbf{A}dopter\\
1014       Maintainer looking for adopter, but continues work in the meantime\\
1015       Feel free to adopt it. A mail to the current maintainer is polite
1016     \item \textbf{ITA}: \textbf{I}ntent \textbf{T}o \textbf{A}dopt\\
1017       Someone intends to adopt the package\\
1018       You could propose your help!
1019     \item \textbf{RFH}: \textbf{R}equest \textbf{F}or \textbf{H}elp\\
1020       The maintainer is looking for help
1021     \end{itemize}
1022     \hbr
1023   \item Some unmaintained packages not detected \arr not orphaned yet
1024     \hbr
1025   \item When in doubt, ask \texttt{debian-qa@lists.debian.org} \\
1026     or \texttt{\#debian-qa} on \texttt{irc.debian.org}
1027   \end{itemize}
1028 \end{frame}
1029
1030 \subsection{Getting your package in Debian}
1031 \begin{frame}{Getting your package in Debian}
1032 \begin{itemize}
1033 \item You do not need any official status to get your package into Debian
1034         \begin{enumerate}
1035                 \item Prepare a source package
1036                         \hbr
1037                 \item Find a Debian Developer that will sponsor your package
1038         \end{enumerate}
1039 \br
1040 \item Official status (when you are already experienced):
1041         \begin{itemize}
1042                 \item \textbf{Debian Maintainer (DM):}\\
1043                         Permission to upload your own packages\\
1044                         See \url{http://wiki.debian.org/DebianMaintainer}
1045                         \hbr
1046                 \item \textbf{Debian Developer (DD):}\\
1047                         Debian project members; can vote and upload any package
1048         \end{itemize}
1049 \end{itemize}
1050 \end{frame}
1051
1052 \subsection{Where to find help?}
1053 \begin{frame}{Where to find help?}
1054   Help you will need:
1055   \begin{itemize}
1056   \item Advice and answers to your questions, code reviews
1057   \item Sponsorship for your uploads, once your package is ready
1058   \end{itemize}
1059   \br
1060   You can get help from:
1061   \begin{itemize}
1062   \item Other members of a packaging team: the best solution
1063     \begin{itemize}
1064     \item They know the specifics of your package
1065     \item You can become a member of the team
1066     \item See \url{http://wiki.debian.org/Teams}
1067     \end{itemize}
1068     \hbr
1069   \item The Debian Mentors group (if your package doesn't fit in a team)
1070     \begin{itemize}
1071     \item \url{http://wiki.debian.org/DebianMentorsFaq}
1072     \item Mailing list: \url{debian-mentors@lists.debian.org}\\
1073             {\small (also a good way to learn by accident)}
1074     \item IRC: \texttt{\#debian-mentors} on \texttt{irc.debian.org}
1075     \item \url{http://mentors.debian.net/}
1076     \end{itemize}
1077   \end{itemize}
1078 \end{frame}
1079
1080 \subsection{Official documentation}
1081 \begin{frame}{Official documentation}
1082   \begin{itemize}
1083   \item Debian Developers' Corner\\
1084     \url{http://www.debian.org/devel/}\\
1085     {\small Links to many resources about Debian development}
1086     \br
1087   \item Debian New Maintainers' Guide\\
1088     \url{http://www.debian.org/doc/maint-guide/}\\
1089     {\small An introduction to Debian packaging, but could use an update}
1090     \br
1091   \item Debian Developer's Reference\\
1092     \url{http://www.debian.org/doc/developers-reference/}\\
1093     {\small Mostly about Debian procedures, but also some best packaging practices (part 6)}
1094     \br
1095   \item Debian Policy\\
1096     \url{http://www.debian.org/doc/debian-policy/}\\
1097     
1098     {\small \begin{itemize}
1099       \item \small All the requirements that every package must satisfy
1100       \item \small Specific policies for Perl, Java, Python, \ldots
1101       \end{itemize}}
1102     \br
1103     
1104   \item Ubuntu Packaging Guide\\
1105     \url{https://wiki.ubuntu.com/PackagingGuide}
1106   \end{itemize}
1107 \end{frame}
1108
1109 \begin{frame}{Debian dashboards for maintainers}
1110   \begin{itemize}
1111           \item \textbf{Source package centric}: Package Tracking System (PTS)\\
1112     \url{http://packages.qa.debian.org/dpkg}
1113     \br
1114   \item \textbf{Maintainer/team centric}: Developer's Packages Overview (DDPO)\\
1115     \url{http://qa.debian.org/developer.php?login=pkg-ruby-extras-maintainers@lists.alioth.debian.org}
1116   \end{itemize}
1117 \end{frame}
1118
1119 \section{Conclusion}
1120 \subsection{Conclusion}
1121 \begin{frame}{Conclusion}
1122   \begin{itemize}
1123   \item You now have a full overview of Debian packaging
1124     \br
1125   \item But you will need to read more documentation
1126     \br
1127   \item Best practices have evolved over the years
1128     \begin{itemize}
1129     \item If not sure, use the \textbf{dh} packaging helper, and the \textbf{3.0 (quilt)} format
1130     \end{itemize}
1131     \br
1132   \item Things that were not covered in this tutorial:
1133     \begin{itemize}
1134         \item UCF -- manage user changes to configuration files when upgrading
1135                 \hbr
1136         \item dpkg triggers -- group similar maintainer scripts actions together
1137                 \hbr
1138         \item Debian development organization:
1139                 \begin{itemize}
1140                         \item Bug Tracking System (BTS)
1141                         \item Suites: stable, testing, unstable, experimental, security, *-updates, backports, \ldots
1142                         \item Debian Blends -- subsets of Debian targeting specific groups
1143                 \end{itemize}
1144                 \end{itemize}
1145   \end{itemize}
1146   \vfill
1147   \centerline{\large Feedback: \textbf{lucas@debian.org}}
1148 \end{frame}
1149
1150 \subsection{Legal stuff}
1151 \begin{frame}{Legal stuff}
1152
1153   Copyright \copyright 2011 Lucas Nussbaum -- lucas@debian.org
1154   \br
1155
1156   {\small 
1157     \textbf{This document is free software}: you can redistribute it and/or modify
1158     it under either (at your option):
1159     \hbr
1160     \begin{itemize}
1161     \item The terms of the GNU General Public License as published by the Free
1162       Software Foundation, either version 3 of the License, or
1163       (at your option) any later version.\\
1164       \url{http://www.gnu.org/licenses/gpl.html} \br
1165     \item The terms of the Creative Commons Attribution-ShareAlike 3.0 Unported
1166       License.\\ 
1167       \url{http://creativecommons.org/licenses/by-sa/3.0/}
1168     \end{itemize}
1169   }
1170 \end{frame}
1171
1172 \subsection{Latest version \& source code}
1173 \begin{frame}{Latest version \& source code}
1174   \begin{itemize}
1175   \item Latest version:\\
1176     {\footnotesize \url{http://git.debian.org/?p=users/lucas/packaging-tutorial.git;a=blob\_plain;f=packaging-tutorial.pdf;hb=refs/heads/pdf}}
1177   \end{itemize}
1178   
1179   \begin{itemize}
1180   \item Contribute:\\
1181     \texttt{git clone git://git.debian.org/\~{}lucas/packaging-tutorial.git}\\
1182     \hbr
1183     Or over HTTP: \url{http://git.debian.org/?p=users/lucas/packaging-tutorial.git}
1184     \br
1185   \item Feedback: \href{mailto:lucas@debian.org}{\textbf{\texttt{lucas@debian.org}}}
1186   \end{itemize}
1187 \end{frame}
1188
1189 \section{Practical session 2: packaging GNUjump}
1190 \begin{frame}{Practical session 2: packaging GNUjump}
1191 \begin{enumerate}
1192         \item Download GNUjump 1.0.6 from
1193                 \url{http://ftp.gnu.org/gnu/gnujump/1.0.6/gnujump-1.0.6.tar.gz}
1194                 \br
1195         \item Create a Debian package for it
1196                 \begin{itemize}
1197                         \item Install build-dependencies so that you can build the package
1198                         \item Get a basic working package
1199                         \item Finish filling \texttt{debian/control} and other files
1200                 \end{itemize}
1201                 \br
1202         \item Enjoy
1203 \end{enumerate}
1204 \centerline{\includegraphics[width=5cm]{figs/gnujump.png}}
1205 \end{frame}
1206
1207 \section{Practical session 3: packaging a Java library}
1208 \begin{frame}{Practical session 3: packaging a Java library}
1209 \begin{enumerate}
1210         \item Take a quick look at some documentation about Java packaging:\\
1211                 \begin{itemize}
1212                 \item \url{http://wiki.debian.org/Java}
1213       \hbr
1214                 \item \url{http://wiki.debian.org/Java/Packaging}
1215       \hbr
1216                 \item \url{http://www.debian.org/doc/packaging-manuals/java-policy/}
1217       \hbr
1218                 \item \url{http://pkg-java.alioth.debian.org/docs/tutorial.html}
1219       \hbr
1220                 \item Paper and slides from a Debconf10 talk about javahelper:\\
1221                         {\footnotesize
1222                         \url{http://pkg-java.alioth.debian.org/docs/debconf10-javahelper-paper.pdf}\\
1223                         \url{http://pkg-java.alioth.debian.org/docs/debconf10-javahelper-slides.pdf}}
1224                 \end{itemize}
1225                 \br
1226         \item Download IRClib from \url{http://moepii.sourceforge.net/}
1227                 \br
1228         \item Package it
1229 \end{enumerate}
1230 \end{frame}
1231
1232 \backupbegin
1233
1234 \backupend
1235
1236 \end{document}