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