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