Creating simple Debian packages
Tuesday, September 6th, 2011
Here's a quick way to create your own Debian package. This is merely a simple package which will not be included in the official Debian repositories, so we can ignore most of the Debian packaging guidelines.
First off, we need to create a directory which shall hold the contents of the package. In this case, a simple Python script called 'myscript'.
Next, we need to create the control file. This file contains some meta-data for the Debian package such as the name, description, etc. It lives in a special directory called 'DEBIAN' in the root of the package.
We put the following contents in the control file
Package: myscript Version: 0.1 Section: utils Priority: optional Architecture: all Essential: no Depends: python Maintainer: Your Name
Description: The short description of the script A longer description of the descript, possible spanning multiple lines.
Most of these fields are rather self-explanatory. You can find a list of valid Sections on the "List of Sections" page. Make sure to use the last part of the URL, not the actual title of the section. For scripts, the Architecture will almost always be 'all'. The Depends field tells the package installation software which other packages should be installed for this package to work correctly. Multiple packages can be specified by separating them with commas. See Chapter 7 of the Debian Policy Manual for details. The Description field is a single line containing a simple description of the package. The extended description can be placed under it, and may span multiple lines. Prefix each line with a single space.
Now we add the actual contents of the package to the myscript directory. We shall be installing the script in /usr/bin, so we create that directory and place our script in it.
mkdir -p myscript/usr/bin
cp ~/dev/myscript myscript/usr/bin/
Here's the final directory layout of the myscript directory:
myscript myscript/usr myscript/usr/bin myscript/usr/bin/myscript myscript/DEBIAN myscript/DEBIAN/control
The final step: actually creating the package!
fakeroot dpkg-deb --build myscript
fakeroot is a special tool that runs another program (in this case dpkg-deb) and fakes all filesystem ownerships as being 'root:root'. This is needed because the files in this Debian package need to be owned by root. The dpkg-deb --build command takes care of creating the package.
The myscript.deb Debian package can now be installed on your system using dpkg:
dpkg -i ./myscript.deb
Users of a GUI can usually right-click .deb files in their file managers and choose to install them from there. There are no special things to consider for de-installation of the package, unless the binary in your package creates files in non-temporary storage or users' homedirs.
Please note again that this is not an official Debian package, and is missing many things required in well-made Debian packages ready for inclusion in the official Debian repositories.
If you want to include configuration files in the package, just add a etc/ directory in your package:
myscript myscript/etc myscript/etc/myscript myscript/etc/myscript/myscript.conf
Normally when upgrading a package that contains a configuration file, Debian asks:
Configuration file `/etc/myscript/myscript.conf' ==> Modified (by you or by a script) since installation. ==> Package distributor has shipped an updated version. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : start a shell to examine the situation The default action is to keep your current version. *** tvtgrab.conf (Y/I/N/O/D/Z) [default=N] ?
To get the same thing for your package, you'll have to let dpkg know which files are configuration files. You can do so by including a conffiles in the DEBIAN directory:
cat myscript/DEBIAN/conffiles /etc/myscript/myscript.conf
Debian will now recognize your configuration files.