--- /dev/null
+<!doctype debiandoc system>
+
+<!--
+ Debian Linux package policy manual.
+ Copyright (C)1996 Ian Jackson; released under the terms of the GNU
+ General Public License, version 2 or (at your option) any later.
+ -->
+
+<book>
+
+<title>Debian policy manual
+<author>Ian Jackson <email/ijackson@gnu.ai.mit.edu/
+<version>version 0.1, <date>
+
+<abstract>
+This manual describes the policy requirements which must be satisfied
+for a package to be included in the Debian distribution. This
+includes details of the permissions and ownerships of files in
+packages and other technical requirements as well as information like
+the upload procedure.
+</abstract>
+
+<copyright>Copyright ©1996 Ian Jackson.
+<p>
+
+This manual is free software; you may redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+<p>
+
+This is distributed in the hope that it will be useful, but
+<em>without any warranty</em>; without even the implied warranty of
+merchantability or fitness for a particular purpose. See the GNU
+General Public License for more details.
+<p>
+
+You should have received a copy of the GNU General Public License with
+your Debian GNU/Linux system, in <tt>/usr/doc/copyright/GPL</tt>, or
+with the <prgn/dpkg/ source package as the file <tt>COPYING</tt>. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+<toc sect>
+
+<chapt id="scope">Introduction and scope of this manual
+<p>
+
+This manual describes the criteria that a Debian-format package must
+satisfy to be included in the Debian distribution.
+<p>
+
+Much of this information will be useful even when building a package
+which is to be distributed in some other way or is for local use.
+<p>
+
+This manual does <em/not/ describe the technical mechanisms involved
+in package creation, installation and removal. This information can
+be found in the <prgn/dpkg/ programmers' manual and the <prgn/dpkg/ system
+administrators' manual.
+<p>
+
+This document assumes familiarity with these other two manuals.
+<p>
+
+The Debian version of the FSF's GNU <prgn/hello/ program is provided
+as an example for people wishing to create Debian packages.
+<p>
+
+<em>Note that this document is still a draft!</em>
+
+<chapt id="pkgcopyright">Package copyright
+<p>
+
+Please study the copyright of your submission <em/carefully/ and
+understand it before proceeding. If you have doubts or questions,
+please ask.
+<p>
+
+All packages in the Debian distribution proper must be freely useable,
+modifiable and redistributable in both source and binary form. It
+must be possible for anyone to distribute and use modified source code
+and their own own compiled binaries, at least when they do so as part
+of a Debian distribution.
+<p>
+
+Packages whose copyright permission notices (or patent problems) do
+not allow distribution and copying for profit, without restriction on
+the amount charged, or where distribution is restricted according to
+the medium used, or where the distributor must ask any kind of special
+permission of the authors, or with other onerous conditions, may only
+be placed in the semi-supported non-free section of the Debian FTP
+archives. This is important so that CDROM manufacturers can
+distribute Debian without having to check the copyright of each
+package individually, simply by leaving out the contents of the
+non-free area; CDROM distributors are encouraged, though, to check the
+copyrights on programs in non-free individually and include as many as
+they can.
+<p>
+
+Packages whose copyright permission notices (or patent problems) allow
+only distribution of compiled binaries (and thus of which only
+binaries are available), or where the source code which may be
+distributed is not the complete source code required to compile the
+program (ie, the program cannot be compiled using only packages in the
+main Debian distribution), or which depend for their use on non-free
+or contrib packages, or allow free use only for a trial period
+(shareware), or are demonstration programs lacking vital functionality
+(crippleware), or are only installer-packages which require the user
+to supply a separate file to be installed, or which fail to meet some
+other policy requirements, may only be placed in the semi-supported
+contrib section of the Debian FTP archives (unless they need to be in
+non-free - see above).
+<p>
+
+Programs whose authors encourage the user to make donations are fine
+for the main distribution, provided that the authors do not claim that
+not donating is immoral, unethical, illegal or something similar;
+otherwise they must go in contrib (or non-free, if even distribution
+is restricted by such statements).
+<p>
+
+Packages whose copyright permission notices (or patent problems) do
+not allow redistribution even of only binaries, and where no special
+permission has been obtained, cannot placed on the Debian FTP site and
+its mirrors at all.
+<p>
+
+Note that under international copyright law<footnote>This applies in
+the United States, too.</footnote> <em/no/ distribution or modification
+of a work is allowed without an explicit notice saying so. Therefore
+a program without a copyright notice <em/is/ copyrighted and you may
+not do anything to it without risking being sued! Likewise if a
+program has a copyright notice but no statement saying what is
+permitted then nothing is permitted.
+<p>
+
+Many authors are unaware of the problems that restrictive copyrights
+(or lack of copyright notices) can cause for the users of their
+supposedly-free software. It is often worthwhile contacting such
+authors diplomatically to ask them to modify their terms generally, or
+specially for Debian. However, this is a politically difficult thing
+to do and you should ask for advice on <prgn/debian-devel/ first.
+<p>
+
+When in doubt, send mail to <email/debian-devel@lists.debian.org/. Be
+prepared to provide us with the copyright statement. Software covered
+by the GPL, public domain software and BSD-like copyrights are safe;
+be wary of the phrases `commercial use prohibited' and `distribution
+restricted'.
+<p>
+
+Every package submission <em/must/ be accompanied by verbatim copy of
+its copyright (with the exceptions of public domain packages and those
+covered by the UCB BSD licence or the GNU GPL or LGPL; in these cases
+simply indicate which is appropriate). This information must be
+included in a file installed by the binary package - see <ref
+id="copyrightfile">.
+
+<chapt id="binarypkg">Contents of the binary package
+
+<sect>Control file requirements
+
+<sect1><tt/Maintainer/ information
+<p>
+
+All packages must have a <tt/Maintainer/ field with the correct name
+and a working email address for the Debian maintainer of the package.
+If one person maintains several packages they should try to avoid
+having different forms of their name and address in different
+<tt/Maintainer/ fields.
+
+<sect1>Dependencies and virtual packages
+<p>
+
+Add a dependency for any shared libraries required by
+dynamically-linked executable binaries in your package. Almost every
+package containing compiled C code should therefore include a
+<tt/Depends/ field which mentions the shared C library required for
+the program to run. For ELF binaries linked against <tt/libc.so.5/
+the relevant package name is <tt/libc5/.
+<p>
+
+All packages must use virtual package names where appropriate, and
+arrange to create new ones if necessary. They must not use virtual
+package names (except privately, amongst a cooperating group of
+packages) unless they have been agreed upon and appear in the list of
+virtual package names.
+<p>
+
+The latest version of the authoritative list of virtual package names
+can be found on <ftpsite>ftp.debian.org</> in
+<ftppath>/debian/doc/package-developer/virtual-package-names-list.text</>
+or your local mirror. The procedure for updating it is described at
+the top of the file.
+
+<sect1><tt/Section/ and <tt/Priority/
+<p>
+
+Decide whether your package can go in <tt/non-free/, <tt/contrib/ or
+the main distribution - see <ref id="pkgcopyright">, and put
+an appropriate value for the distribution in the
+<tt>debian/changelog</> file.
+<p>
+
+The <tt/Priority/ and <tt/Section/ control file fields give
+information for classifying the package in <prgn/dselect/ and say
+which directory to place it in the FTP archive.
+<p>
+
+They are ultimately the responsibility of the distribution
+maintainers; however, you should suggest values for them in your
+<tt/.changes/ information when you upload a package. You do this by
+including appropriate information in the <tt>debian/control</tt> file
+before building the packages.
+<p>
+
+For a list of the currently in-use sections, please see the FTP
+archive. Packages in the non-free and contrib areas should have
+section <tt/non-free/ and <tt/contrib/, respectively.
+
+<sect2><tt/Priority/ values
+<p>
+
+<taglist>
+<tag><tt/required/
+<item>
+<tt/required/ packages are necessary for the proper functioning of the
+system. You must not remove these packages or your system may become
+totally broken and you may probably not even be able to use
+<prgn/dpkg/ to put things back. Systems with only the <tt/required/
+packages are probably unuseable, but they do have enough functionality
+to allow the sysadmin to boot and install more software.
+
+<tag><tt/important/
+<item>
+Important programs, including those which one would expect to find on
+any Unix-like system. If the expectation is that an experienced Unix
+person who found it missing would go `What the F*!@<+ is going on,
+where is <prgn/foo/', it should be in <tt/important/. This is an
+important criterion because we are trying to produce, amongst other
+things, a free Unix. Other packages without which the system will not
+run well or be useable should also be here. This does <em/not/
+include Emacs or X11 or TeX or any other large applications. The
+<tt/important/ packages are just a bare minimum of commonly-expected
+and necessary tools.
+
+<tag><tt/standard/
+<item>
+These packages provide a reasonably small but not too limited
+character-mode system. This is what will install by default if the
+user doesn't select anything else. It doesn't include many large
+applications, but it does include Emacs (this is more of a piece of
+infrastructure than an application) and a reasonable subset of TeX and
+LaTeX (if this is possible without X).
+
+<tag><tt/optional/<footnote>In a sense everything is optional that
+isn't required, but that's not what is meant here.</footnote>
+<item>
+This is all the software that you might reasonably want to install if
+you didn't know what it was or don't have specialised requirements.
+This is a much larger system and includes X11, a full TeX
+distribution, and lots of applications.
+
+<tag><tt/extra/
+<item>
+This contains packages that conflict with others with higher
+priorities, or are only likely to be useful if you already know what
+they are or have specialised requirements.
+
+</taglist>
+<p>
+
+Priority values are not case-sensitive.
+
+<sect2>Base packages
+<p>
+
+Some packages have <tt/Section: base/ and are in the <tt/base/
+subdirectory on the FTP archives. These are the packages that are
+supplied on the base disks. They are the minimum sensible set for
+installing new packages (perhaps via a network).
+<p>
+
+Most of these packages should have <tt/Priority: required/ or at least
+<tt/Priority: important/.
+
+<sect1>The <tt/Essential/ flag
+<p>
+
+The <tt/Essential: yes/ control file field should not be used unless
+removing a package really will completely hose the system; nor should
+it be used for a shared library package - the dependencies will
+prevent its premature removal, and we need to be able to remove it
+when it has been superseded.
+
+<sect1>Including <tt/Priority/ and <tt/Section/ in the <tt/.deb/
+control file
+<p>
+
+If a user installs a package which is not part of the standard
+distribution, or without downloading and updating from a new
+<prgn/Packages/ file, the information about the priority and section
+of a package will be absent, and the <prgn/dselect/ package listing
+will have the package listed under `unclassified'. In order to
+improve this it is permissible to use the <tt/-is/, <tt/-isp/ or
+<tt/-ip/ option to <prgn/dpkg-gencontrol/, so that the <tt/Section/
+and/or <tt/Priority/ is copied into the actual control information in
+the <tt/.deb/ file. However, if you do this you should make sure you
+keep the information up to date so that users are not shown
+conflicting information.
+
+
+<sect1>Formatting of the <tt/Description/ control file field
+<p>
+
+Every Debian package should have an extended description.
+<p>
+
+The description should be written so that it tells the user what they
+need to know to decide whether to install the package. This
+description should not just be copied from the blurb for the program.
+Instructions for configuring or using the package should not be
+included - that is what installation scripts, manpages, Info files and
+<tt>/usr/doc/<var/package/</> are for. Copyright statements and other
+administrivia should not be included - that is what
+<tt>/usr/doc/copyright</> is for.
+<p>
+
+If you wish to include a list in your extended with entries which are
+a line or more each you must indent each entry by one space to make
+sure that it doesn't get wordwrapped. The start of each list entry
+should be marked with an asterisk, followed by a single space. You
+must wrap the list entries yourself to 75 columns, and should start
+continuation lines indented by three spaces so that they line up with
+the start of the text on the first line of each list entry.
+<p>
+
+See the programmers' manual for further requirements and pitfalls.
+
+<sect>Locations of files
+<p>
+
+The location of all installed files and directories must comply fully
+with the Linux File System Standard (FSSTND). The latest version of
+this document can be found alongside this manual or on
+<ftpsite/tsx-11.mit.edu/ in
+<ftppath>/pub/linux/docs/linux-standards/fsstnd/</>. Specific questions
+about following the standard may be asked on <prgn/debian-devel/, or
+referred to Daniel Quinlan, the FSSTND coordinator, at
+<email/quinlan@yggdrasil.com/.
+<p>
+
+<sect1>Manpages
+<p>
+
+You must install manpages in <prgn/nroff/ source form, in appropriate
+places under <tt>/usr/man</tt>. You should only use sections 1 to 9
+(see the FSSTND for more details). You must <em/not/ install a
+preformatted `cat page'.
+<p>
+
+If no manual page is available for a particular program, utility or
+function and this is reported as a bug on debian-bugs, a symbolic link
+from the requested manual page to the <manref name=undocumented
+section=7> manual page should be provided. This symbolic link can be
+created from <tt>debian/rules</> like this:
+<example>
+ln -s ../man7/undocumented.7 \
+ debian/tmp/usr/man/man[1-9]/the_requested_manpage.[1-9]
+</example>
+This manpage claims that the lack of a manpage has been reported as a
+bug, so you may only do this if it really has (you can report it
+yourself, if you like). Do not close the bug report until a proper
+manpage is available.
+<p>
+
+You may forward a complaint about a missing manpage to the upstream
+authors, and mark the bug as forwarded in the Debian bug tracking
+system. Even though the GNU Project do not in general consider the
+lack of a manpage to be a bug, we do - if they tell you that they
+don't consider it a bug you should leave the bug in our bug tracking
+system open anyway.
+<p>
+
+Manpages should be installed uncompressed.
+<p>
+
+If one manpage needs to be accesssible via several names it is better
+to use a symbolic link than the <tt/.so/ feature, but there is no need
+to fiddle with the relevant parts of the upstream source to change
+from <tt/.so/ to symlinks - don't do it unless it's easy. Do not
+create hard links in the manual page directories, and do not put
+absolute filenames in <tt/.so/ directives. The filename in a
+<tt/.so/ in a manpage should be relative to the base of the manpage
+tree (usually <tt>/usr/man</tt>).
+
+<sect1>Info documents
+<p>
+
+Info documents should be installed in <tt>/usr/info</tt>. They should
+be compressed with <tt/gzip -9/.
+<p>
+
+Your package must call <prgn/install-info/ to update the Info <tt/dir/
+file, in its post-installation script:
+<example>
+install-info --quiet --section Development Development \
+ /usr/info/foobar.info
+</example>
+<p>
+
+It is a good idea to specify a section for the location of your
+program; this is done with the <tt/--section/ switch. To determine
+which section to use, you should use look at <tt>/usr/info/dir</> on
+your system and choose the most relevant (or create a new section if
+none of the current sections are relevant). Note that the
+<tt/--section/ flag takes two arguments; the first is a regular
+expression to match (case-insensitively) against an existing section,
+the second is used when creating a new one.
+<p>
+
+You must remove the entries in the pre-removal script:
+<example>
+install-info --quiet --remove /usr/info/foobar.info
+</example>
+<p>
+
+If <prgn/install-info/ cannot find a description entry in the Info file
+you will have to supply one. See <manref name=install-info section=8>
+for details.
+
+<sect1>Additional documentation
+<p>
+
+Any additional documentation that comes with the package can be
+installed at the discretion of the package maintainer. Text
+documentation should be installed in a directory
+<tt>/usr/doc/<var/package/</tt><footnote>Where <var/package/ is the
+name of the package.</footnote> and compressed with <tt/gzip -9/
+unless it is small.
+<p>
+
+If a package comes with large amounts of documentation which many
+users of the package will not require you should create a separate
+binary package to contain it, so that it does not take up disk space
+on the machines of users who do not need or want it installed.
+<p>
+
+It is often a good idea to put text information files that come with
+the source package in <tt>/usr/doc/<var/package/</> in the binary
+package. However, don't install the instructions for building and
+installing the package, of course!
+
+<sect1>Preferred documentation formats
+<p>
+
+The unification of Debian documentation is being carried out via HTML.
+<p>
+
+If your package comes with extensive documentation in a markup format
+that can be converted to various other formats you should if possible
+ship HTML versions in the binary package, in the directory
+<tt>/usr/doc/<var/package/</> or its subdirectories.
+<p>
+
+Other formats such as PostScript may be provided at your option.
+
+<sect2>Examples
+<p>
+
+Any examples (configurations, source files, whatever), should be
+installed in a directory <tt>/usr/doc/<var/package//examples</tt>.
+These files should not be referenced by any program - they're there
+for the benefit of the system administrator and users, as
+documentation only.
+
+<sect1 id="copyrightfile"><tt>/usr/doc/copyright/<var/package/</tt>
+<p>
+
+This file must contain details of the authorship and copyright of the
+package. It must say where the upstream sources (if any) were
+obtained, and explain briefly what modifications were made in the
+Debian version of the package compared to the upstream one. It must
+name the original authors of the package and the Debian maintainer(s)
+who were involved with its creation.
+<p>
+
+It must contain the full text of the copyright notice and any
+acknowledgements for the program and the licence terms under which the
+program is distributed. If the package is distributed under the GNU
+General Public Licence, the GNU Library General Public Licence, the
+Regents of the University of California at Berkeley (BSD) licence or
+Larry Wall's Artistic Licence please say so instead of including a
+copy of the licence. The files <tt/BSD/, <tt/GPL/, <tt/LGPL/ and
+<tt/Artistic/ are be available in <tt>/usr/doc/copyright</tt> for you
+to refer to. The package's copyright file should not be compressed.
+<p>
+
+Do not use the copyright file as a general <tt/README/ file. If your
+package has such a file it should be installed in
+<tt>/usr/doc/<var/package//README</> or <tt/README.Debian/ or some
+other appropriate place. Do not make links between
+<tt>/usr/doc/<var/package/</> and the <tt/copyright/ directory.
+
+<sect1>Symbolic links
+<p>
+
+Most symbolic links should be relative, not absolute. Absolute links,
+in general, cause problems when a file system is not mounted where it
+"normally" resides (for example, when mounted via NFS).
+<p>
+
+In particular, symlinks from one part of <tt>/usr</tt> to another
+should be relative.
+<p>
+
+In certain cases, however, relative links may cause more problems.
+For example, links into <tt>/etc</tt> and <tt>/var</tt> should be
+absolute.
+<p>
+
+Note that when creating a relative link using <prgn/ln/ it is not
+necessary for the target of the link to exist relative to the working
+directory you're running <prgn/ln/ from; nor is it necessary to change
+directory to the directory where the link is to be made. Simply
+include the string that should appear as the target of the link (this
+will be a pathname relative to the directory in which the link
+resides) as the first argument to <prgn/ln/.
+<p>
+
+For example, in your <prgn/Makefile/ or <tt>debian/rules</>, do things
+like:
+<example>
+ln -fs gcc $(prefix)/bin/cc
+ln -fs gcc debian/tmp/usr/bin/cc
+ln -fs ../sbin/sendmail $(prefix)/bin/runq
+ln -fs ../sbin/sendmail debian/tmp/usr/bin/runq
+</example>
+
+<sect1>Logfiles
+<p>
+
+Logfiles should usually be named
+<tt>/var/log/<var/package/.log</tt>. If you have many logfiles,
+or need a separate directory for permissions reasons
+(<tt>/var/log</tt> is writeable only by <tt/root/), you should usually
+create a directory named <tt>/var/log/<var/package/</tt>.
+<p>
+
+Make sure that any logfiles are rotated occasionally using so that
+they don't grow indefinitely; the best way to do this is to use
+<prgn/savelog/ program in an <tt>/etc/cron.daily</>,
+<tt>/etc/cron.weekly</> or <tt>/etc/cron.monthly</> script.
+<p>
+
+Make sure that any logfiles are removed when the package is purged
+(but not when it is only removed), by checking the argument to the
+postrm script (see the programmer's manual for details).
+
+<sect1><tt>/usr/local</> - for the use of the system administrator
+<p>
+
+As mandated by the FSSTND no package should place any files in
+<tt>/usr/local</>, either by putting them in the filesystem archive to
+be unpacked by <prgn/dpkg/ or by manipulating them in their maintainer
+scripts.
+<p>
+
+Every package that searches a number of directories or files for
+something (for example, looking for shared libraries in <tt>/lib</> or
+<tt>/usr/lib</>) should search an appropriate directory in
+<tt>/usr/local</> too.
+<p>
+
+In order that the system administrator may know where to place
+additional files a package should create an empty directory in the
+appropriate place in <tt>/usr/local</> by supplying it in the
+filesystem archive for unpacking by <prgn/dpkg/. The
+<tt>/usr/local</> directory itself and all the subdirectories created
+by the package should have permissions 2775 (group-writeable and
+set-group-id) and be owned by <tt/root.staff/.
+<p>
+
+In the future it will be possible to tell <prgn/dpkg/ not to unpack
+files matching certain patterns, so that system administrators who do
+not wish these directories in <tt>/usr/local</> do not need to have
+them.
+
+<sect>Permissions and ownerships
+<p>
+
+The rules in this section are guidelines for general use. If
+necessary you may deviate from the details below. However, if you do
+so you must make sure that what is done is secure and you must try to
+be as consistent as possible with the rest of the system. You should
+probably also discuss it on <prgn/debian-devel/ first.
+<p>
+
+Files should be owned by <tt/root.root/, and made writeable only by
+the owner and universally readable (and executable, if appropriate).
+<p>
+
+Directories should be mode 755 or (for group-writability) mode 2775.
+The ownership of the directory should be consistent with its mode -
+if a directory is mode 2775, it should be owned by the group that
+needs write access to it.
+<p>
+
+Setuid and setgid executables should be mode 4755 or 2755
+respectively, and owned by the appropriate user or group. They should
+not be made unreadable (modes like 4711 or 2711 or even 4111); doing
+so achieves no extra security, because anyone can find the binary in
+the freely available Debian package - it is merely inconvenient. For
+the same reason you should not restrict read or execute permissions on
+non-set-id executables.
+<p>
+
+Some setuid programs need to be restricted to particular sets of
+users, using file permissions. In this case they should be owned by
+the uid to which they are set-id, and by the group which should be
+allowed to execute them. They should have mode 4754; there is no
+point in making them unreadable to those users who must not be allowed
+to execute them.
+<p>
+
+Do not arrange that the system administrator can only reconfigure the
+package to correspond to their local security policy by changing the
+permissions on a binary. Ordinary files installed by <prgn/dpkg/ (as
+opposed to conffiles and other similar objects) have their permissions
+reset to the distributed permissions when the package is reinstalled.
+Instead you should consider (for example) creating a group for people
+allowed to use the program(s) and making any setuid executables
+executable only by that group.
+<p>
+
+Shared libraries should be installed executable.
+
+<sect>Configuration files
+<p>
+
+Any configuration files created or used by your package should reside
+in <tt>/etc</tt>. If there are several you should consider creating a
+subdirectory named after your package.
+<p>
+
+It is almost certain that any file in <tt>/etc</tt> that is in your
+package's filesystem archive should be listed in <prgn/dpkg/'s
+<tt/conffiles/ control area file. (See the <prgn/dpkg/ programmers'
+manual).
+
+<sect>Maintainer scripts
+<p>
+
+The package installation scripts should avoid producing output which
+it is unnecessary for the user to see and should rely on <prgn/dpkg/ to
+stave off boredom on the part of a user installing many packages.
+This means, amongst other things, using the <tt/--quiet/ option on
+<prgn/install-info/.
+<p>
+
+Packages should try to minimise the amount of prompting they need to
+do, and they should ensure that the user will only every be asked each
+question once. This means that packages should try to use appropriate
+shared configuration files (such as <tt>/etc/papersize</> and
+<tt>/etc/news/server</>, rather than each prompting for their own
+list of required pieces of information.
+<p>
+
+It also means that an upgrade should not ask the same questions again,
+unless the user has used <tt/dpkg --purge/ to remove the package's
+configuration. The answers to configuration questions should be
+stored in an appropriate place in <tt>/etc</> so that the user can
+modify them, and how this has been done should be documented.
+<p>
+
+If a package has a vitally important piece of information to pass to
+the user (such as "don't run me as I am, you must edit the following
+configuration files first or you risk your system emitting
+badly-formatted messages"), it should display this in the
+<prgn/postinst/ script and prompt the user to hit return to
+acknowledge the message. Copyright messages do not count as vitally
+important (they belong in <tt>/usr/doc/copyright</>); neither do
+instructions on how to use a program (these should be in on line
+documentation, where all the users can see them).
+<p>
+
+Any necessary prompting should almost always be confined to the
+post-installation script, and should be protected with a conditional
+so that unnecssary prompting doesn't happen if a package's
+installation fails and the <prgn/postinst/ is called with
+<tt/abort-upgrade/, <tt/abort-remove/ or <tt/abort-deconfigure/.
+<p>
+
+Errors which occur during the execution of an installation script
+<em/must/ be checked and the installation <em/must not/ continue after
+an error.
+<p>
+
+The section below on scripts in general applies to package maintainer
+scripts too.
+
+<sect>Scripts in general
+<p>
+
+All command scripts, including the package maintainer scripts inside
+the package and used by <prgn/dpkg/, should have a <tt/#!/ line naming
+the shell to be used to interpret them.
+<p>
+
+In the case of Perl scripts this should be <tt>#!/usr/bin/perl</tt>.
+<p>
+
+Shell scripts (<prgn/sh/ and <prgn/bash/) should almost certainly
+start with <tt>set -e</> so that errors are detected. Every script
+<em/must/ use <tt/set -e/ or check the exit status of <em/every/
+command.
+<p>
+
+Perl scripts should check for errors when making any system calls,
+including <tt/open/, <tt/print/, <tt/close/, <tt/rename/ and
+<tt/system/.
+<p>
+
+<prgn/csh/ and <prgn/tcsh/ should be avoided as scripting languages. See
+Csh Programming Considered Harmful, one of the <tt/comp.unix.*/ FAQs.
+If an upstream package comes with <prgn/csh/ scripts then you must make
+sure that they start with <tt>#!/bin/csh</tt> and make your package
+depend on <prgn/csh/.
+<p>
+
+<sect>Compilation options
+<p>
+
+Generally the following compilation parameters should be used:
+<example>
+CC = gcc
+CFLAGS = -O2 -g -Wall # sane warning options vary between programs
+LDFLAGS = # none
+install -s # (or use strip on the files in debian/tmp)
+</example>
+<p>
+
+Note that all installed binaries should be stripped, either by using
+the <tt/-s/ flag to <prgn/install/, or by calling <prgn/strip/ on the
+binaries after they have been copied into <tt>debian/tmp</> but
+before the tree is made into a package.
+<p>
+
+Make sure that you do not link with <tt/-g/, as this makes a.out
+compilers produce huge statically linked binaries. The <tt/-g/ flag
+is useful on compilation so that you have available a full set of
+debugging symbols in your built source tree, in case anyone should
+file a bug report involving (for example) a core dump.
+<p>
+
+The <tt/-N/ flag should not be used. On a.out systems it may have
+been useful for some very small binaries, but for ELF it has no good
+effect.
+<p>
+
+It is up to the package maintainer to decide what compilation options
+are best for the package. Certain binaries (such as
+computationally-intensive programs) may function better with certain
+flags (<tt/-O3/, for example); feel free to use them. Please use good
+judgment here. Don't use flags for the sake of it; only use them if
+there is good reason to do so. Feel free to override the upstream
+author's ideas about which compilation options are best - they are
+often inappropriate for our environment.
+<p>
+
+Please make sure that you use only released versions of shared
+libraries to build your packages; otherwise other users will not be
+able to run your binaries properly. Producing source packages that
+depend on unreleased compilers is also usually a bad idea.
+
+<sect>Shared library packages
+<p>
+
+Packages involving shared libraries should be split up into several
+binary packages.
+<p>
+
+For a straightforward library which has a development environment and
+a runtime kit including just shared libraries you need to create two
+packages: <tt/<var/libraryname/<var/soname//<footnote><var/soname/ is
+the shared object name of the shared library - it's the thing that has
+to match exactly between building an executable and running it for the
+dynamic linker to be able run the program. Usually the <var/soname/
+is the major number of the library.</footnote> and
+<tt/<var/libraryname/<var/soname/-dev/.
+<p>
+
+If you prefer only to support one development version time you may
+name the development package <tt/<var/libraryname/-dev/; otherwise you
+may wish to use <prgn/dpkg/'s conflicts mechanism to ensure that the
+user only installs one development version at a time (after all,
+different development versions are likely to have the same header
+files in them, causing a filename clash if both are installed).
+Typically the development version will also need an exact version
+dependency on the runtime library, to make sure that compilation and
+linking happens correctly.
+<p>
+
+Packages which use the shared library should have a dependency on the
+name of the shared library package,
+<tt/<var/libraryname/<var/soname//. When the <var/soname/ changes you
+can have both versions of the library installed while moving from the
+old library to the new.
+<p>
+
+If your package has some run-time support programs which use the
+shared library you must <em/not/ put them in the shared library
+package. If you do that then you won't be able to install several
+versions of the shared library without getting filename clashes.
+Instead, either create a third package for the runtime binaries (this
+package might typically be named <tt/<var/libraryname/-runtime/ - note
+the absence of the <var/soname/ in the package name) or if the
+development package is small include them in there.
+<p>
+
+If you have several shared libraries built from the same source tree
+you can lump them all togther into a single shared library package,
+provided that you change all their <var/soname/s at once (so that you
+don't get filename clashes if you try to install different versions of
+the combined shared libraries package).
+<p>
+
+Follow the directions in the <prgn/dpkg/ programmers' manual for
+putting the shared library in its package.
+
+<sect>Application configuration files, dotfiles and <tt>/etc/skel</>
+<p>
+
+Files in <tt>/etc/skel</> will automatically be copied into new user
+accounts by <prgn/adduser/. They should not be referenced there by
+any program.
+<p>
+
+Therefore, if a program needs a dotfile to exist in advance in
+<tt/$HOME/ to work sensibly that dotfile should be installed in
+<tt>/etc/skel</> (and listed in conffiles, if it is not generated and
+modified dynamically by the package's installation scripts).
+<p>
+
+However, programs that require dotfiles in order to operate sensibly
+(dotfiles that they do not create themselves automatically, that is)
+are a bad thing, and programs should be configured by the Debian
+default installation as close to normal as possible.
+<p>
+
+Therefore, if a program in a Debian package needs to be configured in
+some way in order to operate sensibly that configuration should be
+done in a site-wide global configuration file elsewhere in
+<tt>/etc</>. Only if the program doesn't support a site-wide default
+configuration and the package maintainer doesn't have time to add it
+should a default per-user file be placed in <tt>/etc/skel</>.
+<p>
+
+<tt>/etc/skel</> should be as empty as we can make it. This is
+particularly true because there is no easy mechanism for ensuring that
+the appropriate dotfiles are copied into the accounts of existing
+users when a package is installed.
+<p>
+
+Ideally the sysadmin should ideally not have to do any configuration
+other than that done (semi-)automatically by the postinst script.
+
+<sect id="mail">Mail processing on Debian systems
+<p>
+
+Debian packages which process electronic mail, whether
+mail-user-agents (MUAs) or mail-transport-agents (MTAs), <em/must/
+make sure that they are compatible with the configuration decisions
+below. Failure to do this may result in lost mail, broken <tt/From:/
+lines, and other serious brain damage!
+<p>
+
+The mail spool is <tt>/var/spool/mail</> and the interface to send a
+mail message is <tt>/usr/sbin/sendmail</> (as per the FSSTND). The
+mail spool is part of the base system and not part of the MTA package.
+<p>
+
+Mailboxes are locked using the <tt/<var/username/.lock/ lockfile
+convention, rather than <prgn/fcntl/, <prgn/flock/ or <prgn/lockf/.
+<p>
+
+Mailboxes are generally 660 <tt/<var/user/.mail/ unless the user has
+chosen otherwise. A MUA may remove a mailbox (unless it has
+nonstandard permissions) in which case the MTA or another MUA must
+recreate it if needed. Mailboxes must be writeable by group mail.
+<p>
+
+The mail spool is 2775 <tt/mail.mail/, and MUA's need to be setgid
+mail to do the locking mentioned above (and obviously need to avoid
+accessing other users' mailboxes using this privilege).
+<p>
+
+<tt>/etc/aliases</> is the source file for the system mail aliases
+(e.g. postmaster, usenet, etc.) - it is the one which the sysadmin
+and postinst scripts may edit. After <tt>/etc/aliases</> is edited
+the program or human editing it must call <prgn/newaliases/. All MTA
+packages should come with a <prgn/newaliases/ program, even if it does
+nothing, but older MTA packages do not do this so programs should not
+fail if <prgn/newaliases/ cannot be found.
+<p>
+
+The convention of writing <tt/forward to <var/address// in the mailbox
+itself is not supported. Use a <tt/.forward/ file instead.
+<p>
+
+The location for the <prgn/rmail/ program used by UUCP for incoming
+mail is <tt>/usr/sbin/rmail</>, as per the FSSTND. Likewise,
+<prgn/rsmtp/, for receiving batch-SMTP-over-UUCP, is in
+<tt>/usr/sbin/rsmtp</> if it is supported.
+<p>
+
+Smail is not using HoneyDanBer UUCP, whose <prgn/uux/ apparently
+accepts <tt/-a/ and <tt/-g/ options.
+<p>
+
+If you need to know what name to use (for example) on outgoing news
+and mail messages which are generated locally, you should use the file
+<tt>/etc/mailname</>. It will contain the portion after the username
+and <tt/@/ (at) sign for email addresses of users on the machine
+(followed by a newline).
+<p>
+
+A package should check for the existence of this file. If it exists
+it should use it without comment.<footnote>An MTA's prompting
+configuration script may wish to prompt the user even if it finds this
+file exists.</footnote> If it does not exist it should prompt the user
+for the value and store it in <tt>/etc/mailname</> as well as using it
+in the package's configuration. The prompt should make it clear that
+the name will not just be used by that package. E.g., in this
+situation the INN package says:
+<example>
+Please enter the `mail name' of your system. This is the hostname
+portion of the address to be shown on outgoing news and mail messages.
+The default is <var/syshostname/, your system's host name.
+Mail name [`<var/syshostname/']:
+</example>
+where <var/syshostname/ is the output of <tt/hostname -fqdn/.
+
+
+<sect>Packages which can use the X shared libraries
+<p>
+
+Some programs can be configured with or without support for X Windows.
+Typically these binaries produced when configured for X will need the
+X shared libraries to run.
+<p>
+
+Such programs should be configured <em/with/ X support, and should
+declare a dependency on <tt/elf-x11r6lib/ (for the X11R6 libraries).
+Users who wish to use the program can install just the relatively
+small <tt/xlib/ package, and do not need to install the whole of X.
+<p>
+
+Do not create two versions (one with X support and one without) of
+your package.
+
+
+<sect>Games
+<p>
+
+The permissions on /var/lib/games are 755 <tt/root.root/.
+<p>
+
+Each game decides on its own security policy.
+<p>
+
+Games which require protected, privileged access to high-score files,
+savegames, &c, must be made set-<em/group/-id (mode 2755) and
+owned by <tt/root.games/, and use files and directories with
+appropriate permissions (770 <tt/root.games/, for example). They must
+<em/not/ be made set-<em/user/-id, as this causes security
+problems.<footnote>If an attacker can subvert any set-user-id game
+they can overwrite the executable of any other, causing other players
+of these cames to run a trojan. With a set-group-id game the attacker
+only gets access to less important game data, and if they can get at
+the other players' accounts at all it will take considerably more
+effort.</footnote>
+<p>
+
+Some packages, for example some fortune cookie programs, are
+configured by the upstream authors to install with their data files or
+other static information made unreadable so that they can only be
+accessed through set-id programs provided. Do not do this in a Debian
+package: anyone can download the <tt/.deb/ file and read the data from
+it, so there is no point making the files unreadable. Not making the
+files unreadable also means that you don't have to make so many
+programs set-id, which reduces the risk of a security hole.
+
+<sect>Allocating package-specific users and groups
+<p>
+
+If you need to create a new user or group for your package there are
+two possibilities. Firstly, you may need to make some files in the
+binary package be owned by this user or group, or you may need to
+compile the user or group id (rather than just the name) into the
+binary (though this latter should be avoided if possible). In this
+case you need a statically allocated id.
+<p>
+
+You must ask for a user or group id from the base system maintainer,
+and must not release the package until you have been allocated one.
+Once you have been allocated one you must make the package depend
+on a version of the base system with the id present in
+<tt>/etc/passwd</tt> or <tt>/etc/group</tt>, or alternatively arrange
+for your package to create the user or group itself with the correct
+id (using <tt/adduser/) in its pre- or post-installation script (the
+latter is to be preferred if it is possible).
+<p>
+
+On the other hand, the program may able to determine the uid or gid
+from the group name at runtime, so that a dynamic id can be used. In
+this case you must choose an appropriate user or group name,
+discussing this on <prgn/debian-devel/ and checking with the base system
+maintainer that it is unique and that they do not wish you to use a
+statically allocated id instead. When this has been checked you must
+arrange for your package to create the user or group if necessary
+using <prgn/adduser/ in the pre- or post-installation script (again, the
+latter is to be preferred if it is possible).
+<p>
+
+Note that changing the numeric value of an id associated with a name
+is very difficult, and involves searching the filesystem for all
+appropriate files. You need to think carefully whether a static or
+dynamic id is required, since changing your mind later will cause
+problems.
+
+<chapt id="sourcepkg">Source package
+
+<sect>Documentation and the <tt/changelog/
+<p>
+
+Document your changes and updates to the source package properly in
+the <tt>debian/changelog</tt> file.
+<p>
+
+A copy of the file which will be installed in
+<tt>/usr/doc/copyright/<var/package/</tt> should be in
+<tt>debian/copyright</tt>.
+<p>
+
+In non-experimental packages you may only use a format for
+<tt>debian/changelog</> which is supported by the most recent released
+version of <prgn/dpkg/. If your format is not supported and there is
+general support for it you should contact the <prgn/dpkg/ maintainer
+to have the parser script for your format included in the <prgn/dpkg/
+package.<footnote>You will need to agree that the parser and its
+manpage may be distributed under the GNU GPL, just as the rest of
+<prgn/dpkg/ is.</footnote>
+
+<sect>Changes to the upstream sources
+<p>
+
+If you need to edit a <prgn/Makefile/ where GNU-style <prgn/configure/
+scripts are used, you should edit the <tt/.in/ files rather than
+editing the <prgn/Makefile/ directly. This allows the user to
+reconfigure the package if necessary. You should <em/not/ configure
+the package and edit the generated <prgn/Makefile/! This makes it
+impossible for someone else to later reconfigure the package.
+<p>
+
+If changes to the source code are made that are generally applicable
+please try to get them included in the upstream version of the package
+by supplying the upstream authors with the changes in whatever form
+they prefer.
+<p>
+
+If you need to configure the package differently for Debian or for
+Linux, and the upstream source doesn't provide a way to configure it
+the way you need to, please add such configuration facilities (for
+example, a new <prgn/autoconf/ test or <tt/#define/) and send the
+patch to the upstream authors, with the default set to the way they
+originally had it. You can then easily override the default in your
+<tt>debian/rules</tt> or wherever is appropriate.
+
+<sect>Error trapping in makefiles
+<p>
+
+When <prgn/make/ invokes a command in a makefile (including your
+package's upstream makefiles and the <tt>debian/rules</>) it does so
+using <tt/sh/. This means that <tt/sh/'s usual bad error handling
+properties apply: if you include a miniature script as one of the
+commands in your makefile you'll find that if you don't do anything
+about it then errors are not detected and <prgn/make/ will blithely
+continue after problems.
+<p>
+
+Every time you put more than one shell command (this includes using a
+loop) in a makefile command you <em/must/ make sure that errors are
+trapped. For simple compound commands, such as changing directory and
+then running a program, using <tt/&&/ rather than semicolon as
+a command separator is sufficient. For more complex commands
+including most loops and conditionals you must include a separate
+<tt/set -e/ command at the start of every makefile command that's
+actually one of these miniature shellscripts.
+
+<sect>Permissions
+<p>
+
+All the files in the source package should be world-readable and
+user-writeable. Directories and executable programs should be
+world-exectuable. None of the files should be world-writeable. The
+files may or may not be group-writeable, and directories may or may
+not be setgid. Pipes should not be world-readable and should be
+either both group readable and writeable or neither (and they should
+not be executable).
+<p>
+
+In summary: data files may be <tt/664/, <tt/644/. Executable files
+may be <tt/775/ or <tt/755/. Directories may be <tt/775/, <tt/755/,
+<tt/2775/ or <tt/2755/. Pipes may be <tt/660/ or <tt/600/.
+
+<chapt id="developer">How to become a Debian developer
+
+<sect>Before you start work
+<p>
+
+So, you've read all the documentation, you understand what everything
+in the <prgn/hello/ example package is for, and you're about to
+Debianise your favourite package. How do you actually become a Debian
+developer so that your work can be incorporated into the Project?
+<p>
+
+Firstly, subscribe to <prgn/debian-devel/ if you haven't already.
+Send the word <tt/subscribe/ in the <em/Subject/ of a mail to
+<email/debian-devel-REQUEST@lists.debian.org/. In case of problems
+contact the list administrator, Anders Chrigstrom <email/ac@netg.se/.
+<p>
+
+You should to subscribe and lurk for a bit before doing any coding,
+and you should post about your intentions to work on something to
+avoid duplicated effort.
+<p>
+
+If you do not have a PGP key yet generate one. You should probably
+read the PGP manual, as it has much important information which is
+critical to its security. Many more security failures are due to
+human error than to software failure or high-powered spy techniques.
+
+<sect>When you have a package to upload
+<p>
+
+When you have your package ready to be uploaded you must send a
+message to the project leader, Bruce Perens <email/bruce@pixar.com/,
+the administrator of <tt/master.debian.org/, Simon Shapiro
+<email/shimon@i-connect.net/, the mailing list administrator, Anders
+Chrigstrom <email/ac@netg.se/ and the <prgn/dpkg/ maintainer, Ian
+Jackson <email/ijackson@gnu.ai.mit.edu/.
+<p>
+
+The message should say what you've done and who you are, and should
+ask for an account on <prgn/master/ and to be subscribed to
+<prgn/debian-private/ (the developers-only mailing list). It should
+contain your PGP key (extracted using <tt/pgp -kxa/) for the database
+of keys which is shipped with <prgn/dpkg/.
+
+When you have your personal account on <prgn/master/ log in and
+transfer the files to
+<tt>/home/Debian/ftp/private/project/Incoming</>. You cannot upload
+to <prgn/Incoming/ on <prgn/master/ using anonymous FTP.
+<p>
+
+You can also upload files to <prgn/Incoming/ via a <prgn/cron/-driven
+upload queue in Europe on <ftpsite/chiark.chu.cam.ac.uk/. For details
+connect to <prgn/chiark/ using anonymous FTP and read
+<ftppath>/pub/debian/private/project/README.how-to-upload</ftppath>.
+
+<sect id="changesfiles">Upload handling - <tt/.changes/ files
+<p>
+
+When a package is uploaded to the Debian FTP archive, it must be
+accompanied by a <tt/.changes/ file which gives directions for its
+handling. This is usually generated by <prgn/dpkg-genchanges/.
+<p>
+
+This file is a control file with the following fields:
+<list compact>
+<item><tt/Format/
+<item><tt/Date/
+<item><tt/Source/
+<item><tt/Binary/
+<item><tt/Architecture/
+<item><tt/Version/
+<item><tt/Distribution/
+<item><tt/Urgency/
+<item><tt/Maintainer/
+<item><tt/Description/
+<item><tt/Changes/
+<item><tt/Files/
+</list>
+<p>
+
+All of them are mandatory for a Debian upload. See the list of
+control fields in the <prgn/dpkg/ programmers' manual for the contents
+of these fields.
+
+
+<chapt id="mailinglists">The Debian mailing lists
+<p>
+
+The mailing list server is at <tt/lists.debian.org/. Mail
+<tt/debian-<var/foo/-REQUEST@lists.debian.org/<footnote>where
+<tt/debian-<var/foo// is the name of the list</footnote> with the word
+<tt/subscribe/ in the Subject to subscribe or <tt/unsubscribe/ to
+unsubscribe.
+<p>
+
+When replying to messages on the mailing list, please do not send a
+carbon copy (<tt/CC/ - this does not mean `courtesy copy') to the
+original poster. Anyone who posts to a mailing list should read it to
+see the responses.
+<p>
+
+As ever on the net, please trim down the quoting of articles you're
+replying to.
+
+</book>