LaTeX markup: remove unescaped \textbf{} within lstlisting
[packaging-tutorial.git] / packaging-tutorial.tex
1 \documentclass[10pt,final]{beamer}
2 \mode<presentation>
3 \usetheme{debian}
4
5 %Translators:
6 %change debiantutorial to debiantutorial.$lang to use translated file, and
7 %append to this string all commands to load localisation packages, e.g.:
8 %\\usepackage{debiantutorial.fr} \\usepackage[french]{babel} \\frenchsetup{...}
9 \usepackage{debiantutorial}
10
11 \hypersetup{bookmarks}
12 \title{Debian Packaging Tutorial}
13 \author[]{Lucas Nussbaum\\{\small\texttt{lucas@debian.org}}}
14
15 %Translators:
16 %leave \\version unchanged: this will a variable containing the actual version
17 %To translate the date, use \\today or a string containing \\year, \\month, \\day
18 %(numeric values).
19 \date{\footnotesize version 0.6 -- 2012-04-09} % DATE - use debian/rules update-version-date
20
21 \begin{document}
22
23
24 \frame{\titlepage}
25
26 \begin{frame}{About this tutorial}
27   \begin{itemize}
28   \item Goal: \textbf{tell you what you really need to know about Debian packaging}
29     \begin{itemize}
30       \hbr
31     \item Modify existing packages
32       \hbr
33     \item Create your own packages
34             \hbr
35     \item Interact with the Debian community
36       \hbr
37     \item Become a Debian power-user
38     \end{itemize}
39     \br
40   \item Covers the most important points, but is not complete
41     \begin{itemize}
42     \item You will need to read more documentation
43     \end{itemize}
44     \br
45   \item Most of the content also applies to Debian derivative distributions
46     \begin{itemize}
47       \hbr
48     \item That includes Ubuntu
49     \end{itemize}
50   \end{itemize}
51 \end{frame}
52
53 \begin{frame}{Outline}
54   \tableofcontents[hideallsubsections]
55 \end{frame}
56
57 \section{Introduction}
58
59 \subsection{Debian}
60
61 \begin{frame}{Debian}
62         \begin{itemize}
63                 \item \textbf{GNU/Linux distribution}
64                         \br
65                 \item 1st major distro developed ``openly in the spirit of GNU''
66                         \br
67                 \item \textbf{Non-commercial}, built collaboratively by over 1,000 volunteers
68                         \br
69                 \item 3 main features:
70                         \begin{itemize}
71                                 \item \textbf{Quality} -- culture of technical excellence\\
72                                         {\small\sl We release when it's ready}
73                                         \hbr
74                                 \item \textbf{Freedom} -- devs and users bound by the \textsl{Social Contract}\\
75                                         Promoting the culture of Free Software since 1993
76                                         \hbr
77                                 \item \textbf{Independence} -- no (single) company babysitting Debian\\
78                                         And open decision-making process (\textsl{do-ocracy} + \textsl{democracy})
79                         \end{itemize}
80                         \br
81                 \item \textbf{Amateur} in the best sense: done for the love of it
82         \end{itemize}
83 \end{frame}
84
85 \subsection{Debian packages}
86 \begin{frame}{Debian packages}
87 \begin{itemize}
88 \item \textbf{.deb} files (binary packages)
89         \br
90 \item A very powerful and convenient way to distribute software to users
91         \br
92 \item One of the two most common package formats (with RPM)
93         \br
94 \item Universal:
95         \begin{itemize}
96                 \item 30,000 binary packages in Debian\\
97                         $\rightarrow$ most of the available free software is packaged in Debian!
98                         \hbr
99                 \item For 12 ports (architectures), including 2 non-Linux (Hurd; KFreeBSD)
100                         \hbr
101                 \item Also used by 120 Debian derivative distributions
102         \end{itemize}
103 \end{itemize}
104 \end{frame}
105
106
107 \subsection{The Deb package format}
108
109 \begin{frame}[fragile]{The Deb package format}
110   \begin{itemize}
111   \item \texttt{.deb} file: an \texttt{ar} archive
112     \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
113 $ ar tv wget_1.12-2.1_i386.deb
114 rw-r--r-- 0/0      4 Sep  5 15:43 2010 debian-binary
115 rw-r--r-- 0/0   2403 Sep  5 15:43 2010 control.tar.gz
116 rw-r--r-- 0/0 751613 Sep  5 15:43 2010 data.tar.gz
117     \end{lstlisting} % $
118     \begin{itemize}
119     \item \texttt{debian-binary}: version of the deb file format, \texttt{"2.0\textbackslash{}n"}
120     \item \texttt{control.tar.gz}: metadata about the package\\
121       {\small \texttt{\textbf{control}, md5sums, (pre|post)(rm|inst), triggers, shlibs}, \ldots}
122     \item \texttt{data.tar.gz}: data files of the package
123     \end{itemize}
124     \br
125   \item You could create your \texttt{.deb} files manually\\
126     {\footnotesize \url{http://tldp.org/HOWTO/html\_single/Debian-Binary-Package-Building-HOWTO/}}
127     \br
128   \item But most people don't do it that way
129   \end{itemize}
130   \br
131   \centerline{\textbf{This tutorial: create Debian packages, the Debian way}}
132 \end{frame}
133
134 \subsection{Tools you will need}
135 \begin{frame}{Tools you will need}
136   \begin{itemize}
137   \item A Debian (or Ubuntu) system (with root access)
138     \br
139   \item Some packages:
140     \begin{itemize}
141     \item \textbf{build-essential}: has dependencies on the packages that will
142       be assumed to be available on the developers' machine (no need to specify
143       them in the \texttt{Build-Depends:} control field of your package)
144       \begin{itemize}
145       \item includes a dependency on \textbf{dpkg-dev}, which contains basic
146         Debian-specific tools to create packages
147       \end{itemize}
148       \hbr
149     \item \textbf{devscripts}: contains many useful scripts for Debian
150       maintainers
151     \end{itemize}
152   \end{itemize}
153
154   \br
155   Many other tools will also be mentioned later, such as \textbf{debhelper},
156   \textbf{cdbs}, \textbf{quilt}, \textbf{pbuilder}, \textbf{sbuild},
157   \textbf{lintian}, \textbf{svn-buildpackage}, \textbf{git-buildpackage},
158   \ldots\\
159   Install them when you need them.
160 \end{frame}
161
162 \subsection{General packaging workflow}
163 \begin{frame}{General packaging workflow}
164   \begin{center}
165     \begin{tikzpicture}[
166       node1/.style={shape=rectangle,draw=rouge,fill=debianbackgroundblue,thick},
167       arr/.style={very thick}, command/.style={text=rouge,font=\ttfamily}, ]
168       
169       \node[node1] (www) at (0, 0) {Web};
170       \node[node1] (us) at (2.5, 0) {upstream source};
171       \node[node1] (da) at (-2.5, 0) {Debian mirror};
172       \node[node1] (sp) at (0, -2) {source package};
173       \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};
174       \node[node1] (bin) at (0, -4) {one or several binary packages};
175       \draw[arr,<-,dashed,thick] (bin) -- (3.5,-4) node[right,text centered,font=\small\ttfamily\sl] {.deb\normalfont};
176       \draw[arr,->] (us) -- (sp) node[pos=0.5,right,command] {dh\_make};
177       \draw[arr,->] (da) -- (sp) node[pos=0.5,left,command] {apt-get source};
178       \draw[arr,->] (www) -- (sp) node[pos=0.5,left,command] {dget};
179       \draw[arr,->] (sp) -- (bin) node[pos=0.5,right,text width=6cm] {\textttc{debuild} (build and test with \textttc{lintian}) or \textttc{dpkg-buildpackage}};
180       \draw[arr,->] (bin) -- (1,-6) node[pos=0.5,right] {install (\textttc{debi})};
181       % \draw[arr,->] (bin) -- (-1,-6) node[pos=0.5,left] {upload (\textttc{dput})};
182       \draw[transparent] (bin) -- (-1,-6) node[pos=0.5,left,opaque] {upload (\textttc{dput})};
183       \draw[arr,->,rounded corners] (bin) -- (-1,-6) -- (-4.5,-6) -- (-4.5,0) -- (da);
184       \useasboundingbox (-4,-6) rectangle (6,0); % hack hack hack
185     \end{tikzpicture}
186   \end{center}
187 \end{frame}
188
189 \subsection{Rebuilding dash}
190 \begin{frame}{Example: rebuilding dash}
191 \begin{enumerate}
192 \item Install packages needed to build dash, and devscripts\\
193   {\texttt{sudo apt-get build-dep dash}\\ (requires \texttt{deb-src} lines in \texttt{/etc/apt/sources.list})}\\
194   {\texttt{sudo apt-get install -{}-no-install-recommends devscripts}}
195   \hbr
196 \item Create a working directory, and get in it:\\
197  \texttt{mkdir /tmp/debian-tutorial ; cd /tmp/debian-tutorial}
198   \hbr
199 \item Grab the \texttt{dash} source package\\
200   \texttt{apt-get source dash}\\ 
201   {\small (This needs you to have \texttt{deb-src} lines in your \texttt{/etc/apt/sources.list})}
202   \hbr
203 \item Build the package\\
204   {\texttt{cd dash-*\\ debuild -us -uc}} ~~~(\texttt{-us -uc} disables signing the package with GPG)
205
206   \hbr
207 \item Check that it worked
208         \begin{itemize}
209                 \item  There are some new \texttt{.deb} files in the parent directory
210         \end{itemize}
211     \hbr
212 \item Look at the \texttt{debian/} directory
213         \begin{itemize}
214                 \item That's where the packaging work is done
215         \end{itemize}
216 \end{enumerate}
217 \end{frame}
218
219 \section{Creating source packages}
220 \subsection{Source packages basics}
221 \begin{frame}{Source package}
222   \begin{itemize}
223   \item One source package can generate several binary packages\\
224     {\small e.g the \texttt{\bfseries libtar} source generates the
225       \texttt{\bfseries libtar0} and \texttt{\bfseries libtar-dev} binary
226       packages} \hbr
227   \item Two kinds of packages: (if unsure, use non-native)
228     \begin{itemize}
229       \small
230     \item Native packages: normally for Debian specific software (\textsl{dpkg}, \textsl{apt})
231     \item Non-native packages: software developed outside Debian
232     \end{itemize}
233     \hbr
234   \item Main file: \texttt{.dsc} (meta-data)
235     \hbr
236   \item Other files depending on the version of the source format
237     \begin{itemize}
238     \item 1.0 -- native: \texttt{package\_version.tar.gz}
239       \hbr
240     \item 1.0 -- non-native:
241       \begin{itemize}
242       \item \texttt{pkg\_ver.orig.tar.gz} : upstream source
243       \item \texttt{pkg\_debver.diff.gz} : patch to add Debian-specific changes
244       \end{itemize}
245       \hbr
246     \item 3.0 (quilt):
247       \begin{itemize}
248       \item \texttt{pkg\_ver.orig.tar.gz} : upstream source
249       \item \texttt{pkg\_debver.debian.tar.gz} : tarball with the Debian changes
250       \end{itemize}
251     \end{itemize}
252   \end{itemize}
253   \hbr
254   (See \texttt{dpkg-source(1)} for exact details)
255 \end{frame}
256
257 \begin{frame}[fragile]{Source package example (wget\_1.12-2.1.dsc)}
258   \begin{lstlisting}[basicstyle=\ttfamily\small]
259 Format: 3.0 (quilt)
260 Source: wget
261 Binary: wget
262 Architecture: any
263 Version: 1.12-2.1
264 Maintainer: Noel Kothe <noel@debian.org>
265 Homepage: http://www.gnu.org/software/wget/
266 Standards-Version: 3.8.4
267 Build-Depends: debhelper (>> 5.0.0), gettext, texinfo,
268  libssl-dev (>= 0.9.8), dpatch, info2man
269 Checksums-Sha1: 
270  50d4ed2441e67[..]1ee0e94248 2464747 wget_1.12.orig.tar.gz
271  d4c1c8bbe431d[..]dd7cef3611 48308 wget_1.12-2.1.debian.tar.gz
272 Checksums-Sha256: 
273  7578ed0974e12[..]dcba65b572 2464747 wget_1.12.orig.tar.gz
274  1e9b0c4c00eae[..]89c402ad78 48308 wget_1.12-2.1.debian.tar.gz
275 Files: 
276  141461b9c04e4[..]9d1f2abf83 2464747 wget_1.12.orig.tar.gz
277  e93123c934e3c[..]2f380278c2 48308 wget_1.12-2.1.debian.tar.gz
278 \end{lstlisting}
279 \end{frame}
280
281 \subsection{Retrieving source packages}
282 \begin{frame}{Retrieving an existing source package}
283   \begin{itemize}
284   \item From the Debian archive:
285     \begin{itemize}
286     \item \texttt{apt-get source \textsl{package}}
287     \item \texttt{apt-get source \textsl{package=version}}
288     \item \texttt{apt-get source \textsl{package/release}}
289     \end{itemize}
290     (You need \texttt{deb-src} lines in \texttt{sources.list})
291     \br
292   \item From the Internet:
293     \begin{itemize}
294     \item \texttt{dget \textsl{url-to.dsc}}
295     \item \texttt{dget http://snapshot.debian.org/archive/debian-archive/\\20090802T004153Z/debian/dists/bo/main/source/web/\\
296         wget\_1.4.4-6.dsc}\\ 
297       (\href{http://snapshot.debian.org/}{\ttfamily snapshot.d.o} provides all packages from Debian since 2005)
298     \end{itemize}
299     \br
300   \item From the (declared) version control system:
301     \begin{itemize}
302     \item \texttt{debcheckout \textsl{package}}
303     \end{itemize}
304     \br
305   \item Once downloaded, extract with \texttt{dpkg-source -x \textsl{file.dsc}}
306   \end{itemize}
307 \end{frame}
308
309 \subsection{Creating a basic source package}
310 \begin{frame}{Creating a basic source package}
311   \begin{itemize}
312   \item Download the upstream source\\
313     (\textsl{upstream source} = the one from the software's original developers)
314     \hbr
315   \item Rename to \texttt{<\textsl{source\_package}>\_<\textsl{upstream\_version}>.orig.tar.gz}\\
316     (example: \texttt{simgrid\_3.6.orig.tar.gz})
317     \hbr
318   \item Untar it
319     \hbr
320   \item \texttt{cd \textsl{upstream\_source} \&\& dh\_make} (from the \textbf{dh-make} package)
321     \hbr
322   \item There are some alternatives to \texttt{dh\_make} for specific sets of
323     packages: \textbf{dh-make-perl}, \textbf{dh-make-php}, \ldots \hbr
324   \item \texttt{debian/} directory created, with a lot of files in it
325   \end{itemize}
326 \end{frame}
327
328 \subsection{Files in debian/}
329 \begin{frame}{Files in debian/}
330   All the packaging work should be made by modifying files in \texttt{debian/}
331   \hbr
332   \begin{itemize}
333   \item Main files:
334     \begin{itemize}
335     \item \textbf{control} -- meta-data about the package (dependencies, etc)
336     \item \textbf{rules} -- specifies how to build the package
337     \item \textbf{copyright} -- copyright information for the package
338     \item \textbf{changelog} -- history of the Debian package
339     \end{itemize}
340     \hbr
341   \item Other files:
342     \begin{itemize}
343     \item compat
344     \item watch
345     \item dh\_install* targets\\
346       {\small *.dirs, *.docs, *.manpages, \ldots}
347     \item maintainer scripts\\
348       {\small *.postinst, *.prerm, \ldots}
349     \item source/format
350     \item patches/ -- if you need to modify the upstream sources
351     \end{itemize}
352     \hbr
353   \item Several files use a format based on RFC 822 (mail headers)
354   \end{itemize}
355 \end{frame}
356
357 \begin{frame}[fragile]{debian/changelog}
358   \begin{itemize}
359   \item Lists the Debian packaging changes
360   \item Gives the current version of the package
361   \begin{center}
362     \begin{tikzpicture}
363             \draw (0,0) node[above right] {\large 1.2.1.1-5};
364             \draw [decorate,decoration={brace}] (2,0) -- (1.45,0) node[at start,below,text width=1.6cm,text centered] {\small  Debian revision};
365             \draw [decorate,decoration={brace}] (1.4,0) -- (0,0) node[midway,below,text width=1.6cm,text centered] { \small Upstream version};
366 \end{tikzpicture}
367 \end{center}
368
369
370           %%
371   \item Edited manually or with \textttc{dch}
372   \begin{itemize}
373           \item Create a changelog entry for a new release: \textttc{dch -i}
374   \end{itemize}
375   \item Special format to automatically close Debian or Ubuntu bugs\\
376     Debian: \texttt{Closes:~\#595268}; Ubuntu: \texttt{LP:~\#616929}
377   \item Installed as \texttt{/usr/share/doc/\textit{package}/changelog.Debian.gz}
378   \end{itemize}
379   \seprule
380   \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
381 mpich2 (1.2.1.1-5) unstable; urgency=low
382
383   * Use /usr/bin/python instead of /usr/bin/python2.5. Allow
384     to drop dependency on python2.5.  Closes: #595268
385   * Make /usr/bin/mpdroot setuid. This is the default after
386     the installation of mpich2 from source, too. LP: #616929
387     + Add corresponding lintian override.
388
389  -- Lucas Nussbaum <lucas@debian.org>  Wed, 15 Sep 2010 18:13:44 +0200
390 \end{lstlisting}
391 \end{frame}
392
393 \begin{frame}[fragile]{debian/control}
394   \hbr
395   \begin{itemize}
396   \item Package metadata
397     \begin{itemize}
398     \item For the source package itself
399     \item For each binary package built from this source
400     \end{itemize}
401     \hbr
402   \item Package name, section, priority, maintainer, uploaders,
403     build-dependencies, dependencies, description, homepage, \ldots \hbr
404   \item Documentation: Debian Policy chapter 5\\
405     \url{http://www.debian.org/doc/debian-policy/ch-controlfields.html}
406   \end{itemize}
407   \seprule
408 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
409 Source: wget
410 Section: web
411 Priority: important
412 Maintainer: Noel Kothe <noel@debian.org>
413 Build-Depends: debhelper (>> 5.0.0), gettext, texinfo,
414  libssl-dev (>= 0.9.8), dpatch, info2man
415 Standards-Version: 3.8.4
416 Homepage: http://www.gnu.org/software/wget/
417
418 Package: wget
419 Architecture: any
420 Depends: ${shlibs:Depends}, ${misc:Depends}
421 Description: retrieves files from the web
422  Wget is a network utility to retrieve files from the Web
423 \end{lstlisting}
424 \end{frame}
425
426 \begin{frame}{Architecture: all or any}
427   Two kinds of binary packages:
428   \hbr
429   \begin{itemize}
430   \item Packages with different contents on each Debian architecture
431     \begin{itemize}
432     \item Example: C program
433     \item \texttt{Architecture:\ any} in \texttt{debian/control}
434       \begin{itemize}
435       \item Or, if it only works on a subset of architectures:\\
436         \texttt{Architecture:\ amd64 i386 ia64 hurd-i386}
437       \end{itemize}
438     \item buildd.debian.org: builds all the other architectures for you on upload
439     \item Named \texttt{\textsl{package}\_\textsl{version}\_\textsl{architecture}.deb}
440     \end{itemize}
441     \br
442   \item Packages with the same content on all architectures
443     \begin{itemize}
444     \item Example: Perl library
445     \item \texttt{Architecture:\ all} in \texttt{debian/control}
446     \item Named \texttt{\textsl{package}\_\textsl{version}\_\textbf{all}.deb}
447     \end{itemize}
448   \end{itemize}
449   \br
450   A source package can generate a mix of \texttt{Architecture:\ any} and \texttt{Architecture:\ all} binary packages
451 \end{frame}
452
453 \begin{frame}[fragile]{debian/rules}
454   \hbr
455   \begin{itemize}
456   \item Makefile
457     \br
458   \item Interface used to build Debian packages
459     \br
460   \item Documented in Debian Policy, chapter 4.8\\
461     {\small \url{http://www.debian.org/doc/debian-policy/ch-source.html\#s-debianrules}}
462     \br
463   \item Five required targets:
464     \begin{itemize}
465     \item \texttt{build}: should perform all the configuration and compilation
466       \hbr
467     \item \texttt{binary, binary-arch, binary-indep}: build the binary packages
468       \begin{itemize}
469       \item \texttt{dpkg-buildpackage} will call \texttt{binary} to build all
470         the packages, or \texttt{binary-arch} to build only the
471         \texttt{Architecture:~any} packages
472       \end{itemize}
473       \hbr
474     \item \texttt{clean}: clean up the source directory
475     \end{itemize}
476   \end{itemize}
477 \end{frame}
478
479 \subsection{Packaging helpers}
480 \begin{frame}{Packaging helpers -- debhelper}
481   \begin{itemize}
482   \item You could write shell code in \texttt{debian/rules} directly
483     \begin{itemize}
484     \item See the \texttt{adduser} package for example
485     \end{itemize}
486     \hbr
487   \item Better practice (used by most packages): use a \textsl{Packaging helper}
488     \hbr
489   \item Most popular one: \textbf{debhelper} (used by 98\% of packages)
490     \hbr
491   \item Goals:
492     \begin{itemize}
493     \item Factor the common tasks in standard tools used by all packages
494     \item Fix some packaging bugs once for all packages
495     \end{itemize}
496     {\footnotesize dh\_installdirs, dh\_installchangelogs, dh\_installdocs,
497       dh\_installexamples, dh\_install, dh\_installdebconf, dh\_installinit,
498       dh\_link, dh\_strip, dh\_compress, dh\_fixperms, dh\_perl,
499       dh\_makeshlibs, dh\_installdeb, dh\_shlibdeps, dh\_gencontrol,
500       dh\_md5sums, dh\_builddeb, \ldots}
501     \begin{itemize}
502     \item Called from \texttt{debian/rules}
503     \item Configurable using command parameters or files in \texttt{debian/}
504     \end{itemize}
505     {\footnotesize \ttfamily \textsl{package}.docs, \textsl{package}.examples,
506       \textsl{package}.install, \textsl{package}.manpages, \ldots} \hbr
507   \item Third-party helpers for sets of packages: \textbf{python-support},
508     \textbf{dh\_ocaml}, \ldots \hbr
509   \item Gotcha: \texttt{debian/compat}: Debhelper compatibility version (use "7")
510   \end{itemize}
511 \end{frame}
512
513 \begin{frame}[fragile]{debian/rules using debhelper (1/2)}
514   \begin{lstlisting}[basicstyle=\ttfamily\footnotesize,escapeinside=\{\}]
515 #!/usr/bin/make -f
516
517 # Uncomment this to turn on verbose mode.
518 #export DH_VERBOSE=1
519
520 build: 
521         $(MAKE)
522         #docbook-to-man debian/packagename.sgml > packagename.1
523
524 clean: 
525         dh_testdir
526         dh_testroot
527         rm -f build-stamp configure-stamp
528         $(MAKE) clean
529         dh_clean 
530
531 install: build
532         dh_testdir
533         dh_testroot
534         dh_clean -k 
535         dh_installdirs
536         # Add here commands to install the package into debian/packagename.
537         $(MAKE) DESTDIR=$(CURDIR)/debian/packagename install
538 \end{lstlisting}
539 \end{frame}
540
541 \begin{frame}[fragile]{debian/rules using debhelper (2/2)}
542   \begin{lstlisting}[basicstyle=\ttfamily\footnotesize,escapeinside=\{\}]
543
544 # Build architecture-independent files here.
545 binary-indep: build install
546
547 # Build architecture-dependent files here.
548 binary-arch: build install
549         dh_testdir
550         dh_testroot
551         dh_installchangelogs 
552         dh_installdocs
553         dh_installexamples
554         dh_install
555         dh_installman
556         dh_link
557         dh_strip
558         dh_compress
559         dh_fixperms
560         dh_installdeb
561         dh_shlibdeps
562         dh_gencontrol
563         dh_md5sums
564         dh_builddeb
565
566 binary: binary-indep binary-arch
567 .PHONY: build clean binary-indep binary-arch binary install configure
568 \end{lstlisting}
569 \end{frame}
570
571 \begin{frame}[fragile]{CDBS}
572   \hbr
573   \begin{itemize}
574   \item With debhelper, still a lot of redundancy between packages
575     \hbr
576   \item Second-level helpers that factor common functionality
577     \begin{itemize}
578     \item E.g building with \texttt{./configure \&\& make \&\& make install} or CMake
579     \end{itemize}
580     \hbr
581   \item CDBS:
582     \begin{itemize}
583     \item Introduced in 2005, based on advanced \textsl{GNU make} magic
584     \item Documentation: \texttt{/usr/share/doc/cdbs/}
585     \item Support for Perl, Python, Ruby, GNOME, KDE, Java, Haskell, \ldots
586     \item But some people hate it:
587       \begin{itemize}
588       \item Sometimes difficult to customize package builds:\\
589         "\textsl{twisty maze of makefiles and environment variables}"
590       \item Slower than plain debhelper (many useless calls to \texttt{dh\_*})
591       \end{itemize}
592     \end{itemize}
593   \end{itemize}
594   \seprule
595       \begin{lstlisting}[basicstyle=\ttfamily\footnotesize,escapeinside=\{\}]
596 #!/usr/bin/make -f
597 include /usr/share/cdbs/1/rules/debhelper.mk
598 include /usr/share/cdbs/1/class/autotools.mk
599
600 # add an action after the build
601 build/mypackage::
602     /bin/bash debian/scripts/foo.sh
603       \end{lstlisting}
604 \end{frame}
605
606 \begin{frame}[fragile]{Dh (aka Debhelper 7, or dh7)}
607   \begin{itemize}
608   \item Introduced in 2008 as a \textsl{CDBS killer}
609     \hbr
610   \item \textbf{dh} command that calls \texttt{dh\_*}
611     \hbr
612   \item Simple \textsl{debian/rules}, listing only overrides
613     \hbr
614   \item Easier to customize than CDBS
615     \hbr
616   \item Doc: manpages (\texttt{debhelper(7)}, \texttt{dh(1)}) + slides from DebConf9 talk\\
617     \url{http://kitenet.net/~joey/talks/debhelper/debhelper-slides.pdf}
618   \end{itemize}
619   \seprule
620     \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
621 #!/usr/bin/make -f
622 %:
623     dh $@
624
625 override_dh_auto_configure:
626      dh_auto_configure -- --with-kitchen-sink
627
628 override_dh_auto_build:
629      make world
630
631     \end{lstlisting}
632 \end{frame}
633
634 \begin{frame}{Classic debhelper vs CDBS vs dh}
635   \hbr
636   \begin{itemize}
637   \item Mind shares:\\
638     Classic debhelper: 36\% \hskip 1em CDBS: 21\% \hskip 1em  dh: 41\%
639     \hbr
640   \item Which one should I learn?
641     \begin{itemize}
642     \item Probably a bit of all of them
643     \item You need to know debhelper to use dh and CDBS
644     \item You might have to modify CDBS packages
645     \end{itemize}
646     \hbr
647   \item Which one should I use for a new package?
648     \begin{itemize}
649     \item \textbf{dh} (only solution with an increasing mind share)
650     \end{itemize}
651   \end{itemize}
652   
653   \hbr
654   \begin{center}
655     \begin{tikzpicture}
656 \begin{axis}[small,label style={font=\footnotesize},xlabel={\small Time},ylabel={\small Market share (\%)},
657         date coordinates in=x,height=4.85cm,width=9cm,xticklabel={\month/\year},
658              legend style={font=\footnotesize,at={(1.02,1)},anchor=north west},max space between ticks=82,try min ticks=5,ymin=0]
659         \addplot[mark=none,blue,thick,style=densely dotted] table[x=date,y=dh] {cdbs-dh7.txt};
660         \addplot[mark=none,red,thick,style=dashed] table[x=date,y=dh7] {cdbs-dh7.txt};
661         \addplot[mark=none,green,thick] table[x=date,y=cdbs] {cdbs-dh7.txt};
662         \legend{debhelper, dh, CDBS}
663 \end{axis}
664 \end{tikzpicture}
665 \end{center}
666
667 \end{frame}
668
669 \section{Building and testing packages}
670 \subsection{Building packages}
671 \begin{frame}{Building packages}
672   \begin{itemize}
673   \item \textttc{apt-get build-dep mypackage}\\
674     Installs the \textsl{build-dependencies} (for a package already in Debian)\\
675     Or \textttc{mk-build-deps -ir} (inside the package source tree)
676     
677     \br
678   \item \textttc{debuild}: build, test with \texttt{lintian}, sign with GPG
679     \br
680   \item Also possible to call \textttc{dpkg-buildpackage} directly
681     \begin{itemize}
682     \item Usually with \texttt{dpkg-buildpackage -us -uc}
683     \end{itemize}
684     \br
685   \item It is better to build packages in a clean \& minimal environment
686     \begin{itemize}
687     \item \textttc{pbuilder} -- helper to build packages in a \textsl{chroot}\\
688       Good documentation: \url{https://wiki.ubuntu.com/PbuilderHowto}\\
689       (optimization: \textttc{cowbuilder} \textttc{ccache} \textttc{distcc})
690       \hbr
691     \item \textttc{schroot} and \textttc{sbuild}: used on the Debian build daemons\\
692       (not as simple as \texttt{pbuilder}, but allows LVM snapshots\\
693        see: \url{https://help.ubuntu.com/community/SbuildLVMHowto} )
694     \end{itemize}
695     \br
696   \item Generates \texttt{.deb} files and a \texttt{.changes} file
697     \begin{itemize}
698     \item \texttt{.changes}: describes what was built; used to upload the package
699     \end{itemize}
700   \end{itemize}
701 \end{frame}
702 \subsection{Installing and testing packages}
703 \begin{frame}{Installing and testing packages}
704   \begin{itemize}
705   \item Install the package locally: \textttc{debi} (will use \texttt{.changes}
706     to know what to install) \br
707   \item List the content of the package: \texttt{{\color{rouge}debc}
708       ../mypackage<TAB>.changes} \br
709   \item Compare the package with a previous version:\\
710     \texttt{{\color{rouge}debdiff} ../mypackage\_1\_*.changes ../mypackage\_2\_*.changes}\\
711     or to compare the sources:\\
712     \texttt{{\color{rouge}debdiff} ../mypackage\_1\_*.dsc ../mypackage\_2\_*.dsc}\\
713     \br
714   \item Check the package with \texttt{lintian} (static analyzer):\\
715     \texttt{{\color{rouge}lintian} ../mypackage<TAB>.changes}\\
716     \texttt{lintian -i}: gives more information about the errors \br
717   \item Upload the package to Debian (\textttc{dput}) (needs configuration) \br
718   \item Manage a private Debian archive with \textttc{reprepro}\\
719     Documentation: \url{http://mirrorer.alioth.debian.org/}
720   \end{itemize}
721 \end{frame}
722 \section{Practical session 1: modifying the grep package}
723 \begin{frame}{Practical session 1: modifying the grep package}
724   \begin{enumerate}
725   \item Go to \url{http://ftp.debian.org/debian/pool/main/g/grep/} and
726     download version 2.6.3-3 of the package (if you use Ubuntu 11.10 or
727     later, or Debian testing or unstable, use version 2.9-1 or 2.9-2 instead)
728     \begin{itemize}
729                    \item If the source package is not unpacked automatically, unpack it with
730                            \texttt{dpkg-source~-x~grep\_*.dsc}
731     \end{itemize}
732
733   \item Look at the files in \texttt{debian/}.
734     \begin{itemize}
735     \item               How many binary packages are generated by this source package?
736     \item               Which packaging helper does this package use?
737     \end{itemize}
738     \hbr
739   \item Build the package
740     \hbr
741   \item We are now going to modify the package. Add a changelog entry and increase the version number.
742     \hbr
743   \item Now disable perl-regexp support (it is a \texttt{./configure} option)
744     \hbr
745   \item Rebuild the package
746     \hbr
747   \item Compare the original and the new package with debdiff
748     \hbr
749   \item Install the newly built package
750     \hbr
751   \item Cry if you messed up ;)
752   \end{enumerate}
753 \end{frame}
754
755 \section{Advanced packaging topics}
756 \subsection{debian/copyright}
757 \begin{frame}[fragile]{debian/copyright}
758   \hbr
759   \begin{itemize}
760   \item Copyright and license information for the source and the packaging
761   \item Traditionally written as a text file
762   \item New machine-readable format:
763     {\small\url{http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/}}
764   \end{itemize}
765   \seprule
766   \begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
767 Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
768 Upstream-Name: X Solitaire
769 Source: ftp://ftp.example.com/pub/games
770
771 Files: *
772 Copyright: Copyright 1998 John Doe <jdoe@example.com>
773 License: GPL-2+
774  This program is free software; you can redistribute it
775  [...]
776  .
777  On Debian systems, the full text of the GNU General Public
778  License version 2 can be found in the file
779  `/usr/share/common-licenses/GPL-2'.
780
781 Files: debian/*
782 Copyright: Copyright 1998 Jane Smith <jsmith@example.net>
783 License:
784  [LICENSE TEXT]
785 \end{lstlisting}
786 \end{frame}
787
788
789
790 \subsection{Modifying the upstream source}
791 \begin{frame}{Modifying the upstream source}
792   Often needed:
793   \begin{itemize}
794   \item Fix bugs or add customizations that are specific to Debian
795     \hbr
796   \item Backport fixes from a newer upstream release
797   \end{itemize}
798   \br
799   Several methods to do it:
800   \begin{itemize}
801   \item Modifying the files directly
802     \begin{itemize}
803     \item Simple
804     \item But no way to track and document the changes
805     \end{itemize}
806     \hbr
807   \item Using patch systems
808     \begin{itemize}
809     \item Eases contributing your changes to upstream
810     \item Helps sharing the fixes with derivatives
811     \item Gives more exposure to the changes\\
812       \url{http://patch-tracker.debian.org/}
813     \end{itemize}
814   \end{itemize}
815 \end{frame}
816
817 \begin{frame}{Patch systems}
818   \begin{itemize}
819   \item Principle: changes are stored as patches in \texttt{debian/patches/}
820     \br
821   \item Applied and unapplied during build
822     \br
823   \item Past: several implementations -- \textsl{simple-patchsys} (\textsl{cdbs}),
824     \textsl{dpatch}, \textbf{\textsl{quilt}}
825     \begin{itemize}
826   \item Each supports two \texttt{debian/rules} targets:
827     \begin{itemize}
828     \item \texttt{debian/rules patch}: apply all patches
829     \item \texttt{debian/rules unpatch}: de-apply all patches
830     \end{itemize}
831           \hbr
832   \item More documentation: \url{http://wiki.debian.org/debian/patches}
833   \end{itemize}
834   \br
835   \item \textbf{New source package format with built-in patch system: 3.0 (quilt)}
836   \begin{itemize}
837   \item Recommended solution
838           \hbr
839   \item You need to learn \textsl{quilt}\\
840     \url{http://pkg-perl.alioth.debian.org/howto/quilt.html}
841     \hbr
842   \item Patch-system-agnostic tool in \texttt{devscripts}: \texttt{edit-patch}
843   \end{itemize}
844   \end{itemize}
845 \end{frame}
846
847 \begin{frame}[fragile]{Documentation of patches}
848   \begin{itemize}
849           \item Standard headers at the beginning of the patch
850     \br
851   \item Documented in DEP-3 - Patch Tagging Guidelines\\
852     \url{http://dep.debian.net/deps/dep3/}
853   \end{itemize}
854   \vfill
855 \seprule
856   \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
857 Description: Fix widget frobnication speeds
858  Frobnicating widgets too quickly tended to cause explosions.
859 Forwarded: http://lists.example.com/2010/03/1234.html
860 Author: John Doe <johndoe-guest@users.alioth.debian.org>
861 Applied-Upstream: 1.2, http://bzr.foo.com/frobnicator/revision/123
862 Last-Update: 2010-03-29
863
864 --- a/src/widgets.c
865 +++ b/src/widgets.c
866 @@ -101,9 +101,6 @@ struct {
867 \end{lstlisting}
868 \end{frame}
869
870 \subsection{Doing things during installation and removal}
871 \begin{frame}{Doing things during installation and removal}
872   \begin{itemize}
873   \item Decompressing the package is sometimes not enough
874     \hbr
875   \item Create/remove system users, start/stop services, manage \textsl{alternatives}
876     \hbr
877   \item Done in \textsl{maintainer scripts}\\
878     \texttt{preinst, postinst, prerm, postrm}
879     \begin{itemize}
880             \item  Snippets for common actions can be generated by debhelper
881     \end{itemize}
882     \hbr
883   \item Documentation:
884     \begin{itemize}
885     \item Debian Policy Manual, chapter 6\\
886       {\footnotesize \url{http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html}}
887       
888       \hbr
889     \item Debian Developer's Reference, chapter 6.4\\
890       {\scriptsize \url{http://www.debian.org/doc/developers-reference/best-pkging-practices.html}}
891       \hbr
892     \item {\footnotesize \url{http://people.debian.org/~srivasta/MaintainerScripts.html}}
893     \end{itemize}
894     \br
895   \item Prompting the user
896     \begin{itemize}
897     \item Must be done with \textbf{debconf}
898       \hbr
899     \item Documentation: \texttt{debconf-devel(7)} (\texttt{debconf-doc} package)
900     \end{itemize}
901   \end{itemize}
902 \end{frame}
903
904 \begin{frame}[fragile]{Monitoring upstream versions}
905   \begin{itemize}
906   \item Specify where to look in \texttt{debian/watch} (see \texttt{uscan(1)})
907     \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
908 version=3
909
910 http://tmrc.mit.edu/mirror/twisted/Twisted/(\d\.\d)/ \
911   Twisted-([\d\.]*)\.tar\.bz2
912     \end{lstlisting}
913     \br
914   \item Debian infrastructure that makes use of \texttt{debian/watch}:\\
915     \textbf{Debian External Health Status}\\
916     \url{http://dehs.alioth.debian.org/}
917     \br
918   \item Maintainer warned by emails sent to the Package Tracking System\\
919     \url{http://packages.qa.debian.org/}
920     \br
921   \item \texttt{uscan}: run a manual check
922     \br
923   \item \texttt{uupdate}: try to update your package to the latest upstream version
924   \end{itemize}
925 \end{frame}
926
927 \subsection{Packaging with a Version Control System (SVN, Git)}
928 \begin{frame}[fragile]{Packaging with a Version Control System}
929   \begin{itemize}
930   \item Several tools to help manage branches and tags for your packaging work:\\
931     \texttt{svn-buildpackage}, \texttt{git-buildpackage}
932     \hbr
933   \item Example: \texttt{git-buildpackage}
934     \begin{itemize}
935     \item \texttt{upstream} branch to track upstream with \texttt{upstream/\textsl{version}} tags
936     \item \texttt{master} branch tracks the Debian package
937     \item \texttt{debian/\textsl{version}} tags for each upload
938     \item \texttt{pristine-tar} branch to be able to rebuild the upstream tarball
939     \end{itemize}
940     \hbr
941   \item \texttt{Vcs-*} fields in \texttt{debian/control} to locate the repository
942           \begin{itemize}
943                 \item \url{http://wiki.debian.org/Alioth/Git}
944                 \item \url{http://wiki.debian.org/Alioth/Svn}
945         \end{itemize}
946 \end{itemize}
947   \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
948 Vcs-Browser: http://git.debian.org/?p=devscripts/devscripts.git
949 Vcs-Git: git://git.debian.org/devscripts/devscripts.git
950   \end{lstlisting}
951   \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
952 Vcs-Browser: http://svn.debian.org/viewsvn/pkg-perl/trunk/libwww-perl/
953 Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libwww-perl
954   \end{lstlisting}
955   \begin{itemize}
956   \item VCS-agnostic interface: \texttt{debcheckout}, \texttt{debcommit},
957     \texttt{debrelease}\\
958     \begin{itemize}
959             \item     \texttt{debcheckout grep} $\rightarrow$ checks out the source package
960     from Git
961     \end{itemize}
962 \end{itemize}
963 \end{frame}
964
965 \subsection{Backporting packages}
966 \begin{frame}{Backporting packages}
967   \begin{itemize}
968   \item Goal: use a newer version of a package on an older system\\
969           e.g use \textsl{mutt} from Debian \textsl{unstable} on Debian \textsl{stable}
970         \br
971   \item General idea:
972           \begin{itemize}
973                 \item Take the source package from Debian unstable
974                 \hbr
975                 \item Modify it so that it builds and works fine on Debian stable
976                 \begin{itemize}
977                         \item Sometimes trivial (no changes needed)
978                         \item Sometimes difficult
979                         \item Sometimes impossible (many unavailable dependencies)
980                 \end{itemize}
981         \end{itemize}
982         \br
983    \item Some backports are provided and supported by the Debian project\\
984            \url{http://backports.debian.org/}
985 \end{itemize}
986 \end{frame}
987
988
989
990 \section{Maintaining packages in Debian}
991 \subsection{Several ways to contribute to Debian}
992 \begin{frame}{Several ways to contribute to Debian}
993   \begin{itemize}
994   \item \textbf{Worst} way to contribute:
995     \begin{enumerate}
996     \item Package your own application
997     \item Get it into Debian
998     \item Disappear
999     \end{enumerate}
1000     \br
1001   \item \textbf{Better} ways to contribute:
1002           \begin{itemize}
1003                   \item Get involved in packaging teams
1004     \begin{itemize}
1005     \item Many teams that focus on set of packages, and need help
1006     \item List available at \url{http://wiki.debian.org/Teams}
1007     \item An excellent way to learn from more experienced contributors
1008     \end{itemize}
1009     \br
1010 \item Adopt existing unmaintained packages (\textsl{orphaned packages})
1011     \br
1012   \item Bring new software to Debian
1013     \begin{itemize}
1014     \item Only if it's interesting/useful enough, please
1015     \item Are there alternatives already packaged in Debian?
1016     \end{itemize}
1017   \end{itemize}
1018
1019   \end{itemize}
1020 \end{frame}
1021
1022 \subsection{Adopting orphaned packages}
1023 \begin{frame}{Adopting orphaned packages}
1024       \hbr
1025   \begin{itemize}
1026     \item Many unmaintained packages in Debian
1027     \hbr
1028   \item Full list + process: \url{http://www.debian.org/devel/wnpp/}
1029     \hbr
1030   \item Installed on your machine: \texttt{wnpp-alert}
1031     \hbr
1032   \item Different states:
1033     \begin{itemize}
1034                     \small
1035     \item \textbf{O}rphaned: the package is unmaintained\\
1036       Feel free to adopt it
1037       \hbr
1038     \item \textbf{RFA}: \textbf{R}equest \textbf{F}or \textbf{A}dopter\\
1039       Maintainer looking for adopter, but continues work in the meantime\\
1040       Feel free to adopt it. A mail to the current maintainer is polite
1041       \hbr
1042     \item \textbf{ITA}: \textbf{I}ntent \textbf{T}o \textbf{A}dopt\\
1043       Someone intends to adopt the package\\
1044       You could propose your help!
1045       \hbr
1046     \item \textbf{RFH}: \textbf{R}equest \textbf{F}or \textbf{H}elp\\
1047       The maintainer is looking for help
1048     \end{itemize}
1049     \hbr
1050   \item Some unmaintained packages not detected \arr not orphaned yet
1051     \hbr
1052   \item When in doubt, ask \texttt{debian-qa@lists.debian.org} \\
1053     or \texttt{\#debian-qa} on \texttt{irc.debian.org}
1054   \end{itemize}
1055 \end{frame}
1056
1057 \begin{frame}[fragile]{Adopting a package: example}
1058 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
1059 From: You <you@yourdomain>
1060 To: 640454@bugs.debian.org, control@bugs.debian.org
1061 Cc: Francois Marier <francois@debian.org>
1062 Subject: ITA: verbiste -- French conjugator
1063
1064 retitle 640454 ITA: verbiste -- French conjugator
1065 owner 640454 !
1066 thanks
1067
1068 Hi,
1069
1070 I am using verbiste and I am willing to take care of the package.
1071
1072 Cheers,
1073
1074 You
1075 \end{lstlisting}
1076
1077 \begin{itemize}
1078 \item Polite to contact the previous maintainer (especially if the package was RFAed, not orphaned)
1079 \item Very good idea to contact the upstream project
1080 \end{itemize}
1081 \end{frame}
1082
1083 \subsection{Getting your package in Debian}
1084 \begin{frame}{Getting your package in Debian}
1085 \begin{itemize}
1086 \item You do not need any official status to get your package into Debian
1087         \begin{enumerate}
1088                 \item Prepare a source package
1089                         \hbr
1090                 \item Find a Debian Developer that will sponsor your package
1091         \end{enumerate}
1092 \br
1093 \item Official status (when you are already experienced):
1094         \begin{itemize}
1095                 \item \textbf{Debian Maintainer (DM):}\\
1096                         Permission to upload your own packages\\
1097                         See \url{http://wiki.debian.org/DebianMaintainer}
1098                         \hbr
1099                 \item \textbf{Debian Developer (DD):}\\
1100                         Debian project members; can vote and upload any package
1101         \end{itemize}
1102 \end{itemize}
1103 \end{frame}
1104
1105 \subsection{Where to find help?}
1106 \begin{frame}{Where to find help?}
1107   Help you will need:
1108   \begin{itemize}
1109   \item Advice and answers to your questions, code reviews
1110   \item Sponsorship for your uploads, once your package is ready
1111   \end{itemize}
1112   \br
1113   You can get help from:
1114   \begin{itemize}
1115           \item \textbf{Other members of a packaging team}
1116     \begin{itemize}
1117     \item They know the specifics of your package
1118     \item You can become a member of the team
1119     \end{itemize}
1120     \hbr
1121   \item The Debian Mentors group (if your package doesn't fit in a team)
1122     \begin{itemize}
1123     \item \url{http://wiki.debian.org/DebianMentorsFaq}
1124     \item Mailing list: \url{debian-mentors@lists.debian.org}\\
1125             {\small (also a good way to learn by accident)}
1126     \item IRC: \texttt{\#debian-mentors} on \texttt{irc.debian.org}
1127     \item \url{http://mentors.debian.net/}
1128     \end{itemize}
1129   \end{itemize}
1130 \end{frame}
1131
1132 \subsection{Official documentation}
1133 \begin{frame}{Official documentation}
1134   \begin{itemize}
1135   \item Debian Developers' Corner\\
1136     \url{http://www.debian.org/devel/}\\
1137     {\small Links to many resources about Debian development}
1138     \hbr
1139   \item Debian New Maintainers' Guide\\
1140     \url{http://www.debian.org/doc/maint-guide/}\\
1141     {\small An introduction to Debian packaging, but could use an update}
1142     \hbr
1143   \item Debian Developer's Reference\\
1144     \url{http://www.debian.org/doc/developers-reference/}\\
1145     {\small Mostly about Debian procedures, but also some best packaging practices (part 6)}
1146     \hbr
1147   \item Debian Policy\\
1148     \url{http://www.debian.org/doc/debian-policy/}\\
1149     
1150     {\small \begin{itemize}
1151       \item \small All the requirements that every package must satisfy
1152       \item \small Specific policies for Perl, Java, Python, \ldots
1153       \end{itemize}}
1154     \hbr
1155     
1156   \item Ubuntu Packaging Guide\\
1157     \url{https://wiki.ubuntu.com/PackagingGuide}
1158   \end{itemize}
1159 \end{frame}
1160
1161 \begin{frame}{Debian dashboards for maintainers}
1162   \begin{itemize}
1163           \item \textbf{Source package centric}: Package Tracking System (PTS)\\
1164     \url{http://packages.qa.debian.org/dpkg}
1165     \br
1166   \item \textbf{Maintainer/team centric}: Developer's Packages Overview (DDPO)\\
1167     \url{http://qa.debian.org/developer.php?login=pkg-ruby-extras-maintainers@lists.alioth.debian.org}
1168   \end{itemize}
1169 \end{frame}
1170
1171 \subsection{More interested in Ubuntu?}
1172 \begin{frame}{More interested in Ubuntu?}
1173   \begin{itemize}
1174   \item Ubuntu mainly manages the divergence with Debian
1175     \br
1176   \item No real focus on specific packages\\
1177     Instead, collaboration with Debian teams
1178     \br
1179   \item Usually recommend uploading new packages to Debian first\\
1180     \url{https://wiki.ubuntu.com/UbuntuDevelopment/NewPackages}
1181     \br
1182   \item Possibly a better plan:
1183     \begin{itemize}
1184     \item Get involved in a Debian team and act as a bridge with Ubuntu
1185       \hbr
1186     \item Help reduce divergence, triage bugs in Launchpad
1187       \hbr
1188     \item Many Debian tools can help:
1189       \begin{itemize}
1190       \item Ubuntu column on the Developer's packages overview
1191       \item Ubuntu box on the Package Tracking System
1192       \item Receive launchpad bugmail via the PTS
1193       \end{itemize}
1194     \end{itemize}
1195   \end{itemize}
1196 \end{frame}
1197
1198 \section{Conclusion}
1199 \subsection{Conclusion}
1200 \begin{frame}{Conclusion}
1201   \begin{itemize}
1202   \item You now have a full overview of Debian packaging
1203     \br
1204   \item But you will need to read more documentation
1205     \br
1206   \item Best practices have evolved over the years
1207     \begin{itemize}
1208     \item If not sure, use the \textbf{dh} packaging helper, and the \textbf{3.0 (quilt)} format
1209     \end{itemize}
1210     \br
1211   \item Things that were not covered in this tutorial:
1212     \begin{itemize}
1213         \item UCF -- manage user changes to configuration files when upgrading
1214                 \hbr
1215         \item dpkg triggers -- group similar maintainer scripts actions together
1216                 \hbr
1217         \item Debian development organization:
1218                 \begin{itemize}
1219                         \item Bug Tracking System (BTS)
1220                         \item Suites: stable, testing, unstable, experimental, security, *-updates, backports, \ldots
1221                         \item Debian Blends -- subsets of Debian targeting specific groups
1222                 \end{itemize}
1223                 \end{itemize}
1224   \end{itemize}
1225   \vfill
1226   \centerline{\large Feedback: \textbf{lucas@debian.org}}
1227 \end{frame}
1228
1229 \subsection{Legal stuff}
1230 \begin{frame}{Legal stuff}
1231
1232   Copyright \copyright 2011 Lucas Nussbaum -- lucas@debian.org
1233   \br
1234
1235   {\small 
1236     \textbf{This document is free software}: you can redistribute it and/or modify
1237     it under either (at your option):
1238     \hbr
1239     \begin{itemize}
1240     \item The terms of the GNU General Public License as published by the Free
1241       Software Foundation, either version 3 of the License, or
1242       (at your option) any later version.\\
1243       \url{http://www.gnu.org/licenses/gpl.html} \br
1244     \item The terms of the Creative Commons Attribution-ShareAlike 3.0 Unported
1245       License.\\ 
1246       \url{http://creativecommons.org/licenses/by-sa/3.0/}
1247     \end{itemize}
1248   }
1249 \end{frame}
1250
1251 \subsection{Latest version \& source code}
1252 \begin{frame}{Latest version \& source code}
1253   \begin{itemize}
1254   \item Latest version:\\
1255     {\footnotesize \url{http://git.debian.org/?p=collab-maint/packaging-tutorial.git;a=blob\_plain;f=packaging-tutorial.pdf;hb=refs/heads/pdf}}
1256   \end{itemize}
1257   
1258   \begin{itemize}
1259   \item Contribute:
1260           \begin{itemize}
1261                   \item  {\small \texttt{git clone\\ git://git.debian.org/collab-maint/packaging-tutorial.git}}
1262     \hbr
1263     \item {\small \texttt{apt-get source packaging-tutorial}}
1264     \hbr
1265     \item {\small \url{http://git.debian.org/?p=collab-maint/packaging-tutorial.git}}
1266     \end{itemize}
1267     \br
1268   \item Feedback: \href{mailto:lucas@debian.org}{\textbf{\texttt{lucas@debian.org}}}
1269   \end{itemize}
1270 \end{frame}
1271
1272 \section{Practical session 2: packaging GNUjump}
1273 \begin{frame}{Practical session 2: packaging GNUjump}
1274 \begin{enumerate}
1275         \item Download GNUjump 1.0.6 from
1276                 \url{http://ftp.gnu.org/gnu/gnujump/1.0.6/gnujump-1.0.6.tar.gz}
1277                 \br
1278         \item Create a Debian package for it
1279                 \begin{itemize}
1280                         \item Install build-dependencies so that you can build the package
1281                         \item Get a basic working package
1282                         \item Finish filling \texttt{debian/control} and other files
1283                 \end{itemize}
1284                 \br
1285         \item Enjoy
1286 \end{enumerate}
1287 \centerline{\includegraphics[width=5cm]{figs/gnujump.png}}
1288 \end{frame}
1289
1290 \section{Practical session 3: packaging a Java library}
1291 \begin{frame}{Practical session 3: packaging a Java library}
1292 \begin{enumerate}
1293         \item Take a quick look at some documentation about Java packaging:\\
1294                 \begin{itemize}
1295                 \item \url{http://wiki.debian.org/Java}
1296       \hbr
1297                 \item \url{http://wiki.debian.org/Java/Packaging}
1298       \hbr
1299                 \item \url{http://www.debian.org/doc/packaging-manuals/java-policy/}
1300       \hbr
1301                 \item \url{http://pkg-java.alioth.debian.org/docs/tutorial.html}
1302       \hbr
1303                 \item Paper and slides from a Debconf10 talk about javahelper:\\
1304                         {\footnotesize
1305                         \url{http://pkg-java.alioth.debian.org/docs/debconf10-javahelper-paper.pdf}\\
1306                         \url{http://pkg-java.alioth.debian.org/docs/debconf10-javahelper-slides.pdf}}
1307                 \end{itemize}
1308                 \br
1309         \item Download IRClib from \url{http://moepii.sourceforge.net/}
1310                 \br
1311         \item Package it
1312 \end{enumerate}
1313 \end{frame}
1314
1315 \section{Practical session 4: packaging a Ruby gem}
1316 \begin{frame}{Practical session 4: packaging a Ruby gem}
1317 \begin{enumerate}
1318         \item Take a quick look at some documentation about Ruby packaging:\\
1319                 \begin{itemize}
1320                 \item \url{http://wiki.debian.org/Ruby}
1321       \hbr
1322                 \item \url{http://wiki.debian.org/Teams/Ruby}
1323       \hbr
1324                 \item \url{http://wiki.debian.org/Teams/Ruby/Packaging}
1325       \hbr
1326                 \item \texttt{gem2deb(1)}, \texttt{dh\_ruby(1)} (in the \texttt{gem2deb} package)
1327                 \end{itemize}
1328                 \hbr
1329         \item Create a basic Debian source package from the \texttt{net-ssh} gem:\\
1330                 \texttt{gem2deb net-ssh}
1331         \hbr
1332         \item Improve it so that it becomes a proper Debian package
1333 \end{enumerate}
1334 \end{frame}
1335
1336 \section{Answers to practical sessions}
1337
1338 \begin{frame}
1339         \begin{center}
1340                 \LARGE Answers to\\[0.5em]  practical sessions
1341         \end{center}
1342 \end{frame}
1343
1344
1345 \subsection{Practical session 1: modifying the grep package}
1346
1347 \begin{frame}{Practical session 1: modifying the grep package}
1348 \begin{enumerate}
1349   \item Go to \url{http://ftp.debian.org/debian/pool/main/g/grep/} and
1350     download version 2.6.3-3 of the package (if you use Ubuntu 11.10 or
1351     later, or Debian testing or unstable, use version 2.9-1 or 2.9-2 instead)
1352
1353         \item Look at the files in \texttt{debian/}.
1354                 \begin{itemize}
1355                         \item           How many binary packages are generated by this source package?
1356                         \item           Which packaging helper does this package use?
1357                 \end{itemize}
1358     \hbr
1359         \item Build the package
1360     \hbr
1361         \item We are now going to modify the package. Add a changelog entry and increase the version number.
1362     \hbr
1363         \item Now disable perl-regexp support (it is a \texttt{./configure} option)
1364     \hbr
1365         \item Rebuild the package
1366     \hbr
1367         \item Compare the original and the new package with debdiff
1368     \hbr
1369         \item Install the newly built package
1370     \hbr
1371         \item Cry if you messed up ;)
1372 \end{enumerate}
1373 \end{frame}
1374
1375 \begin{frame}{Fetching the source}
1376 \begin{enumerate}
1377         \item Go to \url{http://ftp.debian.org/debian/pool/main/g/grep/} and
1378                 download version 2.6.3-3 of the package
1379 \end{enumerate}
1380 \begin{itemize}
1381         \item Use dget to download the \texttt{.dsc} file:\\
1382                 {\small \texttt{dget http://cdn.debian.net/debian/pool/main/g/grep/grep\_2.6.3-3.dsc}}
1383                 \hbr
1384         \item According to \url{http://packages.qa.debian.org/grep}, \texttt{grep} version 2.6.3-3 is currently in \textsl{stable} (\textsl{squeeze}). If you have \texttt{deb-src} lines for \textsl{squeeze} in your \texttt{/etc/apt/sources.list}, you can use:\\
1385                 \texttt{apt-get source grep=2.6.3-3}\\
1386                 or \texttt{apt-get source grep/stable}\\
1387                 or, if you feel lucky: \texttt{apt-get source grep}
1388         \hbr
1389         \item The \texttt{grep} source package is composed of three files:
1390                 \begin{itemize}
1391                         \item \texttt{grep\_2.6.3-3.dsc}
1392                         \item \texttt{grep\_2.6.3-3.debian.tar.bz2}
1393                         \item \texttt{grep\_2.6.3.orig.tar.bz2}
1394                 \end{itemize}
1395                 This is typical of the "3.0 (quilt)" format.
1396         \hbr
1397 \item If needed, uncompress the source with\\
1398         \texttt{dpkg-source -x grep\_2.6.3-3.dsc}
1399 \end{itemize}
1400 \end{frame}
1401
1402 \begin{frame}{Looking around and building the package}
1403         \begin{enumerate}
1404                         \setcounter{enumi}{1}
1405         \item Look at the files in \texttt{debian/}.
1406                 \begin{itemize}
1407                         \item           How many binary packages are generated by this source package?
1408                         \item           Which packaging helper does this package use?
1409                 \end{itemize}
1410         \end{enumerate}
1411         \hbr
1412         \begin{itemize}
1413                 \item According to \texttt{debian/control}, this package only generates one binary package, named \texttt{grep}.
1414                         \hbr
1415                 \item According to \texttt{debian/rules}, this package is typical of \textsl{classic} debhelper packaging, without using \textsl{CDBS} or \textsl{dh}. One can see the various calls to \texttt{dh\_*} commands in \texttt{debian/rules}.
1416         \end{itemize}
1417         \hbr
1418         \begin{enumerate}
1419                         \setcounter{enumi}{2}
1420
1421                 \item Build the package
1422         \end{enumerate}
1423         \hbr
1424         \begin{itemize}
1425                 \item Use \texttt{apt-get build-dep grep} to fetch the build-dependencies
1426                 \item Then \texttt{debuild} or \texttt{dpkg-buildpackage -us -uc} (Takes about 1 min)
1427         \end{itemize}
1428 \end{frame}
1429
1430 \begin{frame}{Editing the changelog}
1431         \begin{enumerate}
1432                         \setcounter{enumi}{3}
1433
1434         \item We are now going to modify the package. Add a changelog entry and increase the version number.
1435         \end{enumerate}
1436         \hbr
1437         \begin{itemize}
1438                 \item \texttt{debian/changelog} is a text file. You could edit it and add a new entry manually.
1439         \hbr
1440                 \item Or you can use \texttt{dch -i}, which will add an entry and open the editor
1441         \hbr
1442                 \item The name and email can be defined using the \texttt{DEBFULLNAME} and \texttt{DEBEMAIL} environment variables
1443         \hbr
1444                 \item After that, rebuild the package: a new version of the package is built
1445         \hbr
1446                 \item Package versioning is detailed in section 5.6.12 of the Debian policy\\
1447                         \url{http://www.debian.org/doc/debian-policy/ch-controlfields.html}
1448         \end{itemize}
1449 \end{frame}
1450
1451 \begin{frame}{Disabling Perl regexp support and rebuilding}
1452         \begin{enumerate}
1453                         \setcounter{enumi}{4}
1454
1455         \item Now disable perl-regexp support (it is a \texttt{./configure} option)
1456         \item Rebuild the package
1457         \end{enumerate}
1458         \hbr
1459         \begin{itemize}
1460           \item Check with \texttt{./configure -{}-help}: the option to disable
1461             Perl regexp is \texttt{-{}-disable-perl-regexp}
1462         \hbr
1463                 \item Edit \texttt{debian/rules} and find the \texttt{./configure} line
1464         \hbr
1465                 \item Add \texttt{-{}-disable-perl-regexp}
1466         \hbr
1467                 \item Rebuild with \texttt{debuild} or \texttt{dpkg-buildpackage -us -uc}
1468         \end{itemize}
1469 \end{frame}
1470
1471 \begin{frame}{Comparing and testing the packages}
1472         \begin{enumerate}
1473                         \setcounter{enumi}{6}
1474
1475         \item Compare the original and the new package with debdiff
1476         \item Install the newly built package
1477         \end{enumerate}
1478         \hbr
1479         \begin{itemize}
1480                 \item Compare the binary packages: \texttt{debdiff ../*changes}
1481         \hbr
1482                 \item Compare the source packages: \texttt{debdiff ../*dsc}
1483         \hbr
1484                 \item Install the newly built package: \texttt{debi}\\
1485                         Or \texttt{dpkg -i ../grep\_<TAB>}
1486         \hbr
1487                 \item \texttt{grep -P foo} no longer works!
1488         \end{itemize}
1489 \br
1490 \begin{enumerate}
1491                 \setcounter{enumi}{8}
1492         \item Cry if you messed up ;)
1493 \end{enumerate}
1494 \hbr
1495 Or not: reinstall the previous version of the package:
1496 \begin{itemize}
1497         \item \texttt{apt-get install -{}-reinstall grep=2.6.3-3} \textit{(= previous version)}
1498 \end{itemize}
1499 \end{frame}
1500
1501 \subsection{Practical session 2: packaging GNUjump}
1502 \begin{frame}{Practical session 2: packaging GNUjump}
1503 \begin{enumerate}
1504         \item Download GNUjump 1.0.6 from
1505                 \url{http://ftp.gnu.org/gnu/gnujump/1.0.6/gnujump-1.0.6.tar.gz}
1506                 \br
1507         \item Create a Debian package for it
1508                 \begin{itemize}
1509                         \item Install build-dependencies so that you can build the package
1510                         \item Get a basic working package
1511                         \item Finish filling \texttt{debian/control} and other files
1512                 \end{itemize}
1513                 \br
1514         \item Enjoy
1515 \end{enumerate}
1516 \centerline{\includegraphics[width=5cm]{figs/gnujump.png}}
1517 \end{frame}
1518
1519 \begin{frame}[fragile]{Step by step\ldots}
1520 \begin{itemize}
1521         \item \texttt{wget http://ftp.gnu.org/gnu/gnujump/1.0.6/gnujump-1.0.6.tar.gz}
1522                 \hbr
1523         \item \texttt{mv gnujump-1.0.6.tar.gz gnujump\_1.0.6.orig.tar.gz}
1524                 \hbr
1525         \item \texttt{tar xf gnujump\_1.0.6.orig.tar.gz}
1526                 \hbr
1527         \item \texttt{cd gnujump-1.0.6/}
1528                 \hbr
1529         \item \texttt{dh\_make}
1530         \begin{itemize}
1531                 \item \small Type of package: single binary (for now)
1532         \end{itemize}
1533 \end{itemize}
1534 \begin{lstlisting}[basicstyle=\ttfamily\small]
1535 gnujump-1.0.6$ ls debian/
1536 changelog           gnujump.default.ex   preinst.ex
1537 compat              gnujump.doc-base.EX  prerm.ex
1538 control             init.d.ex            README.Debian
1539 copyright           manpage.1.ex         README.source
1540 docs                manpage.sgml.ex      rules
1541 emacsen-install.ex  manpage.xml.ex       source
1542 emacsen-remove.ex   menu.ex              watch.ex
1543 emacsen-startup.ex  postinst.ex
1544 gnujump.cron.d.ex   postrm.ex
1545 \end{lstlisting}
1546 \end{frame}
1547
1548 \begin{frame}[fragile]{Step by step\ldots (2)}
1549 \begin{itemize}
1550         \item Look at \texttt{debian/changelog}, \texttt{debian/rules}, \texttt{debian/control}\\
1551                 (auto-filled by \textbf{dh\_make})
1552                 \hbr
1553         \item In \texttt{debian/control}:\\
1554                 \texttt{Build-Depends: debhelper (>= 7.0.50~), autotools-dev}\\
1555                 Lists the \textsl{build-dependencies} = packages needed to build the package
1556                 \hbr
1557         \item Try to build the package as-is (thanks to \textbf{dh} magic)
1558                 \begin{itemize}
1559                         \item And add build-dependencies, until it builds
1560                         \item Hint: use \texttt{apt-cache search} and \texttt{apt-file} to find the packages
1561                         \item Example:
1562 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
1563 checking for sdl-config... no
1564 checking for SDL - version >= 1.2.0... no
1565 [...]
1566 configure: error: *** SDL version 1.2.0 not found!
1567 \end{lstlisting}
1568 $\rightarrow$ Add \textbf{libsdl1.2-dev} to Build-Depends and install it.
1569                 \hbr
1570         \item Better: use \textbf{pbuilder} to build in a clean environment
1571                 \end{itemize}
1572 \end{itemize}
1573 \end{frame}
1574
1575 \begin{frame}{Step by step\ldots (3)}
1576 \begin{itemize}
1577         \item After installing \texttt{libsdl1.2-dev, libsdl-image1.2-dev, libsdl-mixer1.2-dev}, the package builds fine.
1578                 \hbr
1579         \item Use \texttt{debc} to list the content of the generated package.
1580                 \hbr
1581         \item Use \texttt{debi} to install it and test it.
1582                 \hbr
1583         \item Fill in \texttt{debian/control} using \url{http://www.debian.org/doc/debian-policy/ch-controlfields.html}
1584                 \hbr
1585         \item Test the package with \texttt{lintian}
1586                 \hbr
1587         \item Remove the files that you don't need in \texttt{debian/}
1588                 \hbr
1589         \item Compare your package with the one already packaged in Debian:
1590                 \begin{itemize}
1591                         \item It splits the data files to a second package, that is the same across all architectures ($\rightarrow$ saves space in the Debian archive)
1592                         \item It installs a .desktop file (for the GNOME/KDE menus) and also integrates into the Debian menu
1593                         \item It fixes a few minor problems using patches
1594                 \end{itemize}
1595 \end{itemize}
1596 \end{frame}
1597
1598 \subsection{Practical session 3: packaging a Java library}
1599 \begin{frame}{Practical session 3: packaging a Java library}
1600 \begin{enumerate}
1601         \item Take a quick look at some documentation about Java packaging:\\
1602                 \begin{itemize}
1603                 \item \url{http://wiki.debian.org/Java}
1604       \hbr
1605                 \item \url{http://wiki.debian.org/Java/Packaging}
1606       \hbr
1607                 \item \url{http://www.debian.org/doc/packaging-manuals/java-policy/}
1608       \hbr
1609                 \item \url{http://pkg-java.alioth.debian.org/docs/tutorial.html}
1610       \hbr
1611                 \item Paper and slides from a Debconf10 talk about javahelper:\\
1612                         {\footnotesize
1613                         \url{http://pkg-java.alioth.debian.org/docs/debconf10-javahelper-paper.pdf}\\
1614                         \url{http://pkg-java.alioth.debian.org/docs/debconf10-javahelper-slides.pdf}}
1615                 \end{itemize}
1616                 \br
1617         \item Download IRClib from \url{http://moepii.sourceforge.net/}
1618                 \br
1619         \item Package it
1620 \end{enumerate}
1621 \end{frame}
1622
1623 \begin{frame}{Step by step\ldots}
1624 \begin{itemize}
1625         \item \texttt{apt-get install javahelper}
1626                 \hbr
1627         \item Create a basic source package: \texttt{jh\_makepkg}
1628                 \begin{itemize}
1629                         \item Library
1630                         \item None
1631                         \item Default Free compiler/runtime
1632                 \end{itemize}
1633                 \hbr
1634         \item Look at and fix \texttt{debian/*}
1635                 \hbr
1636         \item \texttt{dpkg-buildpackage -us -uc} or \texttt{debuild}
1637                 \hbr
1638         \item \texttt{lintian}, \texttt{debc}, etc.
1639                 \hbr
1640         \item Compare your result with the \texttt{libirclib-java} source package
1641 \end{itemize}
1642 \end{frame}
1643
1644 \subsection{Practical session 4: packaging a Ruby gem}
1645 \begin{frame}{Practical session 4: packaging a Ruby gem}
1646 \begin{enumerate}
1647         \item Take a quick look at some documentation about Ruby packaging:\\
1648                 \begin{itemize}
1649                 \item \url{http://wiki.debian.org/Ruby}
1650       \hbr
1651                 \item \url{http://wiki.debian.org/Teams/Ruby}
1652       \hbr
1653                 \item \url{http://wiki.debian.org/Teams/Ruby/Packaging}
1654       \hbr
1655                 \item \texttt{gem2deb(1)}, \texttt{dh\_ruby(1)} (in the \texttt{gem2deb} package)
1656                 \end{itemize}
1657                 \hbr
1658         \item Create a basic Debian source package from the \texttt{net-ssh} gem:\\
1659                 \texttt{gem2deb net-ssh}
1660         \hbr
1661         \item Improve it so that it becomes a proper Debian package
1662 \end{enumerate}
1663 \end{frame}
1664
1665 \begin{frame}{Step by step\ldots}
1666 \texttt{gem2deb net-ssh}:
1667 \begin{itemize}
1668 \item Downloads the gem from rubygems.org
1669 \item Creates a suitable .orig.tar.gz archive, and untar it
1670 \item Initializes a Debian source package based on the gem's metadata
1671         \begin{itemize}
1672                 \item Named \texttt{ruby-\textsl{gemname}}
1673         \end{itemize}
1674 \item Tries to build the Debian binary package (this might fail)
1675 \end{itemize}
1676 \br
1677 \texttt{dh\_ruby} (included in \textsl{gem2deb}) does the Ruby-specific tasks:
1678 \begin{itemize}
1679         \item Build C extensions for each Ruby version
1680         \item Copy files to their destination directory
1681         \item Update shebangs in executable scripts
1682         \item Run tests defined in \texttt{debian/ruby-tests.rb} or \texttt{debian/ruby-test-files.yaml}, as well as various other checks
1683 \end{itemize}
1684 \end{frame}
1685
1686 \begin{frame}[fragile]{Step by step\ldots (2)}
1687 Improve the generated package:
1688 \begin{itemize}
1689         \item Run \texttt{debclean} to clean the source tree. Look at \texttt{debian/}.
1690                 \hbr
1691         \item \texttt{changelog} and \texttt{compat} should be correct
1692                 \hbr
1693         \item Edit \texttt{debian/control}: uncomment \texttt{Homepage}, improve \texttt{Description}
1694                 \hbr
1695         \item Write a proper \texttt{copyright} file based on the upstream files
1696                 \hbr
1697         \item \texttt{ruby-net-ssh.docs}: install \texttt{README.rdoc}
1698                 \hbr
1699         \item \texttt{ruby-tests.rb}: run the tests. In that case, it is enough to do:\\
1700                 \verb+$: << 'test' << 'lib' << '.'+\\
1701                 \verb+require 'test/test_all.rb'+
1702 \end{itemize}
1703 \end{frame}
1704
1705 \begin{frame}[fragile]{Step by step\ldots (3)}
1706 Build the package.
1707 It fails to build. There are two problems:
1708 \begin{itemize}
1709         \item You need to disable the \texttt{gem} call in the test suite.\\
1710         In \texttt{test/common.rb}, remove the \verb+gem "test-unit"+ line:
1711                 \begin{itemize}
1712                         \item \texttt{edit-patch disable-gem.patch}
1713                         \item Edit \texttt{test/common.rb}, remove the \texttt{gem} line. Exit the sub-shell
1714                         \item Describe the changes in \texttt{debian/changelog}
1715                         \item Document the patch in \texttt{debian/patches/disable-gem.patch}
1716                 \end{itemize}
1717                 \hbr
1718
1719         \item The package lacks a build-dependency on \texttt{ruby-mocha},
1720                 which is used by the test suite (you might need to build your
1721                 package in a clean environment, using \texttt{pbuilder}, to
1722                 reproduce that problem)
1723
1724                 \begin{itemize}
1725                         \item Add \texttt{ruby-mocha} to the package's \texttt{Build-Depends}
1726
1727                         \item \textsl{gem2deb} copies the dependencies
1728                                 documented in the \textsl{gem} as comments in
1729                                 \texttt{debian/control}, but \textsl{mocha} is
1730                                 not listed as a development dependency by the
1731                                 gem (that's a bug in the gem)
1732                 \end{itemize}
1733 \end{itemize}
1734 \hbr
1735 Compare your package with the \texttt{ruby-net-ssh} package in the Debian archive
1736 \end{frame}
1737
1738 \end{document}