Differences between revisions 11 and 12
Revision 11 as of 2007-10-19 13:36:14
Size: 994
Editor: OndrejCertik
Comment:
Revision 12 as of 2007-11-19 13:02:06
Size: 3600
Editor: ?AlexandreRossi
Comment: added build for many dists tip
Deletions are marked like this. Additions are marked like this.
Line 29: Line 29:
== Bash and SVN tips ==
Line 32: Line 34:

== Building your package for many distributions at once ==

`cowbuilder` is really handy to build your pet project for many distributions at once. If you have got an `amd64` system, you can easily build a package for `i386` and `amd64` architectures and for say `etch`, `sid` and `gutsy`.

The first step involves creating as many basepaths as you need. I chose to put them in `/var/cache/pbuilder/$DIST-$ARCH.cow`.

I use an `apt` cache to reduce the downloads on mirrors, so my mirror is always `http://apt:9999/debian` or `http://apt:9999/ubuntu`.

I adapted a `~/.pbuilderrc` file to this purpose. I stole it from the [https://wiki.ubuntu.com/PbuilderHowto Ubuntu pbuilder howto].

{{{
if [ -n "${DIST}" ]; then
    DISTRIBUTION="$DIST"
    BUILDRESULT="/var/cache/pbuilder/result/$DIST/"
    if [ "$DIST" == "gutsy" ]; then
        echo "Adding universe"
        COMPONENTS="main universe"
    fi
fi
APTCACHE=""
}}}

Creating a base path :
{{{
$ DIST=etch sudo cowbuilder --create --basepath /var/cache/pbuilder/etch-amd64.cow --mirror http://apt:9999/debian
}}}

Creating an ubuntu base path which is trickier because one must :
  * import ubuntu signing keys
  * use a backport of the latest cdebootstrap if you use `etch`.
  * manually fix [http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=448210 Bug #448210]
  * exclude packages of priority `important` in `/usr/share/cdebootstrap/generic-ubuntu/packages`
  * add `universe` to complete creation of chroot because the `cowdancer` package is in universe.
<!> Some steps left to describe here.
{{{
$ DIST=gutsy sudo cowbuilder --create --distribution gutsy --basepath /var/cache/pbuilder/gutsy-amd64.cow --mirror http://apt:9999/ubuntu --debootstrapopts --exclude=udev,pcmciautils,initramfs-tools
}}}

Building `i386` base paths may be achieved by appending thos options to the `cowbuilder --create` command line.

{{{
--debootstrapopts --arch --debootstrapopts i386
}}}

Once everything is set up, I use this script in a debian source package directory to build it for every distribution.
{{{
#!/bin/bash
set -e

RESULTDIR=$1
[ -d $RESULTDIR ] || mkdir $RESULTDIR

DISTLIST=$(ls -d /var/cache/pbuilder/*.cow)

for chrootdir in $DISTLIST
do
    sudo cowbuilder --update --basepath $chrootdir
    DIST=$(basename $chrootdir | cut -d'-' -f1)
    [ -d $RESULTDIR/$DIST ] || mkdir $RESULTDIR/$DIST
    DIST=$DIST pdebuild --pbuilder cowbuilder\
                        --buildresult $RESULTDIR/$DIST\
                        -- --basepath $chrootdir
done
}}}

cowbuilder

This is the tutorial for cowbuilder. See also [:qemubuilder: qemubuilder].

Usage

Initialization

Create the base image:

sudo cowbuilder --create

And a new and shiny build image is created in /var/cache/pbuilder/base.cow/

Every day usage

Update the base image

sudo cowbuilder --update

Build a package:

sudo cowbuilder --build somepackage.dsc

Tips

Bash and SVN tips

Setup your .bashrc according to:

http://www.bononia.it/~zack/blog/posts/2007/09/svn-cowbuilder.html

Building your package for many distributions at once

cowbuilder is really handy to build your pet project for many distributions at once. If you have got an amd64 system, you can easily build a package for i386 and amd64 architectures and for say etch, sid and gutsy.

The first step involves creating as many basepaths as you need. I chose to put them in /var/cache/pbuilder/$DIST-$ARCH.cow.

I use an apt cache to reduce the downloads on mirrors, so my mirror is always http://apt:9999/debian or http://apt:9999/ubuntu.

I adapted a ~/.pbuilderrc file to this purpose. I stole it from the [https://wiki.ubuntu.com/PbuilderHowto Ubuntu pbuilder howto].

if [ -n "${DIST}" ]; then
    DISTRIBUTION="$DIST"
    BUILDRESULT="/var/cache/pbuilder/result/$DIST/"
    if [ "$DIST" == "gutsy" ]; then
        echo "Adding universe"
        COMPONENTS="main universe"
    fi
fi
APTCACHE=""

Creating a base path :

$ DIST=etch sudo cowbuilder --create --basepath /var/cache/pbuilder/etch-amd64.cow --mirror http://apt:9999/debian

Creating an ubuntu base path which is trickier because one must :

  • import ubuntu signing keys
  • use a backport of the latest cdebootstrap if you use etch.

  • manually fix [http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=448210 Bug #448210]

  • exclude packages of priority important in /usr/share/cdebootstrap/generic-ubuntu/packages

  • add universe to complete creation of chroot because the cowdancer package is in universe.

<!> Some steps left to describe here.

$ DIST=gutsy sudo cowbuilder --create --distribution gutsy --basepath /var/cache/pbuilder/gutsy-amd64.cow --mirror http://apt:9999/ubuntu --debootstrapopts --exclude=udev,pcmciautils,initramfs-tools

Building i386 base paths may be achieved by appending thos options to the cowbuilder --create command line.

--debootstrapopts --arch --debootstrapopts i386

Once everything is set up, I use this script in a debian source package directory to build it for every distribution.

set -e

RESULTDIR=$1
[ -d $RESULTDIR ] || mkdir $RESULTDIR

DISTLIST=$(ls -d /var/cache/pbuilder/*.cow)

for chrootdir in $DISTLIST
do
    sudo cowbuilder --update --basepath $chrootdir
    DIST=$(basename $chrootdir | cut -d'-' -f1)
    [ -d $RESULTDIR/$DIST ] || mkdir $RESULTDIR/$DIST
    DIST=$DIST pdebuild --pbuilder cowbuilder\
                        --buildresult $RESULTDIR/$DIST\
                        -- --basepath $chrootdir
done

Troubleshooting

Slow copying and removing of the COW directory

What cowbuilder does is:

cp -al /var/cache/pbuilder/base.cow /tmp/new
rm -rf /tmp/new

Of course cowbuilder uses a different location than /tmp/new. You need to optimize those 2 commands on your computer. They should take around 0.2s each. If not, try to use the ext3 filesystem, for more details, see our [:cowbuilder_benchmark: benchmarks].