Difference between revisions of "Debian package structure"

From Free Pascal wiki
Jump to navigationJump to search
(→‎General: checking package)
m (→‎usr/share/man directory: project1 binary)
Line 146: Line 146:
 
  Project1 - My cool project
 
  Project1 - My cool project
 
  .SH SYNOPSIS
 
  .SH SYNOPSIS
  .B lazpaint
+
  .B project1
 
  [PARAMETER]
 
  [PARAMETER]
 
  .SH DESCRIPTION
 
  .SH DESCRIPTION

Revision as of 11:04, 20 May 2020

Installations on Debian are provided as files with .deb extension. This article discusses how to build them manually.

General

The Debian installation files are compressed archives using dpkg-deb command. You can view their content as any other compressed archive by right-clicking them and opening them with the archive manager.

To make a .deb file, you need to prepare a directory structure with the appropriate files. Once it is ready, you can create the archive with:

dpkg-deb --root-owner-group --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"

Or for older versions of dpkg-deb:

fakeroot dpkg-deb --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"

${STAGING_DIR} is the path to the directory structure to compress. ${PACKAGE_NAME} is the filename to use for the archive.

Generally 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.

The directories are supposed to be read-only in the package. To ensure that's the case, you can before calling dpkg-deb do the following for each folder:

chmod 0755 staging/DEBIAN
chmod 0755 staging/usr
...

Once you've created the package, you can check it follows the guidelines with the command lintian:

lintian "${PACKAGE_NAME}.deb" --info

Directory structure

Here is the structure of the staging directory that you need to prepare.

staging
  ├─ DEBIAN
  └─ usr
      ├─ bin
      └─ share
          ├─ project1       #resources of your package
          ├─ applications   #shortcut
          ├─ pixmaps        #icon
          ├─ doc
          │   └─ project1   #information about your package
          └─ man            #user manual
              └─ man1       #index

DEBIAN directory

The name of this directory is uppercase. It needs to contain one file called control. Here is an example:

Package: project1
Version: 1.0
Section: graphics
Priority: optional
Architecture: amd64
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
Maintainer: myname <myname@webserver.com>
Homepage: https://www.project1.com
Description: This is a test project.
 Long description blah blah blah.

Sample values for Section: comm, database, devel, editors, electronics, fonts, games, graphics, math, web, net, news, science, sound, utils, video.

The Architecture field is the one used to compile the program. To know the current architecture, use the following command:

dpkg --print-architecture

The 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:

mkdir debian                 #need a debian directory
touch debian/control         #with one control file in it
dpkg-shlibdeps -O project1   #supposing your binary is called project1

You can then remove the almost empty debian folder if you don't use it.

This will output the dependencies (after the equal sign):

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

usr/bin directory

This directory contains the binary file and only this file. All resources files need to go in usr/share/project1. To access resources, your program can use a relative path like ../share/project1.

The directory usr/local/bin is invalid in a package[1].

Resources directory

It will be called usr/share/project1 if your the package name is "project1".

You can put here all the data files needed by your program. Note that they will be read-only. There are other places to store configuration files.

usr/applications directory

To add your application to the Linux menu, you need to add a file called project1.desktop containing:

[Desktop Entry]
Encoding=UTF-8
Name=Project1
Comment=Cool project
Icon=/usr/share/pixmaps/project1.png
Exec=/usr/bin/project1
Terminal=false
Type=Application
Categories=Graphics
GenericName=Project1

This file is similar to a shortcut to your program.

The 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.

Note that you need to provide the icon as a PNG file in the directory usr/share/pixmaps.

usr/pixmaps directory

Will contain the icon of your menu shortcut (see above).

Documentation directory

It will be called usr/doc/project1 if your the package name is "project1".

The folder contains the changelog.gz and copyright files and optionally the README file.

changelog file

The minimum changelog would be:

project1 (1.0) unstable; urgency=low

  * Initial release

 -- myname <myname@webserver.com>  Tue, 19 May 2020 11:06:00 +0100

You 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.

The latest version must be at the top of the file.

The changelog must be compressed with maximum compression. To do that, supposing you already have the uncompressed changelog file, compress it with the following command:

gzip -9 -n usr/doc/project1/changelog

The -9 -n options are necessary for the package to follow the guidelines.

copyright file

You can copy the copyright file of another package having the same license.

usr/share/man directory

Contains 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.

The syntax is a bit peculiar. You will find more information on it here: https://liw.fi/manpages/

Here is a sample file:

.TH Project1 1 "19 May 2020" "" Project1
.SH NAME
Project1 - My cool project
.SH SYNOPSIS
.B project1
[PARAMETER]
.SH DESCRIPTION
What my program does.
.PP
More description.

The manual, like the changelog, must be compressed using the following command:

gzip -9 -n usr/man/man1/project1.1

The -9 -n options are necessary for the package to follow the guidelines.