summaryrefslogtreecommitdiff
path: root/application-devel/debian-packages/pres_debian_packages_en.tex
blob: bae8a19dd0dc67a32791edd37478c7fc096f9227 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
% on the following slides, include icon in the left sidebar

\input{configpres}

\section{Debian}
\title{Building Debian Packages}
\maketitle

\subsection{Basics}
\begin{frame}
\frametitle{Debian Packages}
\begin{itemize}
\item Binary packages
\item Source packages
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Binary packages}
\begin{alertblock}{What is a binary package?}
A binary package contains executables, configuration files, documentation and
copyright information.
\end{alertblock}
\end{frame}

\begin{frame}
\frametitle{Package types}
\begin{itemize}
\item single binary
\item multiple binary
\item library
\item kernel module
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Source packages}
\begin{alertblock}{What is a source package?}
A source package contains the unmodified source code of a package and usually a file
which describes the debian specific changes.
\end{alertblock}
\end{frame}

\begin{frame}[fragile]
\frametitle{Binary packages}
\small
\begin{verbatim}
$ ar tv barcode_0.98+debian-8_amd64.deb
rw-r--r-- 0/0      4 Sep 11 15:40 2009 debian-binary
rw-r--r-- 0/0    889 Sep 11 15:40 2009 control.tar.gz
rw-r--r-- 0/0  79118 Sep 11 15:40 2009 data.tar.gz
\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{Binary packages}
\begin{verbatim}
debian-binary
\end{verbatim}
Contains the version of the Debian file format.
\end{frame}

\begin{frame}[fragile]
\frametitle{Binary packages}
\begin{verbatim}
data.tar.gz
\end{verbatim}
Contains the files to be installed.
\end{frame}

\begin{frame}[fragile]
\frametitle{Binary packages}
\begin{verbatim}
control.tar.gz
\end{verbatim}
Contains the ''administrative'' files, like ''control'', ''md5sums'', ...
\end{frame}

\begin{frame}[fragile]
\frametitle{Source packages}
\begin{verbatim}
$ apt-get source barcode
[...]
$ ls -1
total 376
barcode-0.98+debian
barcode_0.98+debian-8.diff.gz
barcode_0.98+debian-8.dsc
barcode_0.98+debian.orig.tar.gz
\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{Source packages}
\begin{verbatim}
barcode_0.98+debian.orig.tar.gz
\end{verbatim}
Contains the original unmodified source code.
\end{frame}

\begin{frame}[fragile]
\frametitle{Source packages}
\begin{verbatim}
barcode_0.98+debian-8.diff.gz
\end{verbatim}
Contains the debian specific changes. If there's no difference to the upstream
package, only the .tar.gz file will be provided.
\end{frame}

\begin{frame}[fragile]
\frametitle{Source packages}
\begin{verbatim}
barcode_0.98+debian-8.dsc
\end{verbatim}
Contains meta-information about the source package.
\end{frame}

\begin{frame}[fragile]
\frametitle{Source packages: The debian/ directory}
\begin{verbatim}
$ ls -1 barcode-0.98+debian/debian/
[...]
changelog
control
copyright
rules
[...]
\end{verbatim}
\end{frame}

\begin{frame}
\frametitle{debian/control}
Contains a couple of fields describing the package:
\begin{itemize}
\item Architecture
\item Dependencies
\item Maintainer
\item Description
\item Section
\item ...
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{debian/rules}
This is a Makefile containing some rules on how to handle the source files.
Mandatory targets are:
\begin{itemize}
\item clean
\item build
\item binary
\item binary-arch
\item binary-indep
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{debian/changelog}
Information about:
\begin{itemize}
\item version number
\item revisions
\item bugfixes
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{debian/copyright}
Copyright information:
\begin{itemize}
\item author(s)
\item upstream author(s)
\item licensing information
\end{itemize}
\end{frame}

\subsection{Creating Debian Packages}
\begin{frame}[fragile]
\frametitle{Documentation}
\begin{verbatim}
$ apt-get install debian-policy
$ ls /usr/share/doc/debian-policy/
\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{Building binary packages}
\begin{enumerate}
\item Download / Create the source code
\item Prepare a skeleton using dh\_make
\item Customize the files in debian/
\item Build the package using dpkg-buildpackage
\item Optional: Debug using lintian or linda
\end{enumerate}
\end{frame}

\begin{frame}[fragile]
\frametitle{Setting up the environment}
\begin{lstlisting}
export DEBEMAIL=musermann@mustermail.org
export DEBFULLNAME="Max Mustermann"
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{Preparing / Building}
Exercise:
\begin{enumerate}
\item Create a directory hello-1.2.3
\item Change to the directory and create hello.c and a corresponding Makefile (which should also provide a clean target)
\item Then do:
\end{enumerate}
\begin{lstlisting}
# tar your sources
tar zvf hello-1.2.3.tar.gz hello-1.2.3
# 
$ cd hello-1.2.3
$ dh_make -f ../hello-1.2.3.tar.gz
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{dh\_make}
\tiny
\begin{verbatim}
Type of package: single binary, multiple binary, library, kernel module or
cdbs?
 [s/m/l/k/b] s

Maintainer name : Max Mustermann
Email-Address   : musermann@mustermail.org 
Date            : Fri, 25 Feb 2011 10:53:00 +0000
Package Name    : hello
Version         : 1.2.3
License         : blank
Using dpatch    : no
Type of Package : Single
Hit <enter> to confirm: 
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the hello Makefiles install into $DESTDIR and not in / .
\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{Adjust the files}
\tiny
\begin{verbatim}
# debian/control
Source: hello
Section: unknown
Priority: extra
Maintainer: Max Mustermann <musermann@mustermail.org>
Build-Depends: debhelper (>= 7)
Standards-Version: 3.7.3
Homepage: <insert the upstream URL, if relevant>

Package: hello
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: <insert up to 60 chars description>
 <insert long description, indented with spaces>

\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{Modify debian/rules}
If your Makefile doesn't provide an install target, modify the following line:\\
Replace
\begin{verbatim}
install:
  [...]

  $(MAKE) DESTDIR=$(CURDIR)/debian/hello install
\end{verbatim}
by
\begin{verbatim}
install:
  [...]

  install -D -m 755 hello \
       $(CURDIR)/debian/hello/bin/hello
\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{Building the package}
Now you can build the package with:
\begin{verbatim}
dpkg-buildpackage
\end{verbatim}
Afterwards you should see a file named hello\_1.2.3-1\_i386.deb in ../
\small
\begin{verbatim}
$ dpkg -I ../hello_1.2.3-1_i386.deb
new debian package, version 2.0.
 size 3028 bytes: control archive= 536 bytes.
     330 bytes,    11 lines      control              
     246 bytes,     4 lines      md5sums              
 Package: hello
 Version: 1.2.3-1
 Architecture: i386
 Maintainer: Max Mustermann <musermann@mustermail.org>
[...]
\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{Packages based on binary data}
\begin{verbatim}
mkdir debian
mkdir debian/bin
mkdir debian/DEBIAN
cp hello debian/bin
\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{Packages based on binary data}
vim debian/DEBIAN/control
\small
\begin{verbatim}
Package: hellobin
Version: 0815
Section: misc
Priority: optional
Architecture: all
Depends: libc6 (>= 2.6)
Maintainer: Max Mustermann
Description: 42
 The hitchhikers guide might give you some more
 information about the number 42 ;)
\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{Packages based on binary data}
\begin{verbatim}
$ dpkg-deb --build debian hellobin.deb
$ dpkg -I hellobin.deb
 new debian package, version 2.0.
 size 3304 bytes: control archive= 317 bytes.
     234 bytes,    10 lines      control              
 Package: hellobin
...
\end{verbatim}
\end{frame}

\subsection{debconf}
\begin{frame}[fragile]
\frametitle{debconf: The template file}
vim debian/hello.templates
\begin{verbatim}
Template: hello/some_question
Type: boolean
Description: Just say yes or no ;-)
 Just a simple debconf example.
\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{debconf: The config file}
vim debian/hello.config
\begin{verbatim}
. /usr/share/debconf/confmodule

db_input critical hello/some_question
db_go
\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{debconf: The config file}
vim debian/rules
\begin{verbatim}
...
dh_installdebconf
...
\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{debconf: The config file}
vim debian/hello.postinst
\begin{verbatim}
#!/bin/sh -e

. /usr/share/debconf/confmodule

db_get hello/some_question
echo user answered "$RET"
\end{verbatim}
\end{frame}

\subsection{sources}
\begin{frame}
\begin{thebibliography}{1}
\bibitem{debm} http://www.debian.org/doc/maint-guide/
\bibitem{tldp} http://tldp.org/HOWTO/Debian-Binary-Package-Building-HOWTO/x60.html
\bibitem{abut} Grundlagen des Debian Paketverwaltungssystems - Fatih Abut (Hochschule Bonn-Rhein-Sieg)
\end{thebibliography} 

\end{frame}
\input{tailpres}