Table of Contents
Für die grundlegenden Regeln der Debian-Paketierung wird hier ein breiter Überblick gegeben, der sich auf nichtnative Debian-Pakete im Format »3.0 (quilt)« konzentriert.
![]() |
Note |
---|---|
Zu Gunsten der Klarheit werden einige Details bewusst übergangen. Bitte lesen Sie die Handbuchseiten von dpkg-source(1), dpkg-buildpackage(1), dpkg(1), dpkg-deb(1), deb(5) usw. |
Das Debian-Quellpaket ist eine Gruppe von Eingabedateien (d.h. nicht eine einzelne Datei), die zum Bau des Debian-Binärpakets verwandt werden.
Das Debian-Binärpaket ist eine besondere Archivdatei, die die Gruppe der installierbaren Binärdaten mit ihren zugehörigen Informationen enthält.
Ein einzelnes Debian-Quellpaket kann mehrere Debian-Binärpakete, die in der Datei debian/control definiert sind, installieren.
Das nichtnative Debian-Paket im Format »3.0 (quilt)« ist das gängigste Debian-Quellpaketformat.
![]() |
Note |
---|---|
There are many wrapper scripts. Use them to streamline your workflow but make sure to understand the basics of their internals. |
Der Arbeitsablauf beim Paketieren, um ein Debian-Binärpaket zu erstellen, beinhaltete die Erstellung mehrere Dateien mit bestimmten Namen (siehe Section 5.4, “Paketname und -version”), wie dies in dem »Debian Policy Manual« definiert ist.
Stark vereinfacht kann der Arbeitsablauf beim Debian-Paketieren in folgende 10 Schritte zusammengefasst werden:
The upstream tarball is copied (or symlinked) to the particular filename packagename_version.orig.tar.gz.
The Debian package specification files are added to the upstream source under the package-version/debian/ directory.
Required specification files under the debian/ directory:
The debmake command invoked in the package-version/ directory provides the initial set of these template configuration files.
The dpkg-buildpackage command (usually from its wrapper debuild or sbuild) is invoked in the package-version/ directory to make the Debian source and binary packages by invoking the debian/rules script.
Create the Debian source package in the “3.0 (quilt)” format using dpkg-source(1)
Build the source using “debian/rules build” into $(DESTDIR)
Create the Debian binary package using dpkg-deb(1), dpkg-genbuildinfo(1), and dpkg-genchanges(1).
Check the quality of the Debian package with the lintian command. (recommended)
Follow the rejection guidelines from ftp-master.
Test building and confirming of the binary package goodness as above is the moral obligation as a diligent Debian developer but there is no physical barrier for people to skip such operations at this moment for the source-only upload.
Under some exceptional situation such as NEW uploads, uploads to the Debian archive may need to include Debian binary package files. For such situation, sign package_version-revision_arch.changes instead of 'package_version-revision’_*source.changes* in the step 9, and upload the set of the Debian source and binary package files in the step 10.
Here, please replace each part of the filename as:
See also Source-only uploads.
![]() |
Tip |
---|---|
Many patch management and VCS usage strategies for the Debian packaging are practiced. You don’t need to use all of them. |
![]() |
Tip |
---|---|
There is very extensive documentation in Chapter 6. Best Packaging Practices in the “Debian Developer’s Reference”. Please read it. |
Although a Debian package can be made by writing a debian/rules script without using the debhelper package, it is impractical to do so. There are too many modern “Policy” required features to be addressed, such as application of the proper file permissions, use of the proper architecture dependent library installation path, insertion of the installation hook scripts, generation of the debug symbol package, generation of package dependency information, generation of the package information files, application of the proper timestamp for reproducible build, etc.
Debhelper package provides a set of useful scripts in order to simplify Debian’s packaging workflow and reduce the burden of package maintainers. When properly used, they will help packagers handle and implement “Policy” required features automatically.
The modern Debian packaging workflow can be organized into a simple modular workflow by:
You should almost always use debhelper as your package’s build dependency. This document also assumes that you are using a fairly contemporary version of debhelper to handle packaging works in the following contents.
Let me oversimplify historical perspective of Debian packaging practices.
Debian
was started in 1990s when upstream packages were available from
public FTP sites such as Sunsite. In those early
days, Debian packaging used dpkg-source currently known as "Format:
1.0
":
In order to address issues of old dpkg-source "Format:
1.0
", new dpkg-source "Format: 3.0 (quilt)
" was
invented around 2008:
Format:
3.0 (quilt)
" to manage topic patches and made Debian packages
while keeping files outside of debian/
directory
untouched.
gbp-buildpackage
(1)
style.
gbp-buildpackage
(1) workflow records the exact same
content of the upstream tarball to VCS for source files outside of
debian/
directory (= patch-unapplied).
The use of Git repositories to distribute upstream packages with signed tags (supported feature since 2011) became very popular.
gbp-buildpackage
(1) workflow to
record changes to VCS was cumbersome for some Debian developers and
dgit
(1) was invented in 2013.
dgit-maint-debrebase
(7) and
dgit-maint-merge
(7) workflows to record changes to VCS
are gaining popularity among these Debian developers.
dgit-maint-debrebase
(7)
and git-maint-merge
(7) are modified upstream source files
(= patch-applied).
dgit-maint-debrebase
(7) and
git-maint-merge
(7) workflows still use dpkg-source
"Format: 3.0 (quilt)
".
Debian also enforced the source-only upload when developing Debian/11 Bullseye (released in 2021).
In this tutorial, mostly simple tarball based dpkg-source "Format:
3.0 (quilt)
" examples are presented as an introductory purpose.
Please asses these VCS usage approaches by yourself later to decide which one to deploy as your preferred one.
Please look around to understand how Debian packaging practices are evolving and follow the current general trends if possible.
DEP - Debian Enhancement Proposals
Debian git packaging maintainer branch formats and workflows
dgit
tool providers.
You can also search entire Debian source code by yourself, too.
Debian Sources — code search tool
Falls die Quellen der Originalautoren als hello-0.9.12.tar.gz vorliegen, könen Sie hello als Namen des Quellpakets der Originalautoren und 0.9.12 als Version der Originalautoren nehmen.
debmake is meant to provide template files for the package maintainer to work on. Comment lines started by # contain the tutorial text. You must remove or edit such comment lines before uploading to the Debian archive.
The license extraction and assignment process involves a lot of heuristics; it may fail in some cases. It is highly recommended to use other tools such as licensecheck from the devscripts package in conjunction with debmake.
There are some limitations for what characters may be used as a part of the Debian package. The most notable limitation is the prohibition of uppercase letters in the package name. Here is a summary as a set of regular expressions:
See the exact definition in Chapter 5 - Control files and their fields in the “Debian Policy Manual”.
debmake assumes relatively simple packaging cases. So all programs related to the interpreter are assumed to be "Architecture: all". This is not always true.
You must adjust the package name and upstream version accordingly for the Debian packaging.
In order to manage the package name and version information effectively under popular tools such as the aptitude command, it is a good idea to keep the length of package name to be equal or less than 30 characters; and the total length of version and revision to be equal or less than 14 characters. [10]
In order to avoid name collisions, the user visible binary package name should not be chosen from any generic words.
If upstream does not use a normal versioning scheme such as 2.30.32 but uses some kind of date such as 11Apr29, a random codename string, or a VCS hash value as part of the version, make sure to remove them from the upstream version. Such information can be recorded in the debian/changelog file. If you need to invent a version string, use the YYYYMMDD format such as 20110429 as upstream version. This ensures that the dpkg command interprets later versions correctly as upgrades. If you need to ensure a smooth transition to a normal version scheme such as 0.1 in the future, use the 0~YYMMDD format such as 0~110429 as upstream version, instead.
Version strings can be compared using the dpkg command as follows.
$ dpkg --compare-versions ver1 op ver2
The version comparison rule can be summarized as:
There are special rules for period (.), plus (+), and tilde (~) characters, as follows.
0.0 < 0.5 < 0.10 < 0.99 < 1 < 1.0~rc1 < 1.0 < 1.0+b1 < 1.0+nmu1 < 1.1 < 2.0
One tricky case occurs when the upstream releases hello-0.9.12-ReleaseCandidate-99.tar.gz as the pre-release of hello-0.9.12.tar.gz. You can ensure the Debian package upgrade to work properly by renaming the upstream source to hello-0.9.12~rc99.tar.gz.
The non-native Debian package in the “3.0 (quilt)” format is the most normal Debian source package format. The debian/source/format file should have “3.0 (quilt)” in it as described in dpkg-source(1). The above workflow and the following packaging examples always use this format.
A native Debian package is the rare Debian binary package format. It may be used only when the package is useful and valuable only for Debian. Thus, its use is generally discouraged.
![]() |
Caution |
---|---|
A native Debian package is often accidentally built when its upstream tarball is not accessible from the dpkg-buildpackage command with its correct name package_version.orig.tar.gz . This is a typical newbie mistake caused by making a symlink name with “-” instead of the correct one with “_”. |
A native Debian package has no separation between the upstream code and the Debian changes and consists only of the following:
If you need to create a native Debian package, create it in the “3.0 (native)” format using dpkg-source(1).
![]() |
Tip |
---|---|
Some people promote packaging even programs that have been written only for Debian in the non-native package format. The required tarball without debian/* files needs to be manually generated in advance before the standard workflow in Section 5.1, “Arbeitsablauf des Paketierens”. [11] They claim that the use of non-native package format eases communication with the downstream distributions. |
![]() |
Tip |
---|---|
There is no need to create the tarball in advance if the native package format is used. The native Debian package can be created by setting the debian/source/format file to “3.0 (native)”, setting the debian/changelog file to have the version without the Debian revision (1.0 instead of 1.0-1), and invoking the “dpkg-source -b .” command within the source tree. The tarball containing the source is generated by this. |
Das Skript debian/rules ist das ausführbare Skript, um das Debian-Paket zu bauen.
The debian/rules script re-targets the upstream build system (see Section 5.18, “Bausysteme der Originalautoren”) to install files in the $(DESTDIR) and creates the archive file of the generated files as the deb file.
$(DESTDIR) path depends on the build type.
The dh command from the debhelper package with help from its associated packages functions as the wrapper to the typical upstream build systems and offers us uniform access to them by supporting all the Debian policy stipulated targets of the debian/rules file.
![]() |
Note |
---|---|
For debhelper “compat >= 9”, the dh command exports compiler flags (CFLAGS, CXXFLAGS, FFLAGS, CPPFLAGS and LDFLAGS) with values as returned by dpkg-buildflags if they are not set previously. (The dh command calls set_buildflags defined in the Debian::Debhelper::Dh_Lib module.) |
Thanks to this abstraction of the dh command [12], the Debian policy compliant debian/rules file supporting all the required targets can be written as simple as [13]:
Simple debian/rules:
#!/usr/bin/make -f #export DH_VERBOSE = 1 %: dh $@
Essentially, this dh command functions as the sequencer to call all required dh_* commands at the right moment.
![]() |
Tip |
---|---|
Setting “export DH_VERBOSE = 1” outputs every command that modifies files on the build system. Also it enables verbose build logs for some build systems. |
Flexible customization of the debian/rules script is realized by adding appropriate override_dh_* targets and their rules.
Whenever some special operation is required for a certain dh_foo command invoked by the dh command, any automatic execution of it can be overridden by adding the makefile target override_dh_foo in the debian/rules file.
The build process may be customized via the upstream provided interface such as arguments to the standard source build system commands, such as:
If this is the case, you should add the override_dh_auto_build target and executing the “dh_auto_build -- arguments” command. This ensures passing arguments to the such build system after the default parameters that dh_auto_build usually passes.
![]() |
Tip |
---|---|
Please try not to execute the above build system commands directly if they are supported by the dh_auto_build command. |
The debmake command creates the initial template file taking advantage of the above simple debian/rules file example while adding some extra customizations for package hardening, etc. You need to know how underlying build systems work under the hood (see Section 5.18, “Bausysteme der Originalautoren”) to address their irregularities using package customization.
Some variable definitions useful for customizing debian/rules can be found in files under /usr/share/dpkg/. Notably:
If you wish to use some of these useful variables in debian/rules, copy relevant code to debian/rules or write a simpler alternative in it. Please keep debian/rules simple.
Beispielsweise können Sie eine Zusatzoption zu CONFIGURE_FLAGS für die Zielarchitektur linux-any durch Hinzufügen von folgendem zur debian/rules hinzufügen:
DEB_HOST_ARCH_OS ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS) ... ifeq ($(DEB_HOST_ARCH_OS),linux) CONFIGURE_FLAGS += --enable-wayland endif
![]() |
Tip |
---|---|
It was useful to include buildflags.mk in debian/rules to set the build flags such as CPPFLAGS, CFLAGS, LDFLAGS, etc. properly while honoring DEB_CFLAGS_MAINT_APPEND, DEB_BUILD_MAINT_OPTIONS, etc. for the debhelper “compat <= 8”. Now you should use the debhelper “compat >= 9”, should not include buildflags.mk without specific reasons, and should let the dh command set these build flags. |
Siehe Section 5.22, “Multiarch”, dpkg-architecture(1) und dpkg-buildflags(1).
Here are some recommendations to attain a reproducible build result.
Lesen Sie mehr unter Reproduzierbares Bauen.
Die durch dpkg-genbuildinfo(1) erstellte Steuerdatei source-name_source-version_arch.buildinfo zeichnet die Bauumgebung auf. Siehe deb-buildinfo(5)
Die Datei debian/control besteht aus Metadatenblöcken, die durch Leerzeilen getrennt sind. Jeder Metadatenblock definiert folgendes in dieser Reihenfolge:
See Chapter 5 - Control files and their fields of the “Debian Policy Manual” for the definition of each meta data.
![]() |
Note |
---|---|
The debmake command sets the debian/control file with “Build-Depends: debhelper-compat (= 13)” to set the debhelper compatibility level. |
![]() |
Tip |
---|---|
If an existing package has lower than debhelper compatibility level 9, probably it’s time to update its packaging. |
For well behaving build systems, the split of a Debian binary package into small ones can be realized as follows.
Bitte prüfen Sie die Beispiele in dieser Anleitung:
The debmake command with the -b option provides an intuitive and flexible method to create the initial template debian/control file defining the split of the Debian binary packages with following stanzas:
The debmake command also sets an appropriate set of substvars used in each pertinent dependency stanza.
Let’s quote the pertinent part from the debmake manpage here.
set the binary package specs by a comma separated list of binarypackage:type pairs, e.g., in the full form “foo:bin,foo-doc:doc,libfoo1:lib,libfoo-dev:dev” or in the short form, “-doc,libfoo1,libfoo-dev”.
Here, binarypackage is the binary package name, and the optional type is chosen from the following type values:
The pair values in the parentheses, such as (any, foreign), are the Architecture and Multi-Arch stanza values set in the debian/control file.
In many cases, the debmake command makes good guesses for type from binarypackage. If type is not obvious, type is set to bin. For example, libfoo sets type to lib, and font-bar sets type to data, …
If the source tree contents do not match settings for type, the debmake command warns you.
Here are some typical multiarch package split scenarios for the following upstream source examples using the debmake command:
Binärpaket | Typ | Architecture: | Multi-Arch: | Paketinhalt |
---|---|---|---|---|
lib foo1 |
lib * |
any |
same |
die Laufzeitbibliothek, koinstallierbar |
lib foo -dev |
dev * |
any |
same |
the shared library header files etc., co-installable |
lib foo -tools |
bin * |
any |
foreign |
the run-time support programs, not co-installable |
lib foo -doc |
doc * |
all |
foreign |
the shared library documentation files |
bar |
bin * |
any |
foreign |
the compiled program files, not co-installable |
bar -doc |
doc * |
all |
foreign |
the documentation files for the program |
baz |
script |
all |
foreign |
the interpreted program files |
Let’s consider that the upstream source tarball of the libfoo library is updated from libfoo-7.0.tar.gz to libfoo-8.0.tar.gz with a new SONAME major version which affects other packages.
The binary library package must be renamed from libfoo7 to libfoo8 to keep the unstable suite system working for all dependent packages after the upload of the package based on the libfoo-8.0.tar.gz.
![]() |
Warning |
---|---|
If the binary library package isn’t renamed, many dependent packages in the unstable suite become broken just after the library upload even if a binNMU upload is requested. The binNMU may not happen immediately after the upload due to several reasons. |
The -dev package must follow one of the following naming rules:
Use the unversioned -dev package name: libfoo-dev
Only one version of the library source package is allowed in the archive.
Use the versioned -dev package names: libfoo7-dev and libfoo8-dev
Two versions of the library source packages are allowed simultaneously in the archive.
![]() |
Tip |
---|---|
If the data encoding scheme changes (e.g., latin1 to utf-8), the same care as the API change needs to be taken. |
The debian/control file also defines the package dependency in which the variable substitutions mechanism (substvar) may be used to free package maintainers from chores of tracking most of the simple package dependency cases. See deb-substvars(5).
The debmake command supports the following substvars:
For the shared library, required libraries found simply by "objdump -p /path/to/program | grep NEEDED" are covered by the shlib substvar.
For Python and other interpreters, required modules found simply looking for lines with “import”, “use”, “require”, etc., are covered by the corresponding substvars.
For other programs which do not deploy their own substvars, the misc substvar covers their dependency.
For POSIX shell programs, there is no easy way to identify the dependency and no substvar covers their dependency.
For libraries and modules required via the dynamic loading mechanism including the GObject introspection mechanism, there is no easy way to identify the dependency and no substvar covers their dependency.
A binNMU is a binary-only non-maintainer upload performed for library transitions etc. In a binNMU upload, only the “Architecture: any” packages are rebuilt with a suffixed version number (e.g. version 2.3.4-3 will become 2.3.4-3+b1). The “Architecture: all” packages are not built.
The dependency defined in the debian/control file among binary packages from the same source package should be safe for the binNMU. This needs attention if there are both “Architecture: any” and “Architecture: all” packages involved in it.
“Architecture: any” package: depends on “Architecture: any” foo package
“Architecture: any” package: depends on “Architecture: all” bar package
“Architecture: all” package: depends on “Architecture: any” baz package
The debian/changelog file records the Debian package history and defines the upstream package version and the Debian revision in its first line. The changes need to be documented in the specific, formal, and concise style.
Even if you are uploading your package by yourself, you must document all non-trivial user-visible changes such as:
If you are asking your sponsor to upload it, you should document changes more comprehensively, including all packaging related ones, to help reviewing your package.
The debmake command creates the initial template file with the upstream package version and the Debian revision. The distribution is set to UNRELEASED to prevent accidental upload to the Debian archive.
Der Befehl debchange (auch als dch bekannt) wird typischerweise zur Bearbeitung dieser Datei verwandt.
![]() |
Tip |
---|---|
Sie können die Datei debian/changelog händisch mit einem beliebigen Texteditor bearbeiten, solange Sie den von debchange verwandten Formatierungskonventionen folgen. |
![]() |
Tip |
---|---|
Die in der Datei debian/changelog verwandte Datumszeichenkette kann mit dem Befehl »LC_ALL=C date -R« manuell erstellt werden. |
Dieser wird durch den Befehl dh_installchangelogs als changelog.Debian.gz in das Verzeichnis /usr/share/doc/Binärpaket installiert.
Der Changelog der Originalautoren wird als changelog.gz in das Verzeichnis /usr/share/doc/Binärpaket installiert.
The upstream changelog is automatically found by the dh_installchangelogs using the case insensitive match of its file name to changelog, changes, changelog.txt, changes.txt, history, history.txt, or changelog.md and searched in the ./ doc/ or docs/ directories.
After finishing your packaging and verifying its quality, please execute the “dch -r” command and save the finalized debian/changelog file with the distribution normally set to unstable. [14] If you are packaging for backports, security updates, LTS, etc., please use the appropriate distribution names instead.
Debian takes the copyright and license matters very seriously. The “Debian Policy Manual” enforces having a summary of them in the debian/copyright file in the package.
Sie sollten es als maschinenlesbare Datei debian/copyright (DEP-5) formatieren.
![]() |
Caution |
---|---|
Die Datei debian/copyright sollte sortiert sein, um die generischen Dateimuster am Anfang der Liste zu behalten. Siehe Section 6.4, “debmake -k”. |
Der Befehl debmake erstellt die anfängliche, DEP-5-kompatible Vorlagendatei, indem er den gesamten Quellbaum überprüft. Er verwendet einen internen Lizenzprüfer, um jeden Lizenztext auszuwerten. [15]
Unless specifically requested to be pedantic with the -P option, the debmake command skips reporting for auto-generated files with permissive licenses to be practical.
![]() |
Note |
---|---|
Falls Sie Probleme mit diesem Lizenzprüfer feststellen, reichen Sie bitten gegen das Paket debmake einen Fehlerbericht mit dem problematischen Teil des Textes, der das Copyright und die Lizenz enthält, ein. |
![]() |
Note |
---|---|
The debmake command focuses on bunching up same copyright and license claims in detail to create template for debian/copyright. In order to do this within reasonable time, it only picks the first section which looks like copyright and license claims. So its license assignment may not be optimal. Please also use other tools such as licensecheck. |
![]() |
Tip |
---|---|
You are highly encouraged to check the license status with the licensecheck(1) command and, as needed, with your manual code review. |
The -p1 patches in the debian/patches/ directory are applied in the sequence defined in the debian/patches/series file to the upstream source tree before the build process.
![]() |
Note |
---|---|
Das native Debian-Paket (siehe Section 5.5, “Natives Debian-Paket”) verwendet dieseDateien nicht. |
There are several methods to prepare a series of -p1 patches.
Der Befehl diff
Primitive but versatile method
Der Befehl dquilt
Der Befehl »dpkg-source --commit«
The automatic patch generation by the dpkg-buildpackage
Der Befehl gbp pq
Der Befehl gbp dpm
Wherever these patches come from, it is a good idea to tag them with a DEP-3 compatible header.
![]() |
Tip |
---|---|
The dgit package offers an alternative git integration tool with the Debian package archive. |
The “dpkg-source -x” command unpacks the Debian source package.
It normally applies the patches in the debian/patches/ directory to the source tree and records the patch state in the .pc/ directory.
Falls Sie den Quellbaum unverändert belassen wollen (beispielsweise für die Verwendung in Section 5.15, “Aufzeichnen im VCS (standard)”), verwenden Sie bitte die Option --skip-patches.
The quilt command (or its wrapped dquilt command) was needed to manage the -p1 patches in the debian/patches/ directory before the --commit feature was added to the dpkg-source command in 1.16.1.
The patches should apply cleanly when using the dpkg-source command. Thus you can’t just copy the patches to the new packaging of the new upstream release if there are patch offsets, etc.
The dquilt command (see Section 3.4, “Quilt”) is more forgiving. You can normalize the patches by the dquilt command.
$ while dquilt push; do dquilt refresh ; done $ dquilt pop -a
There is one advantage of using the dpkg-source command over the dquilt command. While the dquilt command cannot handle modified binary files automatically, the dpkg-source command detects modified binary files and lists them in the debian/source/include-binaries file to include them in the Debian tarball.
Some packages are signed by a GPG key.
For example, GNU hello can be downloaded via HTTP from https://ftp.gnu.org/gnu/hello/ . There are sets of files:
Let’s pick the latest version set.
$ wget https://ftp.gnu.org/gnu/hello/hello-2.9.tar.gz ... $ wget https://ftp.gnu.org/gnu/hello/hello-2.9.tar.gz.sig ... $ gpg --verify hello-2.9.tar.gz.sig gpg: Signature made Thu 10 Oct 2013 08:49:23 AM JST using DSA key ID 80EE4A00 gpg: Can't check signature: public key not found
If you know the public GPG key of the upstream maintainer from the mailing list, use it as the debian/upstream/signing-key.asc file. Otherwise, use the hkp keyserver and check it via your web of trust.
$ gpg --keyserver hkp://keys.gnupg.net --recv-key 80EE4A00 gpg: requesting key 80EE4A00 from hkp server keys.gnupg.net gpg: key 80EE4A00: public key "Reuben Thomas <rrt@sc3d.org>" imported gpg: no ultimately trusted keys found gpg: Total number processed: 1 gpg: imported: 1 $ gpg --verify hello-2.9.tar.gz.sig gpg: Signature made Thu 10 Oct 2013 08:49:23 AM JST using DSA key ID 80EE4A00 gpg: Good signature from "Reuben Thomas <rrt@sc3d.org>" ... Primary key fingerprint: 9297 8852 A62F A5E2 85B2 A174 6808 9F73 80EE 4A00
![]() |
Tip |
---|---|
If your network environment blocks access to the HKP port 11371, use “hkp://keyserver.ubuntu.com:80” instead. |
After confirming the key ID 80EE4A00 is a trustworthy one, download its public key into the debian/upstream/signing-key.asc file.
$ gpg --armor --export 80EE4A00 >debian/upstream/signing-key.asc
Setzen Sie dann die entsprechende Datei debian/watch wie folgt:
version=4 pgpsigurlmangle=s/$/.sig/ https://ftp.gnu.org/gnu/hello/ hello-(\d[\d.]*)\.tar\.(?:gz|bz2|xz)
Jetzt wird der Befehl uscan die Echtheit des Pakets mittels GPG-Signaturen prüfen.
Debian nimmt die Freiheit von Software ernst und folgt der DFSG.
The non-DFSG components in the upstream source tarball can be easily removed when the uscan command is used to update the Debian package.
Führen Sie den Befehl uscan aus, um einen neuen Tarball der Originalautoren herunterzuladen.
Optional configuration files may be added under the debian/ directory. Most of them are to control dh_* commands offered by the debhelper package but there are some for dpkg-source, lintian and gbp commands.
![]() |
Tip |
---|---|
Check debhelper(7) for the latest available set of the dh_* commands. |
These debian/binarypackage.* files provide very powerful means to set the installation path of files. Even an upstream source without its build system can be packaged just by using these files. See Section 8.2, “Kein Makefile (Shell, CLI)” as an example.
The "-x[1234]" superscript notation that appears in the following list indicates the minimum value for the debmake -x option that will generate the associated template file. See Section 6.6, “debmake -x” or debmake(1) for details.
Here is the alphabetical list of notable optional configuration files.
List bash
completion scripts to be installed.
The bash-completion
package is required for both build
and user environments.
Siehe dh_bash-completion(1).
List files that should be removed but are not cleaned by the dh_auto_clean command.
Siehe dh_auto_clean(1) und dh_clean(1).
Previously, this set the debhelper compatibility level.
Now, use Build-Depends: debhelper-compat (=
13)
in debian/control to specify the compatibility level.
See “COMPATIBILITY LEVELS” in debhelper(8).
No need for this file now since all files in the etc/ directory are conffiles for recent “compat >= 3”.
If the program you’re packaging requires every user to modify the configuration files in the /etc directory, there are two popular ways to arrange for them not to be conffiles, keeping the dpkg command happy and quiet.
Siehe dh_installdeb(1).
Installed into the etc/cron/hourly/binarypackage file in binarypackage.
Siehe dh_installcron(1) und cron(8).
Installed into the etc/cron/daily/binarypackage file in binarypackage.
Siehe dh_installcron(1) und cron(8).
Installed into the etc/cron/weekly/binarypackage file in binarypackage.
Siehe dh_installcron(1) und cron(8).
Installed into the etc/cron/monthly/binarypackage file in binarypackage.
Siehe dh_installcron(1) und cron(8).
Installed into the etc/cron.d/binarypackage file in binarypackage.
Siehe dh_installcron(1), cron(8) und crontab(5).
If this exists, it is installed into etc/default/binarypackage in binarypackage.
Siehe dh_installinit(1).
List directories to be created in binarypackage.
Siehe dh_installdirs(1).
Usually, this is not needed since all dh_install* commands create required directories automatically. Use this only when you run into trouble.
Installed as the doc-base control file in binarypackage.
See dh_installdocs(1) and Debian doc-base Manual provided by the doc-base package.
List documentation files to be installed in binarypackage.
Siehe dh_installdocs(1).
Installed into usr/lib/emacsen-common/packages/compat/binarypackage in binarypackage.
Siehe dh_installemacsen(1).
Installed into usr/lib/emacsen-common/packages/install/binarypackage in binarypackage.
Siehe dh_installemacsen(1).
Installed into usr/lib/emacsen-common/packages/remove/binarypackage in binarypackage.
Siehe dh_installemacsen(1).
Installed into usr/lib/emacsen-common/packages/startup/binarypackage in binarypackage.
Siehe dh_installemacsen(1).
List example files or directories to be installed into usr/share/doc/binarypackage/examples/ in binarypackage.
Siehe dh_installexamples(1).
Falls diese existiert, funktioniert sie als Konfigurationsdatei für den Befehl gbp.
Siehe gbp.conf(5), gbp(1) und git-buildpackage(1).
Führt Info-Dateien auf, die in Binärpaket installiert werden.
Siehe dh_installinfo(1).
Installiert in etc/init.d/Binärpaket in Binärpaket.
Siehe dh_installinit(1).
Liste der Dateien, die installiert werden sollten, aber nicht durch den Befehl dh_auto_install installiert wurden.
Siehe dh_install(1) und dh_auto_install(1).
Dies sind durch den Befehl debmake erstellte Copyright-Datei-Beispiele. Verwenden Sie diese als Referenz zur Erstellung der Datei copyright.
Bitte sorgen Sie dafür, diese Dateien zu löschen.
List pairs of source and destination files to be symlinked. Each pair should be put on its own line, with the source and destination separated by whitespace.
Siehe dh_link(1).
Installed into usr/share/lintian/overrides/binarypackage in the package build directory. This file is used to suppress erroneous lintian diagnostics.
Siehe dh_lintian(1), lintian(1) und Lintian User’s Manual.
These are manpage template files generated by the debmake command. Please rename these to appropriate file names and update their contents.
Debian Policy requires that each program, utility, and function should have an associated manual page included in the same package. Manual pages are written in nroff(1).
If you are new to making a manpage, use manpage.asciidoc or manpage.1 as the starting point.
List man pages to be installed.
Siehe dh_installman(1).
tech-ctte #741573 decided "Debian should use .desktop files as appropriate".
Debian menu file installed into usr/share/menu/binarypackage in binarypackage.
See menufile(5) for its format. See dh_installmenu(1).
Installed into usr/share/doc/binarypackage/NEWS.Debian.
Siehe dh_installchangelogs(1).
Collection of -p1 patch files which are applied to the upstream source before building the source.
Siehe dpkg-source(1), Section 3.4, “Quilt” und Section 4.9, “Schritt 3 (alternativ): Änderungen der Quellen der Originalautoren”.
No patch files are generated by the debmake command.
These maintainer scripts are installed into the DEBIAN directory.
Inside the scripts, the token #DEBHELPER# is replaced with shell script snippets generated by other debhelper commands.
See dh_installdeb(1) and Chapter 6 - Package maintainer scripts and installation procedure in the “Debian Policy Manual”.
See also debconf-devel(7) and 3.9.1 Prompting in maintainer scripts in the “Debian Policy Manual”.
Installed into the first binary package listed in the debian/control file as usr/share/doc/binarypackage/README.Debian.
Siehe dh_installdocs(1).
This file provides the information specific to the Debian package.
If this exists, it is installed into lib/systemd/system/binarypackage.service in binarypackage.
Siehe dh_systemd_enable(1), dh_systemd_start(1) und dh_installinit(1).
The Debian package format.
Siehe »QUELLPAKET-FORMATE« in dpkg-source(1).
These files are not installed, but will be scanned by the lintian command to provide overrides for the source package.
Siehe dh_lintian(1) und lintian(1).
The dpkg-source command uses this content as its options. Notable options are:
This is not included in the generated source package and is meant to be committed to the VCS of the maintainer.
See “FILE FORMATS” in dpkg-source(1).
Free form text that is put on top of the automatic patch generated.
This is not included in the generated source package and is meant to be committed to the VCS of the maintainer.
+ See “FILE FORMATS” in dpkg-source(1).
The symbols files, if present, are passed to the dpkg-gensymbols command to be processed and installed.
Siehe dh_makeshlibs(1) und Section 5.20.1, “Bibliothekssymbole”..
Installed into the first binary package listed in the debian/control file as usr/share/doc/binarypackage/TODO.Debian.
Siehe dh_installdocs(1).
If this exists, it is installed into usr/lib/tmpfiles.d/binarypackage.conf in binarypackage.
Siehe dh_systemd_enable(1), dh_systemd_start(1) und dh_installinit(1).
If this exists, it is installed into etc/init/package.conf in the package build directory. (deprecated)
Siehe dh_installinit(1) und Section 8.1, “Cherry-pick templates”.
The control file for the uscan command to download the latest upstream version.
This control file may be configured to verify the authenticity of the tarball using its GPG signature (see Section 5.11, “debian/upstream/signing-key.asc”).
Siehe Section 5.12, “debian/watch und DFSG” und uscan(1).
Here are a few reminders for the above list.
Let’s recap the customization of the Debian packaging.
All customization data for the Debian package resides in the debian/ directory. A simple example is given in Section 4.7, “Schritt 3: Anpassung der Vorlagendateien”. Normally, this customization involves a combination of the following:
When these are not sufficient to make a good Debian package, modifications to the upstream source recorded as the -p1 patches in the debian/patches/ directory is deployed. These patches are applied in the sequence defined in the debian/patches/series file before building the package (see Section 5.10, “debian/patches/*”). Simple examples are given in Section 4.9, “Schritt 3 (alternativ): Änderungen der Quellen der Originalautoren”.
You should address the root cause of the Debian packaging problem by the least invasive way. The generated package shall be more robust for future upgrades in this way.
![]() |
Note |
---|---|
Schicken Sie den Patch, der das eigentliche Problem adressiert, an die Originalautoren, falls er für die Originalautoren nützlich ist. |
Typischerweise wird Git als VCS benutzt, um die Debian-Paketieraktivitäten mit den nachfolgenden Verzweigungen aufzuzeichnen.
master branch
upstream branch
![]() |
Tip |
---|---|
It’s a good idea to add to the .gitignore file the listing .pc. |
![]() |
Tip |
---|---|
Add unapply-patches and abort-on-upstream-changes lines to the debian/source/local-options file to keep the upstream portion unmodified. |
![]() |
Tip |
---|---|
You may also track the upstream VCS data with a branch different from the upstream branch to ease cherry-picking of patches. |
You may not wish to keep up with creating the -p1 patch files for all upstream changes needed. You can record the Debian packaging activity with the following branches.
master branch
upstream branch
Adding a few extra files in the debian/ directory enables you to do this.
$ tar -xvzf <Paket-Version>.tar.gz $ ln -sf <Paket_Version>.orig.tar.gz $ cd <Paket-Version>/ … hack...hack… $ echo "single-debian-patch" >> debian/source/local-options $ cat >debian/source/local-patch-header <<END This patch contains all the Debian-specific changes mixed together. To review them separately, please inspect the VCS history at https://git.debian.org/?=collab-maint/foo.git.
Let the dpkg-source command invoked by the Debian package build process (dpkg-buildpackage, debuild, …) generate the -p1 patch file debian/patches/debian-changes automatically.
![]() |
Tip |
---|---|
This approach can be adopted for any VCS tools. Since this approach merges all changes into a merged patch, it is desirable to keep the VCS data publicly accessible. |
![]() |
Tip |
---|---|
The debian/source/local-options and debian/source/local-patch-header files are meant to be recorded in the VCS. These aren’t included in the Debian source package. |
Es gibt ein paar Fälle, die zur Aufnahme von ungewünschten Inhalten in das erstellte Debian-Quellpaket führen.
Normally, the -i and -I options set in Section 3.5, “Devscripts” for the dpkg-source command should avoid these. Here, the -i option is aimed at the non-native package while the -I is aimed at the native package. See dpkg-source(1) and the “dpkg-source --help” output.
Es gibt mehrere Methoden, die Aufnahme ungewünschter Inhalte zu vermeiden
The problem of extraneous contents can be fixed by removing such files in the “debian/rules clean” target. This is also useful for auto-generated files.
![]() |
Note |
---|---|
The “debian/rules clean” target is called before the “dpkg-source --build” command by the dpkg-buildpackage command and the “dpkg-source --build” command ignores removed files. |
The problem of extraneous contents can be fixed by restoring the source tree by committing the source tree to the VCS before the first build.
You can restore the source tree before the second package build. For example:
$ git reset --hard $ git clean -dfx $ debuild
This works because the dpkg-source command ignores the contents of the typical VCS files in the source tree with the DEBUILD_DPKG_BUILDPACKAGE_OPTS setting in Section 3.5, “Devscripts”.
![]() |
Tip |
---|---|
Falls der Quellbaum nicht in einem VCS verwaltet wird, sollten Sie vor dem ersten Bau »git init; git add -A .; git commit ausführen. |
Dies ist für nichtnative Pakete.
The problem of extraneous diffs can be fixed by ignoring changes made to parts of the source tree by adding the “extend-diff-ignore=…” line in the debian/source/options file.
For excluding the config.sub, config.guess and Makefile files:
# Don't store changes on autogenerated files extend-diff-ignore = "(^|/)(config\.sub|config\.guess|Makefile)$"
![]() |
Note |
---|---|
This approach always works, even when you can’t remove the file. So it saves you having to make a backup of the unmodified file just to be able to restore it before the next build. |
![]() |
Tip |
---|---|
If the debian/source/local-options file is used instead, you can hide this setting from the generated source package. This may be useful when the local non-standard VCS files interfere with your packaging. |
Dies ist für native Pakete.
You can exclude some files in the source tree from the generated tarball by tweaking the file glob by adding the “tar-ignore=…” lines in the debian/source/options or debian/source/local-options files.
![]() |
Note |
---|---|
If, for example, the source package of a native package needs files with the file extension .o as a part of the test data, the setting in Section 3.5, “Devscripts” is too aggressive. You can work around this problem by dropping the -I option for DEBUILD_DPKG_BUILDPACKAGE_OPTS in Section 3.5, “Devscripts” while adding the “tar-ignore=…” lines in the debian/source/local-options file for each package. |
Upstream build systems are designed to go through several steps to install generated binary files to the system from the source distribution.
Three typical build systems are described here. The situation of other
build systems are very similar to these since
debhelper
(7) the does most of the work and helps you
build a Debian package.
![]() |
Tip |
---|---|
Before attempting to make a Debian package, you should become familiar with the upstream build system of the upstream source code and try to build it. |
Autotools (autoconf + automake) has 4 steps.
The upstream maintainer usually performs step 1 and builds the upstream tarball for distribution using the “make dist” command. (The generated tarball contains not only the pristine upstream VCS contents but also other generated files.)
The package maintainer needs to take care of steps 2 to 4 at least. This is realized by the “dh $@ --with autotools-dev” command used in the debian/rules file.
The package maintainer may wish to take care all steps 1 to 4. This is realized by the “dh $@ --with autoreconf” command used in the debian/rules file. This rebuilds all auto-generated files to the latest version and provides better support for porting to the newer architectures.
For compat level 10 or newer, the simple “dh $@” command without “--with autoreconf” option can take care all steps 1 to 4, too.
Falls Sie mehr über die Autotools lernen möchten, lesen Sie:
CMake hat 4 Schritte.
Der Tarball der Originalautoren enthält keine automatisch erstellten Dateien und wird durch den Befehl tar nach Schritt 1 erstellt.
Der Paketbetreuer muss sich um die Schritte 2 bis 4 kümmern.
Falls Sie mehr über CMake lernen möchten, lesen Sie bitte:
Meson hat 4 Schritte.
Der Tarball der Originalautoren enthält keine automatisch erstellten Dateien und wird durch den Befehl tar nach Schritt 1 erstellt.
Der Paketbetreuer muss sich um die Schritte 2 bis 4 kümmern.
Falls Sie mehr über Meson lernen möchten, lesen Sie bitte:
Python Distutils hat 3 Schritte.
Die Originalautoren führen normalerweise Schritt 1 durch und bauen den Tarball der Originalautoren mittels des Befehls »python3 setup.py sdist« zum Verteilen.
The package maintainer needs to take care of step 2. This is realized simply by the “dh $@” command used in the debian/rules file.
These days, most upstream maintainers of Python packages use setuptools with
wheel. Since setuptools is an extension of distutils, this step 2 works as
expected even if setup.py
doesn’t explicitly uses
distutils.
Falls Sie mehr über Python3 und distutils und setuptools lernen möchten, lesen Sie bitte:
Das Debian-Paket wird mit den Fehlersuchinformationen gebaut, aber in das Binärpaket nach entfernen der Fehlersuchinformationen paketiert, wie von Kapitel 10 - Dateien des »Debian Policy Manual« verlangt.
Siehe
The debugging information is automatically packaged separately as the debug package using the dh_strip command with its default behavior. The name of such a debug package normally has the -dbgsym suffix.
If there were no -dbg packages defined in the debian/control file, no special care is needed for updating the package after the Stretch 9.0 release.
If there were -dbg packages defined in the debian/control file, following care is needed for updating the old package after the Stretch 9.0 release.
Die Paketierung von Bibliothekssoftware verlangt von Ihnen deutlich mehr Arbeit als normal. Es folgen ein paar Erinnerungen zur Paketierung von Bibliothekssoftware:
Before packaging shared library software, see:
For the historic background study, see:
Escaping the Dependency Hell [16]
Debian Library Packaging guide [17]
The symbols support in dpkg introduced in Debian lenny (5.0, May 2009) helps us to manage the backward ABI compatibility of the library package with the same package name. The DEBIAN/symbols file in the binary package provides the minimal version associated with each symbol.
An oversimplified method for the library packaging is as follows.
Extract the old DEBIAN/symbols file of the immediate previous binary package with the “dpkg-deb -e” command.
Copy it to the debian/binarypackage.symbols file.
Build the binary package.
If the dpkg-gensymbols command warns about some new symbols:
If the dpkg-gensymbols command does not warn about new symbols:
For the details, you should read the following primary references.
Sie sollten auch Folgendes prüfen:
![]() |
Tip |
---|---|
For C++ libraries and other cases where the tracking of symbols is problematic, follow 8.6.4 The shlibs system of the “Debian Policy Manual”, instead. Please make sure to erase the empty debian/binarypackage.symbols file generated by the debmake command. For this case, the DEBIAN/shlibs file is used. |
When you package a new library package version which affects other packages, you must file a transition bug report against the release.debian.org pseudo package using the reportbug command with the ben file and wait for the approval for its upload from the Release Team.
Release team has the transition tracker. See Transitions.
![]() |
Caution |
---|---|
Please make sure to rename binary packages as in Section 5.7.1.3, “Der Bibliothekspaketname”. |
The debconf package enables us to configure packages during their installation in 2 main ways:
interactively from the menu interface (dialog, gnome, kde, …)
All user interactions for the package installation must be handled by this debconf system using the following files.
debian/binarypackage.config
debian/binarypackage.template
package configuration scripts
See dh_installdebconf(1), debconf(7), debconf-devel(7) and 3.9.1 Prompting in maintainer scripts in the “Debian Policy Manual”.
Multiarch support for cross-architecture installation of binary packages (particularly i386 and amd64, but also other combinations) in the dpkg and apt packages introduced in Debian wheezy (7.0, May 2013), demands that we pay extra attention to packaging.
You should read the following references in detail.
Ubuntu wiki (upstream)
Debian wiki (Debian situation)
The multiarch is enabled by using the <triplet> value such as i386-linux-gnu and x86_64-linux-gnu in the install path of shared libraries as /usr/lib/<triplet>/, etc..
The <triplet> value used in override_dh_* target scripts must be explicitly set in the debian/rules file by the maintainer. The <triplet> value is stored in the $(DEB_HOST_MULTIARCH) variable in the following debian/rules snippet example:
DEB_HOST_MULTIARCH = $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) … override_dh_install: mkdir -p package1/lib/$(DEB_HOST_MULTIARCH) cp -dR tmp/lib/. package1/lib/$(DEB_HOST_MULTIARCH)
Siehe:
Debian policy requires following Filesystem Hierarchy Standard. Its /usr/lib : Libraries for programming and packages states "/usr/lib includes object files, libraries, and internal binaries that are not intended to be executed directly by users or shell scripts."
Debian policy makes an exception to the Filesystem Hierarchy Standard to use /usr/lib/<triplet>/ instead of /usr/lib<qual>/ (e.g., /lib32/ and /lib64/) to support a multiarch library.
Table 5.1. The multiarch library path options
Classic path | i386 multiarch path | amd64 multiarch path |
---|---|---|
/lib/ |
/lib/i386-linux-gnu/ |
/lib/x86_64-linux-gnu/ |
/usr/lib/ |
/usr/lib/i386-linux-gnu/ |
/usr/lib/x86_64-linux-gnu/ |
For Autotools based packages under the debhelper package (compat>=9), this path setting is automatically taken care by the dh_auto_configure command.
For other packages with non-supported build systems, you need to manually adjust the install path as follows.
All files installed simultaneously as the multiarch package to the same file path should have exactly the same file content. You must be careful with differences generated by the data byte order and by the compression algorithm.
![]() |
Note |
---|---|
The --libexecdir option of the ./configure command specifies the default path to install executable programs run by other programs rather than by users. Its Autotools default is /usr/libexec/ but its Debian non-multi-arch default is /usr/lib/. If such executables are a part of a "Multi-arch: foreign" package, a path such as /usr/lib/ or /usr/lib/packagename may be more desirable than /usr/lib/<triplet>/, which dh_auto_configure uses. The GNU Coding Standards: 7.2.5 Variables for Installation Directories has a description for libexecdir as "The definition of libexecdir is the same for all packages, so you should install your data in a subdirectory thereof. Most packages install their data under $(libexecdir)/package-name/ …". (It is always a good idea to follow GNU unless it conflicts with the Debian policy.) |
The shared library files in the default path /usr/lib/ and /usr/lib/<triplet>/ are loaded automatically.
For shared library files in another path, the GCC option -l must be set by the pkg-config command to make them load properly.
GCC includes both /usr/include/ and /usr/include/<triplet>/ by default on the multiarch Debian system.
If the header file is not in those paths, the GCC option -I must be set by the pkg-config command to make "#include <foo.h>" work properly.
Table 5.2. The multiarch header file path options
Classic path | i386 multiarch path | amd64 multiarch path |
---|---|---|
/usr/include/ |
/usr/include/i386-linux-gnu/ |
/usr/include/x86_64-linux-gnu/ |
/usr/include/ packagename / |
/usr/include/i386-linux-gnu/ packagename / |
/usr/include/x86_64-linux-gnu/ packagename / |
/usr/lib/i386-linux-gnu/ packagename / |
/usr/lib/x86_64-linux-gnu/ packagename / |
The use of the /usr/lib/<triplet>/packagename/ path for the library files allows the upstream maintainer to use the same install script for the multiatch system with /usr/lib/<triplet> and the biarch system with /usr/lib<qual>/. [18]
The use of the file path containing packagename enables having more than 2 development libraries simultaneously installed on a system.
The pkg-config program is used to retrieve information about installed libraries in the system. It stores its configuration parameters in the *.pc file and is used for setting the -I and -l options for GCC.
Table 5.3. The *.pc file path options
Classic path | i386 multiarch path | amd64 multiarch path |
---|---|---|
/usr/lib/pkgconfig/ |
/usr/lib/i386-linux-gnu/pkgconfig/ |
/usr/lib/x86_64-linux-gnu/pkgconfig/ |
The compiler hardening support spreading for Debian jessie (8.0, TBA) demands that we pay extra attention to the packaging.
You should read the following references in detail.
The debmake command adds template comments to the debian/rules file as needed for DEB_BUILD_MAINT_OPTIONS, DEB_CFLAGS_MAINT_APPEND, and DEB_LDFLAGS_MAINT_APPEND (see Chapter 4, Einfaches Beispiel and dpkg-buildflags(1)).
DEP-8 defines the debian/tests/control file as the RFC822-style test metadata file for continuous integration (CI) of the Debian package.
It is used after building the binary packages from the source package containing this debian/tests/control file. When the autopkgtest command is run, the generated binary packages are installed and tested in the virtual environment according to this file.
See documents in the /usr/share/doc/autopkgtest/ directory and 4. autopkgtest: Automatic testing for packages of the “Ubuntu Packaging Guide”.
![]() |
Note |
---|---|
Testing of the binary packages during their building time can be accomodated
by |
There are several other CI tools on Debian for you to explore.
Debian packaging practices are moving target. Please keep your eyes on DEP - Debian Enhancement Proposals.
Debian cares about supporting new ports or flavours. The new ports or flavours require bootstrapping operation for the cross-build of the initial minimal native-building system. In order to avoid build-dependency loops during bootstrapping, the build-dependency needs to be reduced using the profile builds feature.
![]() |
Tip |
---|---|
If a core package |
The reportbug command used for the bug report of binarypackage can be customized by the files in usr/share/bug/binarypackage/.
The dh_bugfiles command installs these files from the template files in the debian/ directory.
debian/binarypackage.bug-control → usr/share/bug/binarypackage/control
debian/binarypackage.bug-presubj → usr/share/bug/binarypackage/presubj
debian/binarypackage.bug-script → usr/share/bug/binarypackage or usr/share/bug/binarypackage/script
Siehe dh_bugfiles(1) und reportbug’s Features for Developers
![]() |
Tip |
---|---|
If you always remind the bug reporter of something or ask them about their situation, use these files to automate it. |
[10] For more than 90% of packages, the package name is equal or less than 24 characters; the upstream version is equal or less than 10 characters and the Debian revision is equal or less than 3 characters.
[11] Use of the “debmake -t …” command or “git deborig -f HEAD” can help this workflow. See Section 6.2, “Schnappschusstarball der Originalautoren (-d, -t)” and dgit-maint-merge(7).
[12] This simplicity is available since version 7 of the debhelper package. This guide assumes the use of debhelper version 13 or newer.
[13] The debmake command generates a bit more complicated debian/rules file. But this is the core part.
[14] If you are using the vim editor, make sure to save this with the “:wq” command.
[15] The licensecheck command from the devscripts package was referenced to make this internal checker. Now the licensecheck command is provided in an independent licensecheck package with a lot of improvements.
[16] This document was written before the introduction of the symbols file.
[17] The strong preference is to use the SONAME versioned -dev package names over the single -dev package name in Chapter 6. Development (-DEV) packages, which does not seem to be shared by the former ftp-master (Steve Langasek). This document was written before the introduction of the multiarch system and the symbols file.
[18] This path is compliant with the FHS. Filesystem Hierarchy Standard: /usr/lib : Libraries for programming and packages states "Applications may use a single subdirectory under /usr/lib. If an application uses a subdirectory, all architecture-dependent data exclusively used by the application must be placed within that subdirectory."