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