Jak powszechnie wiadomo od jakiegoś czasu, prowadzę nieoficjalne archiwum pakietów dla Debiana. Aby móc prowadzić je dla dwóch architektur, musiałem nauczyć się tworzyć pakiety dla i386 (jako że sam używam amd64).1 Z początku było to dla mnie nieco skomplikowane, ale w późniejszym czasie opanowałem pbuildera na tyle, że szło to całkiem sprawnie. A później natrafiłem na tekst, w którym dowiedziałem się o cowbuilderze, dzięki któremu tworzenie pakietów dla obu architektur jest jeszcze szybsze.

Tekst jest luźnym tłumaczeniem Build i386 packages on amd64 i został opublikowany za pisemną zgodą autora — Julien Valroff.

Oto jak buduję pakiety Debiana dla architektur i386 oraz amd64 na moim systemie x86_64 używając cowbuildera. Istnieje możliwość wykorzystania samego pbuildera, ale preferuję cowbuildera, bo jest szybszy.

Wpierw należy stworzyć obrazy bazowe (ten krok należy wykonać z konta superużytkownika). Domyślnie docelową dystrybucją jest gałąź unstable (Sid).

cowbuilder --create --architecture amd64 --basepath /var/cache/pbuilder/base-unstable_amd64.cow
cowbuilder --create --architecture i386 --basepath /var/cache/pbuilder/base-unstable_i386.cow

Aby zaktualizować chroota, do komendy będzie trzeba dodać opcję --basepath. Np.:

cowbuilder --update --basepath /var/cache/pbuilder/base-unstable_amd64.cow
cowbuilder --update --basepath /var/cache/pbuilder/base-unstable_i386.cow

Oto mój plik ~/.pbuilderrc, który, rzecz jasna, powinien zostać zmieniony odpowiednio do Twoich potrzeb:

# do not specify variables when running cowbuilder --create or --update
if [ -f debian/changelog ]; then
    [ -z "$ARCH" ] && ARCH=$(dpkg --print-architecture)
    [ -z "$DIST" ] && DIST=$(dpkg-parsechangelog | sed -n 's/^Distribution: //p')
fi

PDEBUILD_PBUILDER="cowbuilder --build --basepath /var/cache/pbuilder/base-${DIST}_${ARCH}.cow"
DEBBUILDOPTS="-d ${OPTS}"
ARCHITECTURE=${ARCH}
BUILDRESULT=~/build-area
MIRRORSITE=http://ftp.fr.debian.org/debian
EXTRAPACKAGES="$EXTRAPACKAGES lintian"
AUTO_DEBSIGN=yes
HOOKDIR=${HOME}/.pbuilder/hooks/
PKGNAME_LOGFILE_EXTENTION="_${ARCH}.build"

Do automatycznego wywoływania lintiana po zbudowaniu pakietów w chroocie, używam hooka, który powinien zostać zapisany w ścieżce ~/.pbuilder/hooks/B91_lintian. Treść pliku:

#!/bin/sh
# run lintian

echo "I: running lintian on the package"
echo ""
echo "========================== LINTIAN RESULTS =========================="
echo ""
tput "smso"
lintian --allow-root -I /tmp/buildd/*.changes
tput "rmso"
echo ""
echo "====================================================================="
echo ""

Aby zbudować pakiety, używam następujących kroków:

1. Buduję pakiety dla architektury i386:

ARCH=i386 pdebuild --debbuildopts -b

2. Buduję pakiety dla architektury amd64:

pdebuild

3. Łączę i podpisuję changelogi:

cd ~/build-area
mergechanges -f package_0.1-1_i386.changes packages_0.1-1_amd64.changes
debsign package_0.1-1_multi.changes

Pakiety mogą być wtedy zuploadowane wykorzystując plik *_multi.changes z użyciem standardowego narzędzia (dupload czy dput).

Jak można zauważyć, czasem zdarza mi się budować pakiety dla stabilnej dystrybucji (backporty). Domyślnie moja konfiguracja pbuildera pobiera informację o docelowej dystrybucji z pliku debian/changelog. Obrazy bazowe powinny być zbudowane z opcją --distribution (zobacz cowbuilder(8) po więcej informacji).

Jeśli chcesz to obejść, możesz określić zmienną $DIST przy budowaniu pakietu:

DIST=stable pdebuild

Wygodnie mi jest dodać symlinki, dzięki czemu mam możliwość używania nazwy gałęzi lub nazwy kodowej dystrybucji.

ln -s /var/cache/pbuilder/base-unstable_amd64.cow /var/cache/pbuilder/base-sid_amd64.cow
ln -s /var/cache/pbuilder/base-unstable_i386.cow /var/cache/pbuilder/base-sid_i386.cow

Możesz również wykorzystać taki układ wespół z git-buildpackage.

Aby zbudować pakiet:

ARCH=i386 git-buildpackage --git-builder="pdebuild --debbuildopts -b"
ARCH=amd64 git-buildpackage --git-builder="pdebuild"

Domyślnego buildera można zdefiniować w pliku ~/.gbp.conf, ale trzeba odpowiednio zmodyfikować wpis, żeby podać prawidłowe opcje budowania.

Warto też zauważyć, że pakiet git-buildpackage >=0.5.6 przychodzi wraz ze skryptem git-pbuilder, który znacznie ułatwia współpracę git-buildpackage z pbuilderem/cowbuilderem. Więcej informacji: http://honk.sigxcpu.org/con/Git_buildpackage_0_5_6.html.

Tekst jest luźnym tłumaczeniem Build i386 packages on amd64 i został opublikowany za pisemną zgodą autora — Julien Valroff.


  1. Oczywistym jest, że w drugą stroną się nie da — na architekturze i386 nie stworzysz pakietów amd64. ↩︎