Sign in Join
Wiki copytemporary

Debian package structure: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Installations on Debian are provided as files with .deb extension. This article discusses how to build them manually.
22
33If you would like to bring your program to Debian distributions, see how to make a [[Debian upstream]] source.
44
55## General
66
77### Two types of packages
88
99There are two types of packages, a source package and a binary package. This article is about the binary packages. They are a convenient way to bundle up pre-compiled binaries ready to be supplied directly to an end user. However, distributions like Debian and Ubuntu will not accept to add a binary package in their repositories, they require a [[Debian package source|source package]] that can be used to build the binary version on demand. The [[Debian package source|source package]] is somewhat more difficult to assemble and is subject to a number of technical and legal rules before being acceptable to the major Linux distributions.
1010
1111### Preparing the package
1212
1313In a Debian binary package, the installation files are compressed using **dpkg-deb** command. You can view the content of the resulting .deb files as any other compressed archive by right-clicking them and opening them with the archive manager.
1414
1515To make a .deb file, you need to prepare a directory structure with the appropriate files. This will be called the staging directory and expressed in this article with the variable `${STAGING_DIR}`. You can replace it with the adequate folder or define this variable in a script.
1616
1717You can for example create the staging directory as a subdirectory of the current folder. The simplest script would be:
1818
1919`STAGING_DIR=./staging`\
2020`mkdir ${STAGING_DIR}`
2121
2222Though if you write a script, it may be run from another location. So instead, you can ensure that the variable contains the subdirectory relative to the script with the following:
2323
2424`` cd `dirname $0` ``\
2525`STAGING_RELATIVEDIR="./staging"`\
2626`STAGING_DIR=$(readlink --canonicalize "${STAGING_RELATIVEDIR}")`
2727
2828Also you may need to remove the existing staging directory to make sure it is empty:
2929
3030`rm -rf "${STAGING_DIR}"`\
3131`mkdir "${STAGING_DIR}"`
3232
3333The content of this directory is explained in the rest of this article.
3434
3535### Finalizing the staging directory
3636
3737Read the section *Directory structure* to add all the necessary files. Then you can finalize the directory.
3838
3939The directories and files are supposed to be read-only in the package. To ensure that's the case, you can before calling **dpkg-deb** do the following:
4040
4141`find "${STAGING_DIR}" -type d -exec chmod 0755 {} \;  #set directory attributes`\
4242`find "${STAGING_DIR}" -type f -exec chmod 0644 {} \;  #set data file attributes`\
4343`find "${STAGING_DIR}/usr/bin" -type f -exec chmod 0755 {} \;  #set executable attributes`
4444
4545When you have all file in the staging directory, you can determine the installed size and add it to the **control** file:
4646
4747`SIZE_IN_KB="$(du -s ${STAGING_DIR} | awk '{print $1;}')"`\
4848`echo "Installed-Size: ${SIZE_IN_KB}" >> "${STAGING_DIR}/DEBIAN/control"`
4949
5050### Creating the Deb archive
5151
5252Once the directory structure is ready, you can create the archive with:
5353
5454`dpkg-deb --root-owner-group --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"`
5555
5656Or for older versions of dpkg-deb:
5757
5858`fakeroot dpkg-deb --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"`
5959
6060`${STAGING_DIR}` is the path to the directory structure to compress. `${PACKAGE_NAME}` is the filename to use for the archive.
6161
6262Generally you will create the package as a regular user, not with the *root* account. But installation files must not belong to a specific user. Using `--root-owner-group` option or **fakeroot** prefix will save in the archive that the files belong instead to *root*.
6363
6464After that, you will probably not need the staging directory anymore, you can thus delete it:
6565
6666`rm -rf "${STAGING_DIR}"`
6767
6868### Checking the archive
6969
7070Once you've created the package, you can check it follows the guidelines with the command **lintian**:
7171
7272`lintian "${PACKAGE_NAME}.deb" --info`
7373
7474Here is the list of potential problems: <https://lintian.debian.org/tags.html>
7575
7676With Lazarus, you will get by default the `hardening-no-pie` (and `hardening-no-bindnow` warnings in mentors). To avoid such warnings, add the following compiler options in the project options:
7777
7878`-Cg`\
7979`-k-pie`\
8080`-k-znow`
8181
8282## Directory structure
8383
8484Here is the structure of the staging directory that you need to prepare.
8585
8686`staging`\
8787`  ├─ DEBIAN`\
8888`  └─ usr`\
8989`      ├─ bin`\
9090`      └─ share`\
9191`          ├─ project1       #resources of your package`\
9292`          ├─ applications   #shortcut`\
9393`          ├─ pixmaps        #default icon`\
9494`          ├─ icons`\
9595`          │   └─ hicolor    #icons of various sizes`\
9696`          ├─ doc`\
9797`          │   └─ project1   #information about your package`\
9898`          └─ man            #user manual`\
9999`              └─ man1       #index`
100100
101101### DEBIAN directory
102102
103103The name of this directory is uppercase. It needs to contain one file called **control**. Here is an example for a package called **project1** at version 2.0.
104104
105105`Section: graphics`\
106106`Priority: optional`\
107107`Maintainer: myname <myname@webserver.com>`\
108108`Homepage: `[`https://www.project1.com`](https://www.project1.com)\
109109`Package: project1`\
110110`Architecture: amd64`\
111111`Version: 2.0`\
112112`Depends: libatk1.0-0 (>= 1.12.4), libc6 (>= 2.2.5), libcairo2 (>= 1.2.4), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.12.0), libgtk2.0-0 (>= 2.24.0), libpango-1.0-0 (>= 1.18.0), libx11-6`\
113113`Description: This is a test project.`\
114114` Long description blah blah blah.`
115115
116116Sample values for **Section**: comm, database, devel, editors, electronics, fonts, games, graphics, math, web, net, news, science, sound, utils, video.
117117
118118The **Architecture** field is the one used to compile the program. To know the current architecture, use the following command:
119119
120120`dpkg --print-architecture`
121121
122122The **Depends** field contains the list of Linux libraries used. You can get this list with the following commands run in the directory of your binary file:
123123
124124`mkdir debian                 #need a debian directory`\
125125`touch debian/control         #with one control file in it`\
126126`dpkg-shlibdeps -O project1   #supposing your binary is called project1`
127127
128128You can then remove the almost empty *debian* folder if you don't use it.
129129
130130This will output the dependencies (after the equal sign):
131131
132132`shlibs:Depends=libatk1.0-0 (>= 1.12.4), libc6 (>= 2.2.5), libcairo2 (>= 1.2.4), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.12.0), libgtk2.0-0 (>= 2.24.0), libpango-1.0-0 (>= 1.18.0), libx11-6`
133133
134134To be complete, it should be noted that all these packages are not absolutely necessary, because several packages on this list may already be part of the dependencies - and therefore be part of the installation - of another package listed in this same list (see \[<https://wiki.freepascal.org/Deploying_Your_Application#Tip%3A%5Dto> cross-check, and eliminate superfluous dependencies).
135135
136136### usr/bin directory
137137
138138This directory contains the binary file and only this file (*for information, avoid underscore in the name of your project - for example, dpkg-deb refuses it - because the package name should follow this regex: \${PackageName}_\${Version}_\${Arch}.deb, e.g. dpkg-dev_1.19.0.5ubuntu2_all.deb*). All resources files need to go in *usr/share/project1*. To access resources, your program can use a relative path like *../share/project1*.
139139
140140The directory *usr/local/bin* is invalid in a package[1](https://lintian.debian.org/tags/file-in-usr-local.html) because *local* is used for projects compiled locally and installed using their Makefile.
141141
142142### Resources directory
143143
144144It will be called *usr/share/project1* if the package name is "project1".\
145145You can put here all the data files needed by your program. Note that they will be read-only.
146146
147147### Configuration directory
148148
149149There are other places to store [[Multiplatform Programming Guide|configuration files]]. Configuration files should be originally created by the application itself (with default values), if they do not exist when the application starts.
150150
151151### usr/share/applications directory
152152
153153To add your application to the Linux menu, you need to add a file called **project1.desktop** containing:
154154
155155`[Desktop Entry]`\
156156`Name=Project1`\
157157`Comment=Cool project`\
158158`Icon=project1`\
159159`Exec=project1`\
160160`Terminal=false`\
161161`Type=Application`\
162162`Categories=Graphics`\
163163`GenericName=Project1`\
164164`Keywords=feature1; feature2; feature3`
165165
166166This file is similar to a shortcut to your program.
167167
168168The **Categories** field is similar to the one in the **control** file. It can be for example: Communication, Database, Development, Editors, Electronics, Fonts, Games, Graphics, Math, Internet, Networking, News, Science, Sound, Utility, Video.
169169
170170The keywords help search through applications.
171171
172172Note that you need to provide the icon as a PNG file, either in the directory *usr/share/pixmaps* or in *usr/share/icons/hicolor*.
173173
174174#### usr/share/pixmaps directory
175175
176176Will contain the single-size icon of your menu shortcut in PNG format called **project1.png**. A medium size like 48x48 will be fine.
177177
178178#### usr/share/icons/hicolor directory
179179
180180Will contain the multi-size icon. Here is the directory structure:
181181
182182`icons`\
183183` └─ hicolor`\
184184`     ├─ 8x8`\
185185`     │   └─ apps`\
186186`     ├─ 16x16`\
187187`     │   └─ apps`\
188188`     ...`
189189
190190There is a subdirectory for each possible size. You can display all the sizes currently defined on your system by writing:
191191
192192`ls /usr/share/icons/hicolor`
193193
194194In each apps folder, put an image with always the same name. If you project is called project1 then it will be called **project1.png** for most folders. In the scalable and symbolic folders you can put an SVG file.
195195
196196### Documentation directory
197197
198198It will be called *usr/share/doc/project1* if your the package name is "project1".
199199
200200The folder contains the **changelog.Debian.gz** and **copyright** files and optionally the **README** file.
201201
202202#### changelog file
203203
204204The minimum changelog would be:
205205
206206`project1 (1.0) unstable; urgency=low`\
207-\
207+
208208`  * Initial release`\
209-\
209+
210210` -- myname <myname@webserver.com>  Tue, 19 May 2020 11:06:00 +0100`
211211
212212You can add many lines starting with * to indicate the list of changes in the version. The spaces at the beginning of the line are necessary. Only the line indicating the version starts directly at the beginning of the line.
213213
214214The latest version must be at the top of the file.
215215
216216The changelog must be compressed with maximum compression. To do that, supposing you already have the uncompressed **changelog** file, compress it with the following command:
217217
218218`gzip -9 -n usr/share/doc/project1/changelog.Debian`
219219
220220The -9 -n options are necessary for the package to follow the guidelines.
221221
222222#### copyright file
223223
224224If you provide the Deb package yourself, it is not mandatory to use the machine-readable format, however it will prepare you for publishing the package in Debian distributions. See: [[Debian package source|copyright in Debian package structure]].
225225
226226### usr/share/man directory
227227
228228Contains the user manual that you can view with the **man** command. It must contain at least **project1.1.gz** in the *man1* subdirectory, which will be the index page of your manual.
229229
230230The syntax is a bit peculiar. There are some tools to help but you still need to know the syntax.
231231
232232- description of the syntax: <https://liw.fi/manpages/>
233233- editor with wizard and WYSIWYG preview mode: **gmanedit**
234234- live preview editor (toggle to AN mode): <https://roperzh.github.io/grapse/>
235235
236236Here is a sample file:
237237
238238`.TH Project1 1 "19 May 2020" "" Project1`\
239239`.SH NAME`\
240240`Project1 - My cool project`\
241241`.SH SYNOPSIS`\
242242`.B project1`\
243243`[PARAMETER]`\
244244`.SH DESCRIPTION`\
245245`What my program does.`\
246246`.PP`\
247247`More description.`
248248
249249The manual, like the changelog, must be compressed using the following command:
250250
251251`gzip -9 -n usr/share/man/man1/project1.1`
252252
253253The -9 -n options are necessary for the package to follow the guidelines.
254254
255255---
256256*From the Free Pascal wiki, page "Debian package structure", as it stood on 2022-01-02 after a change by FTurtle, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history