{OK} Back

/!\ DocBookized version is available into the cdbs package.
You can find a bleeding edge version here :
http://cdbs-doc.duckcorp.org/
(docbook sources and other output formats are also available in the same directory)

This wiki page is not gonna be updated anymore !




(updated to 0.4.27-3)

CDBS

Introduction

CDBS has been created by Jeff Bailey & Colin Walters, later joined by 4 other developpers.

you can find the project page here : http://alioth.debian.org/projects/build-common/

Why CDBS ?

CDBS has been designed to simplify maintainer's work so they only think about packaging and not maintaining a 'debian/rules' file still growing bigger and more complicated. So CDBS can handle for you most of common rules and detect some parts of your configuration.

CDBS only use simple makefile rules and is easily extensible using classes. Classes for handling autotools buildsys, applying patches to source, gnome softwares, python intall, and so on are available.

CDBS advantages :

Where the hell is da fuckin' documentation ?

You'd probably searched all over the web for any documentation, but there is NO AVAILABLE DOCUMENTATION; what a shame !

The only help you can have is exemples in here :
http://alioth.debian.org/scm/controlleroo.php?group_id=23&dir_name=/cdbs/examples
(also available in the package here : /usr/share/doc/cdbs/examples/)
The other way is UTSL.

Of course this present document is not a tutorial because we won't share any secret information we gathered when experimenting this tool :D

First steps

Convert pkg to CDBS

Converting to CDBS is easy; A simple 'debian/rules' for a C/C++ software with no extra rules would be written as this :

include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/autotools.mk

No, i'm not joking, this is sufficient to handle autotools management, like updating config.{guess|sub}, cleanup temp files after build and launch all common debhelper stuff.

Just use compat level 4 (i don't know if 3 works), create your <pkg>.install, <pkg>.info, etc as you usually do with dh_* scripts, and CDBS would call them if necessary, autodetecting a lot of things. (in case of a missing compat information, CDBS would create 'debian/compat' file with compatibility level 4)

/!\ If 'debian/control' management is activated (see below), build dependency on 'cdbs' is automatically added, if not, you will have to do it yourself.

Basic settings and available variables

Remember you can get the pkg directory using the $(CURDIR) variable.

You can change common build parameters this way :

# where sources are
DEB_SRCDIR = $(CURDIR)/src
# in which directory to build
DEB_BUILDDIR = $(DEB_SRCDIR)/build
# in which directory to install the sofware
DEB_DESTDIR = $(CURDIR)/plop/

Some various variables you can use in 'debian/rules' :

DEB_SOURCE_PACKAGE

name of the source package

DEB_VERSION

full Debian version

DEB_NOEPOCH_VERSION

Debian version without epoch

DEB_ISNATIVE

non-empty if package is native

DEB_ALL_PACKAGES

list of all binary packages

DEB_INDEP_PACKAGES

list of architecture independant binary packages

DEB_ARCH_PACKAGES

list of architecture dependant binary packages

DEB_PACKAGES

list of normal (non-udeb) binary packages

DEB_UDEB_PACKAGES

list of udeb binary packages, if any

DEB_ARCH

the old Debian architecture name
/!\ deprecated, only use to provide backward compatibility /!\
(see man dpkg-architecture for more information)

DEB_HOST_GNU_TYPE

the GNU system type of the host machine

DEB_HOST_GNU_SYSTEM

the CPU part of DEB_HOST_GNU_TYPE

DEB_HOST_GNU_CPU

the System part of DEB_HOST_GNU_TYPE

DEB_HOST_ARCH

the Debian architecture of the host machine

DEB_BUILD_GNU_TYPE

the GNU system type of the build machine

DEB_BUILD_GNU_SYSTEM

the System part of DEB_BUILD_GNU_TYPE

DEB_BUILD_GNU_CPU

the CPU part of DEB_BUILD_GNU_TYPE

DEB_BUILD_ARCH

the Debian architecture of the build machine

Basic custom build rules

Suppose you want custom rules for the source package foo, creating foo (arch-dep) and foo-data (arch-indep), you simply need to add some lines to 'debian/rules'.

To add pre-configure actions :

makebuilddir/foo::
   ln -s plop plop2

To add post-configure actions :

configure/foo::
   sed -ri 's/PLOP/PLIP/' Makefile

configure/foo-data::
   touch src/z.xml

/!\ in this case we are talking bout package configuration and NOT about a configure script made with autotools.

To add post-build actions :

build/foo::
   /bin/bash debian/scripts/toto.sh

build/foo-data::
   $(MAKE) helpfiles

To add post-install actions :

install/foo::
   cp debian/tmp/myfoocmd debian/foo/foocmd
   find debian/foo/ -name "CVS" -depth -exec rm -rf {} \;

install/foo-date::
   cp data/*.png debian/foo-data/usr/share/foo-data/images/
   dh_stuff -m ipot -f plop.bz3 debian/foo-data/libexec/

To add post deb preparation actions :

binary/foo::
   strip --remove-section=.comment --remove-section=.note --strip-unneeded debian/foo/usr/lib/foo/totoz.so

To add pre-clean actions :

cleanbuilddir/foo::
   rm -f debian/fooman.1

Common Build Options

CFLAGS and CXXFLAGS are set to "-g -Wall -O2" by default.

DEB_BUILD_OPTIONS is a well known Debian environment variable, not a CDBS one, containing special build options (a comma-separated list of keywords). CDBS does check DEB_BUILD_OPTIONS to take these options into account ; see details in each classes.

Debhelper stuff

Not managing Debhelper

Yes, CDBS is doing almost everything for you :) .
Just add this line to the beginning of your 'debian/rules' file :

include /usr/share/cdbs/1/rules/debhelper.mk

CDBS debhelper rules handle the following dh_* scripts for each binary package automatically :

dh_builddeb
dh_clean
dh_compress
dh_fixperms
dh_gencontrol
dh_install
dh_installchangelogs

dh_installcron
dh_installdeb
dh_installdebconf
dh_installdirs
dh_installdocs
dh_installemacsen
dh_installexamples

dh_installinfo
dh_installinit
dh_installlogcheck
dh_installlogrotate
dh_installman
dh_installmenu
dh_installpam

dh_link
dh_makeshlibs
dh_md5sums
dh_perl
dh_shlibdeps
dh_strip

Other dh_* scripts can be handled in specific classes or may be called in custom rules.

/!\ If 'debian/control' management is activated (see below), build dependency on 'debhelper' is automatically added, if not, you will have to do it yourself.

Debhelper parameters

The following parameters allow debhelper calls customization while most common calls and still handled without writing any rule. Some of them apply on all binary packaged, like DEB_INSTALL_DOCS_ALL, and some apply only to a specific package, like DEB_SHLIBDEPS_LIBRARY_<package> (where <package> is the name of the binary package). Read the comments in '/usr/share/cdbs/1/rules/debhelper.mk' for a complete listing. Some non-exhaustive examples follows.

To specify a tigh dependency on a package containing shared libraries :

DEB_DH_MAKESHLIBS_ARGS_libfoo := -V"libfoo (>= 0.1.2-3)"
DEB_SHLIBDEPS_LIBRARY_arkrpg := libfoo
DEB_SHLIBDEPS_INCLUDE_arkrpg := debian/libfoo/usr/lib/

To install a changelog file with an uncommon name as 'Changelog.gz' :

DEB_INSTALL_CHANGELOGS_ALL := ProjectChanges.txt

To avoid compressing files with '.py' extension :

DEB_COMPRESS_EXCLUDE := .py

To register a debug library package libfoo-dbg for libfoo (which needs unstripped '.so') :

DEB_DH_STRIP_ARGS := --dbg-package=libfoo

Perl-specific debhelper options (dh_perl call is always performed) :

# Add a space-separated list of paths to search for perl modules
DEB_PERL_INCLUDE := /usr/lib/perl-z
# Like the above, but for the 'libperl-stuff' package
DEB_PERL_INCLUDE_libperl-stuff := /usr/lib/perl-plop

# Overrides options passed to dh_perl
DEB_DH_PERL_ARGS := -d

Debhelper custom build rules

CDBS debhelper rules also add more adequate build rules.

To add post deb preparation including debhelper stuff) actions :

binary-install/foo::
   chmod a+x debian/foo/usr/bin/pouet

To add post clean actions :

clean::
   rm -rf plop.tmp

Several other rules exists, but we have not tested them :

Common tasks

Patching sources (using simple-patchsys)

First, patching sources directly is really BAD(tm), so you need a way to apply patches without touching any files. These rules, inpired by the Dpatch system, are quite similar and powerful. All you need is diff/patch knowledge, CDBS is doing the rest.

That's quite hard, so please listen carefully and prepare for examination.

First, add this line to your 'debian/rules' :

include /usr/share/cdbs/1/rules/simple-patchsys.mk

And then use it !

Create the directory 'debian/patches' and put your patches in it. Files should be named so as to reflect in which order they have to be applied, and must finish with the '.patch' or '.diff' suffix. The class would take care of patching before configure and unpatch after clean. It is possible to use patch level 0 to 3, and CDBS would try them and use the right level automatically. The system can handle compressed patch with additionnal '.gz' or '.bz2' suffix.

You can customize the directories where patches are searched, and the suffix like this : (defaults are : .diff .diff.gz .diff.bz2 .patch .patch.gz .patch.bz2)

DEB_PATCHDIRS := debian/mypatches
DEB_PATCH_SUFFIX := .plop

In case of errors when applying, for example 'debian/pacthes/01_hurd_ftbfs_pathmax.patch', you can read the log for this patch in 'debian/pacthes/01_hurd_ftbfs_pathmax.patch.level-0.log' ('0' because a level 0 patch).

/!\ If 'debian/control' management is activated (see below), build dependency on 'patchutils' is automatically added, if not, you will have to do it yourself.

Patching sources (using dpatch)

To use Dpatch as an alternative to the CDBS included patch system, just add his line to your 'debian/rules' :

include /usr/share/cdbs/1/rules/dpatch.mk

Now you can use Dpatch as usual and CDBS would call it automatically.

/!\ If 'debian/control' management is activated (see below), build dependency on 'dpatch' and 'patchutils' is automatically added, if not, you will have to do it yourself.

Automatic tarball management

To use the CDBS tarball system, just add his line to your 'debian/rules', and specify the name of the top directory of the extracted tarball :

include /usr/share/cdbs/1/rules/tarball.mk

DEB_TAR_SRCDIR := foosoft

CDBS will recognize tarballs with the following extensions : .tar .tgz .tar.gz .tar.bz .tar.bz2 .zip

The tarball location is autodetected if in the top source directory, or can be specified :

DEB_TARBALL := $(CURDIR)/tarballdir/mygnustuff_beta-1.2.3.tar.gz

CDBS will handle automatic uncompression and cleanups, automagically set DEB_SRCDIR and DEB_BUILDDIR for you, and integrate well with other CDBS parts (like autotools class).

Moreover, if you want sources to be cleaned up from dirty SCM-specific dirs and file, just add this at the top of your 'debian/rules', before any include :

DEB_AUTO_CLEANUP_RCS := yes

/!\ If needed, and if 'debian/control' management is activated (see below), build dependency on 'bzip2' or 'unzip' is automatically added, if not, you will have to do it yourself.

Advanced customisation

'debian/control' management

This feature allow :

Build-related Build-Depends are dependencies introduced by the use of certain CDBS features, or autodetected needs.

Embedded shell commands allows including hacks like :

Build-Depends: libgpm-dev [`type-handling any linux-gnu`]

CPU and System criterias implements support for Cpu/System fields, as a replacement for the Architecture field (which is to be implemented in dpkg in the long term). Here is an exemple, before :

Architecture: all

and after :

Cpu: all
System: all

If these fields are used, it is also possible to include special tags to easily takes advantage of the 'type-handling' tool, like in this example :

Build-Depends: @cdbs@, procps [system: linux], plop [cpu: s390]

(look at the 'type-handling' package documentation, for more information)

Here is the recipe :
Rename 'debian/control' into 'debian/control.in'.
Replace cdbs / debhelper / ... Build-Depends with @cdbs@ in your 'debian/control.in' like this :

Build-Depends-Indep: @cdbs@, python-dev (>= 2.3), python-soya (>= 0.9), python-soya (<< 0.10), python-openal(>= 0.1.4-4), gettext

Add the following line to 'debian/rules', before any include :

DEB_AUTO_UPDATE_DEBIAN_CONTROL := yes

Then do a "debian/rules clean" run to (re)generate 'debian/control'.

Common buildsystems using libtool/autotools (autotools class)

This class is able to use configure scripts and makefiles generated with autotools (and possibly libtool). All rules are called automatically and clean rules to remove generated files during build are also added.

To use it, just add this line to your 'debian/rules'

include /usr/share/cdbs/1/class/autotools.mk

CDBS automatically handle common flags to pass to the configure script, but it is possible to give some extra parameters :

DEB_CONFIGURE_EXTRA_FLAGS := --with-ipv6 --with-foo

If the build system use non-standard configure options you can override CDBS default behavior :

COMMON_CONFIGURE_FLAGS := --program-dir=/usr

(notice that DEB_CONFIGURE_EXTRA_FLAGS would still be appended)

If some specific environnement variables need to be setup, use :

DEB_CONFIGURE_SCRIPT_ENV += LDFLAGS=" -Wl,-z,defs -Wl,-O1"

CDBS will automatically update 'config.sub', 'config.guess', and 'config.rpath' before build and restore the old ones at clean stage (even if using the tarball system). If needed, and if 'debian/control' management is activated, 'autotools-dev' and/or 'gnulib' will then be automatically added to the build dependencies (needed to find updated versions of the files).

If the program does not use the top source directory to store autoconf files, you can teach CDBS where it is to be found :

DEB_AC_AUX_DIR = $(DEB_SRCDIR)/autoconf

CDBS can be asked to update libtool, autoconf, and automake files, but this behavior is likely to break the build system and is STRONGLY discouraged. Nevertheless, if you still want this feature, set the following variables :

(corresponding build dependencies will automatically be added)

The following make parameters can be overridden :

# these are the defaults CDBS provides
DEB_MAKE_INSTALL_TARGET := install DESTDIR=$(DEB_DESTDIR)
DEB_MAKE_CLEAN_TARGET := distclean
DEB_MAKE_CHECK_TARGET :=

# example to work around dirty makefile
DEB_MAKE_INSTALL_TARGET := install prefix=$(CURDIR)/debian/tmp/usr

# example with unexistant install rule for make
DEB_MAKE_INSTALL_TARGET :=

# example to activate check rule
DEB_MAKE_CHECK_TARGET := check

DEB_BUILD_OPTIONS is checked for the following options :

CDBS automagically clean autotools files generated during build ('config.cache', 'config.log', and 'config.status').

Dealing with builsystems without libtool/autotools (makefile class)

This class is for the guys that have only a Makefile for building the program. You only need to have four rules in the Makefile :

To be honest, the install rules is not a must-have, but it always helps a lot when you've got it.

The first operation, is to write the debian/rules. First, we add the include lines :

include /usr/share/cdbs/1/class/makefile.mk

Now, it remains to tell cdbs the name of our four Makefile rules. With the previous examples it gives :

DEB_MAKE_CLEAN_TARGET    := mrproper
DEB_MAKE_BUILD_TARGET    := myprog 
DEB_MAKE_INSTALL_TARGET  := install DESTDIR=$(CURDIR)/debian/tmp/
# no check for this software
DEB_MAKE_CHECK_TARGET :=

# example when changing environnement variables is necessary :
DEB_MAKE_ENVVARS    := CFLAGS="-pwet"

DEB_BUILD_OPTIONS is checked for the following options :

If your Makefile doesn't support the DESTDIR variable, take a look in it and find the variable responsible for setting installation directory. If you don't find some variable to do this, you'll have to patch the file...

That's all :)

Using the Perl class

This class can manage standard perl build and install with MakaMaker method.

To use this class, add this line to your 'debian/rules' :

include /usr/share/cdbs/1/class/perlmodule.mk

Optionally, it can take care of using dh_perl, depending the debhelper class is declared before the perl class or not.

Install path defaults to '<first_pkg>/usr' where <first_pkg> is the first package in 'debian/control'.

You can customize build options like this :

# change MakeMaker defaults (should never be usefull)
DEB_MAKE_BUILD_TARGET := build-all
DEB_MAKE_CLEAN_TARGET := realclean
DEB_MAKE_CHECK_TARGET :=
DEB_MAKE_INSTALL_TARGET := install PREFIX=debian/stuff

# add custom MakeMaker options
DEB_MAKEMAKER_USER_FLAGS := --with-ipv6

Common makefile or general options can still be overrided : DEB_MAKE_ENVVARS, DEB_BUILDDIR (must match DEB_SRCDIR for Perl)

Have a look at Perl-specific debhelper options described above.

Using the Python class

This class can manage common python builds using 'distutils' automatically.

To use this class, add this line to your 'debian/rules' :

include /usr/share/cdbs/1/class/python-distutils.mk

Optionally, it can take care of using dh_python, depending the debhelper class is declared before the python class or not.

Most python packages are architecture all, and then don't need being build for multiple python versions ; your package should then be called 'python-<foo>' and CDBS would automatically use the current Debian python version to build it.
If your package contains a compiled part or a binding to an external lib, then you will have packages named 'python2.3-<foo>', 'python2.4-<foo>', and so on, depending on ${python:Depends} (and perhaps other packages), then CDBS would automatically build each package with the corresponding python version. In this case, don't forget to add a 'python-<foo>' convenience dummy package depending on the curent Debian python version.

You can customize build options like this :

# force using a specific python version for build
# (should not be necessary)
DEB_PYTHON_COMPILE_VERSION := 2.3

# change the python build script name (default is 'setup.py')
DEB_PYTHON_SETUP_CMD := install.py

# clean options for the python build script
DEB_PYTHON_CLEAN_ARGS = -all

# build options for the python build script
DEB_PYTHON_BUILD_ARGS = --build-base="$(DEB_BUILDDIR)/specific-build-dir"

# common additional install options for all binary packages ('--root' option is always set)
DEB_PYTHON_INSTALL_ARGS_ALL = --no-compile --optimize --force

# specific additional install options for binary package 'foo' ('--root' option is always set)
DEB_PYTHON_INSTALL_ARGS_foo := --root=debian/foo-install-dir/

Using the GNOME class

This class adds the following make environnement variable : GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1
(This is necessary because the Gconf schemas have to be registered at install time. In the case of packaging, this registration cannot be done when building the package, so this variable disable schema registration in 'make install'. This procedure if defered until gconftool-2 is called in 'debian/postinst' to register them, and in 'debian/prerm' to unregister them. The dh_gconf script is able to add the right rules automatically for you.)

It can handle the following dh_* scripts automagically :

dh_desktop
dh_gconf
dh_scrollkeeper

Moreover it adds some more clean rules :

To use it, just add this line to your 'debian/rules', after the debhelper class include :

include /usr/share/cdbs/1/class/gnome.mk

For more information on GNOME specific packaging rules, look at this link :
http://alioth.debian.org/docman/view.php/30194/18/gnome-policy-20030502-1.html

Using the Debian GNOME Team class

If you are part of the GNOME Team, or having the Team as Uploaders, and you feel bored maintaining the list of developpers, this class is made for you.

To use this class, add this line to your 'debian/rules' :

include /usr/share/gnome-pkg-tools/1/rules/uploaders.mk

Rename your 'debian/control' file to 'debian/control.in' and run the clean rule (./debian/rules clean) to regenerate the 'debian/control' file, replacing the '@GNOME_TEAM@' tag with the list of developpers automatically.

/!\ If you are using the 'debian/control' file management described below, please note this class will override this feature /!\ To cope with this problem, allowing at least Build-Depends handling, use the following work-arround (until it is solved in a proper way) :

# deactivate 'debian/control' file management
#DEB_AUTO_UPDATE_DEBIAN_CONTROL := yes

# ...
# includes and other stuff
# ...

clean::
  sed -i "s/@cdbs@/$(CDBS_BUILD_DEPENDS)/g" debian/control
  # other clean stuff

Not using the KDE class

{X} According to sensible people, >:> KDE >:> is a dreadful and ugly attempt to create a usuable desktop environment. So you are advised to jump to the GNOME class section before l00sing your mental health.

If you are really sure you want to enter in such a world of nightmares, add this line to your 'debian/rules' file :

include /usr/share/cdbs/1/class/kde.mk

CDBS automatically export the following variables with the right value :

DEB_BUILDDIR, DEB_AC_AUX_DIR and DEB_CONFIGURE_INCLUDEDIR are set to KDE defaults.

The following files are excluded from compression :

It can handle configure options specific to KDE (not forgeting disabling rpath and activating xinerama), set the correct autotools directory, and launch make rules adequately.

DEB_BUILD_OPTIONS is checked for the following options :

/!\ Notice we have NO experience with this class as we would NEVER need it. This section was written for mere convenience and completeness. Remember that using KDE is still strongly not recommanded...

Using the Ant (java-based build tool) class

To use this class, add this include to your 'debian/rules' and set the following variables :

include /usr/share/cdbs/1/class/ant.mk

# Set either a single (JAVA_HOME) or multiple (JAVA_HOME_DIRS) java locations
JAVA_HOME := /usr/local/java/jdk
# or set JAVACMD if you don't use default '<JAVA_HOME>/bin/java' path
#JAVACMD := /home/homer/java

# Set Ant location
ANT_HOME := /usr/local/java/ant

You may add additionnal JARs like in the following example :

# list of additionnal JAR files ('.jar' extension may be omited) (path must be absolute of relative to '/usr/share/java')
DEB_JARS := /usr/local/java-bonus/ldap-connector adml-adapter.jar

The property file defaults to 'debian/ant.properties'.

You can provide additionnal JVM arguments using ANT_OPTS. You can provide as well additionnal Ant command line arguments using ANT_ARGS (global) and/or ANT_ARGS_<pkg> (for package <pkg>), thus overriding the settings in 'build.xml' and the property file.

CDBS will build and clean using defaults target from 'build.xml'. To override these rules, or run the install / check rules, set the following variables to your needs :

# override build & clean target
DEB_ANT_BUILD_TARGET = makeitrule
DEB_ANT_CLEAN_TARGET = super-clean
# i want install and test rules to be run
DEB_ANT_INSTALL_TARGET = install-all
DEB_ANT_TEST_TARGET = check

DEB_BUILD_OPTIONS is checked for the following options :

/!\ Notice we have NO experience with this class. This section was written for mere convenience and completeness.

You should be able to fetch some more information on this java-based build tool there :
http://ant.apache.org/

Using the HBuild (Haskell mini-distutils) class

CDBS can take care of -hugs and -ghc packages : invoke 'Setup.lhs' properly for clean and install part.

To use this class, add this line to your 'debian/rules' :

include /usr/share/cdbs/1/class/hbuild.mk

/!\ Notice we have NO experience with this class. This section was written for mere convenience and completeness.

You should be able to fetch some more information on Haskell distutils in this thread :
http://www.haskell.org/pipermail/libraries/2003-July/001239.html

Hall of examples

GNOME + libtool/autotools + Simple patchsys example (gnome-panel)

'debian/control.in':

Source: gnome-panel
Section: gnome
Priority: optional
Maintainer: Marc Dequènes (Duck) <Duck@DuckCorp.org>
Uploaders: Sebastien Bacher <seb128@debian.org>, Arnaud Patard <arnaud.patard@rtp-net.org>, @GNOME_TEAM@
Standards-Version: 3.6.1.1
Build-Depends: @cdbs@, liborbit2-dev (>= 2.10.2-1.1), intltool, gnome-pkg-tools, libglade2-dev (>= 1:2.4.0), libwnck-dev (>= 2.8.1-3), scrollkeeper (>= 0.3.14-9.1), libgnome-desktop-dev (>= 2.8.3-2), libpng3-dev, sharutils, libbonobo2-dev (>= 2.8.0-3), libxmu-dev, autotools-dev, libedata-cal-dev (>= 1.0.2-3)

Package: gnome-panel
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, gnome-panel-data (= ${Source-Version}), gnome-desktop-data (>= 2.8.1-2), gnome-session (>= 2.8.1-4), gnome-control-center (>= 1:2.8.1-3)
Conflicts: gnome-panel2, quick-lounge-applet (<= 0.98-1), system-tray-applet, metacity (<= 2.6.0), menu (<< 2.1.9-1)
Recommends: gnome-applets (>= 2.8.2-1)
Suggests: menu (>= 2.1.9-1), yelp, gnome2-user-guide, gnome-terminal | x-terminal-emulator, gnome-system-tools
Description: launcher and docking facility for GNOME 2
 This package contains toolbar-like “panels” which can be attached to
 the sides of your X desktop, or left “floating”. It is designed to be
 used in conjunction with the Gnome Desktop Environment. Many features
 are provided for use with the panels – including an application menu,
 clock, mail checker, network monitor, quick launch icons and the like.

Package: libpanel-applet2-0
Section: libs
Architecture: any
Depends: ${shlibs:Depends}
Replaces: gnome-panel (<< 2.6.0-2)
Description: library for GNOME 2 panel applets
 This library is used by GNOME 2 panel applets.

Package: libpanel-applet2-dbg
Section: libdevel
Architecture: any
Depends: libpanel-applet2-0 (= ${Source-Version})
Description: library for GNOME 2 panel applets - library with debugging symbols
 This library is used by GNOME 2 panel applets.
 .
 This package contains unstripped shared libraries. It is provided primarily
 to provide a backtrace with names in a debugger, this makes it somewhat
 easier to interpret core dumps. The libraries are installed in
 /usr/lib/debug and can be used by placing that directory in
 LD_LIBRARY_PATH.
 Most people will not need this package.

Package: libpanel-applet2-dev
Section: libdevel
Architecture: any
Depends: libpanel-applet2-0 (= ${Source-Version}), libgnomeui-dev (>= 2.7.1-1)
Replaces: gnome-panel (<< 2.6.0-2), gnome-panel-data (<< 2.6.0)
Description: library for GNOME 2 panel applets - development files
 This packages provides the include files and static library for the GNOME 2
 panel applet library functions.

Package: libpanel-applet2-doc
Section: doc
Architecture: all
Suggests: doc-base
Replaces: libpanel-applet2-dev (<= 2.0.11-1)
Description: library for GNOME 2 panel applets - documentation files
 This packages provides the documentation files for the GNOME 2 panel applet
 library functions.

Package: gnome-panel-data
Section: gnome
Architecture: all
Depends: gnome-panel (= ${Source-Version}), scrollkeeper (>= 0.3.14-9.1), ${misc:Depends}
Conflicts: gnome-panel-data2, gnome-core (<< 1.5)
Replaces: gnome-desktop-data (<= 2.2.2-1), gnome-panel (<< 2.6.0-2)
Description: common files for GNOME 2 panel
 This package includes some files that are needed by the GNOME 2 panel
 (Pixmaps, .desktop files and internationalization files).

'debian/rules':

# Gnome Team
include /usr/share/gnome-pkg-tools/1/rules/uploaders.mk

include /usr/share/cdbs/1/rules/debhelper.mk
# Including this file gets us a simple patch system.  You can just
# drop patches in debian/patches, and they will be automatically
# applied and unapplied.
include /usr/share/cdbs/1/rules/simple-patchsys.mk
# Including this gives us a number of rules typical to a GNOME
# program, including setting GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1.
# Note that this class inherits from autotools.mk and docbookxml.mk,
# so you don't need to include those too.
include /usr/share/cdbs/1/class/gnome.mk

DEB_CONFIGURE_SCRIPT_ENV := LDFLAGS="-Wl,-z,defs -Wl,-O1"
DEB_CONFIGURE_EXTRA_FLAGS := --enable-eds

# debug lib
DEB_DH_STRIP_ARGS := --dbg-package=libpanel-applet-2

# tight versioning
DEB_NOREVISION_VERSION := $(shell dpkg-parsechangelog | egrep '^Version:' | cut -f 2 -d ' ' | cut -f 1 -d '-')
DEB_DH_MAKESHLIBS_ARGS_libpanel-applet2-0 := -V"libpanel-applet2-0 (>= $(DEB_NOREVISION_VERSION))"
DEB_SHLIBDEPS_LIBRARY_gnome-panel:= libpanel-applet2-0
DEB_SHLIBDEPS_INCLUDE_gnome-panel := debian/libpanel-applet2-0/usr/lib/


binary-install/gnome-panel::
        chmod a+x debian/gnome-panel/usr/lib/gnome-panel/*

binary-install/gnome-panel-data::
        chmod a+x debian/gnome-panel-data/etc/menu-methods/gnome-panel-data
        find debian/gnome-panel-data/usr/share -type f -exec chmod -R a-x {} \;

binary-install/libpanel-applet2-doc::
        find debian/libpanel-applet2-doc/usr/share/doc/libpanel-applet2-doc/ -name ".arch-ids" -depth -exec rm -rf {} \;

clean::
        # GNOME Team 'uploaders.mk' should not override this behavior, here is a workarround :
        sed -i "s/@cdbs@/$(CDBS_BUILD_DEPENDS)/g" debian/control
        # cleanup not done by buildsys
        -find help -name '*omf.out' -exec rm -f {} \;
        -find . -name "Makefile" -exec rm -f {} \;
        # binary unpatch
        uudecode -o po/fr.gmo debian/maintfiles/fr.gmo.uu
        uudecode -o po/or.gmo debian/maintfiles/or.gmo.uu
        uudecode -o po/uk.gmo debian/maintfiles/uk.gmo.uu

Python example (python-dice)

(python-dice is an unofficial DC package choosen for example purpose)

'debian/control.in':

Source: python-dice
Section: python
Priority: optional
Maintainer: Marc Dequènes (Duck) <Duck@DuckCorp.org>
Standards-Version: 3.6.1.1
Build-Depends: @cdbs@, python2.3-dev, python2.4-dev, swig, libdice2-dev (>= 0.6.2.fixed.1)

Package: python-dice
Architecture: all
Depends: python2.3-dice
Description: python bindings for dice rolling and simulation library
 PyDice is a python module for dice rolling and simulation (using fuzzy
 logic).
 .
 It provides a Python API to the libdice2 library.
 .
 This is a dummy package automatically selecting the current Debian
 python version.

Package: python2.3-dice
Architecture: any
Depends: ${python:Depends}
Description: python bindings for dice rolling and simulation library
 PyDice is a python module for dice rolling and simulation (using fuzzy
 logic).
 .
 It provides a Python API to the libdice2 library.

Package: python2.4-dice
Architecture: any
Depends: ${python:Depends}
Description: python 2.4 bindings for dice rolling and simulation library
 PyDice is a python module for dice rolling and simulation (using fuzzy
 logic).
 .
 It provides a Python 2.4 API to the libdice2 library.

'debian/rules':

DEB_AUTO_UPDATE_DEBIAN_CONTROL := yes

include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/python-distutils.mk

clean::
        # hack (CDBS bug -- see #300149)
        -rm -rf build

Makefile + Dpatch example (apg)

'debian/control.in':

Source: apg
Section: admin
Priority: optional
Maintainer: Marc Haber <mh+debian-packages@zugschlus.de>
Build-Depends: @cdbs@
Standards-Version: 3.6.1

Package: apg
Architecture: any
Depends: ${shlibs:Depends}
Description: Automated Password Generator - Standalone version
 APG (Automated Password Generator) is the tool set for random
 password generation. It generates some random words of required type
 and prints them to standard output. This binary package contains only
 the standalone version of apg.
 Advantages:
  * Built-in ANSI X9.17 RNG (Random Number Generator)(CAST/SHA1)
  * Built-in password quality checking system (now it has support for Bloom
    filter for faster access)
  * Two Password Generation Algorithms:
     1. Pronounceable Password Generation Algorithm (according to NIST
        FIPS 181)
     2. Random Character Password Generation Algorithm with 35
        configurable modes of operation
  * Configurable password length parameters
  * Configurable amount of generated passwords
  * Ability to initialize RNG with user string
  * Support for /dev/random
  * Ability to crypt() generated passwords and print them as additional output.
  * Special parameters to use APG in script
  * Ability to log password generation requests for network version
  * Ability to control APG service access using tcpd
  * Ability to use password generation service from any type of box (Mac,
    WinXX, etc.) that connected to network
  * Ability to enforce remote users to use only allowed type of password
    generation
 The client/server version of apg has been deliberately omitted.
 .
 Upstream URL: http://www.adel.nursat.kz/apg/download.shtml

'debian/rules':

DEB_AUTO_UPDATE_DEBIAN_CONTROL := yes

DEB_MAKE_CLEAN_TARGET    := clean
DEB_MAKE_BUILD_TARGET    := standalone
DEB_MAKE_INSTALL_TARGET  := install INSTALL_PREFIX=$(CURDIR)/debian/apg/usr

include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/rules/dpatch.mk
include /usr/share/cdbs/1/class/makefile.mk

cleanbuilddir/apg::
        rm -f build-stamp configure-stamp php.tar.gz

install/apg::
        mv $(CURDIR)/debian/apg/usr/bin/apg $(CURDIR)/debian/apg/usr/lib/apg/apg
        tar --create --gzip --file php.tar.gz --directory $(CURDIR)/php/apgonline/ .
        install -D --mode=0644 php.tar.gz $(CURDIR)/debian/apg/usr/share/doc/apg/php.tar.gz
        rm php.tar.gz
        install -D --mode=0755 $(CURDIR)/debian/apg.wrapper $(CURDIR)/debian/apg/usr/bin/apg
        install -D --mode=0644 $(CURDIR)/debian/apg.conf $(CURDIR)/debian/apg/etc/apg.conf

# bug #284231
unpatch: deapply-dpatches

Perl example (libmidi-perl)

'debian/control':

Source: libmidi-perl
Section: interpreters
Priority: optional
Build-Depends: cdbs (>= 0.4.4), debhelper (>= 4.1.0), perl (>= 5.8.0-7)
Maintainer: Mario Lang <mlang@debian.org>
Standards-Version: 3.5.10

Package: libmidi-perl
Architecture: all
Depends: ${perl:Depends}
Description: read, compose, modify, and write MIDI files in Perl
 This suite of Perl modules provides routines for reading, composing,
 modifying, and writing MIDI files.

'debian/rules':

include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/perlmodule.mk

Conclusion

CDBS solves most common problems and is very pleasant to use. More and more DD are using it, not because they are obliged to, but because they tasted and found it could improve their packages and avoid loosing time on designing silly and complicated rules.

CDBS is not perfect, the BTS entry is not clear, but fixing a single bug most of the time fix a problem for plenty of other packages. CDBS is not yet capable of handling very complicated situations (like packages where multiple C/C++ builds with different options and/or patches are required), but this only affect a very small number of packages. These limitations would be solved in CDBS2, which is work in progress (please contact Jeff Bailey <jbailey@raspberryginger.com> if you want to help).

Having CDBS be used more widely would surely improve the overall Debian quality. Don't hesitate trying it, talking your friends about it, and contributing.

Have a Lot of FUN with CDBS !!! :-)

DebianPackagingTutorial/CDBS (last edited 2009-08-07 23:42:25 by TheDuck)