Mit Pbuilder wollte ich noch den Terminalemulator rxvt-unicode-256color von Debian Sid nach Debian Squeeze zurückporten. Dabei sind ein paar Probleme aufgetreten und die Lösungen zum Nachschlagen habe ich hier verewigt.
Wie ich hierhin gekommen bin, habe ich in den Artikeln zum Paketbau mit Debian, Mplayer für den Framebuffer, einen Backportversuch mit Pbuilder und den Beitrag zum maßgeschneiderten DWM-Fenstermanager niedergeschrieben. Du kannst dich natürlich auch sofort in die Details stürzen.
Nachdem ich DWM und Surf erfolgreich mit pbuilder kompiliert und in ein Deb-Paket verschnürt hatte, machte ich guten Mutes mit rxvt-unicode-256color weiter. Das Paket ließ sich ebenfalls problemlos übersetzen, doch als ich es auf dem Thinkpad mit Debian Squeeze installieren wollte, fehlte mir eine aktuellere Abhängigkeit von ncurses-term.
Um aber ncurses-term erfolgreich zu bauen, brauchte ich wiederum die aktuelle Version von debhelper aus dem offiziellen Backports-Archiv.
Wie man einen Backport von rxvt-unicode-256color erstellt
apt-get source rxvt-unicode-256color
apt-get source ncurses-term
Randbemerkung: Beim Verändern meiner Tastaturbelegung mit xmodmap habe ich einen 5 Jahre alten Debian Bug ausgegraben. Scheinbar löst die Tastenkombination Strg+Shift ein ISO14755 Feature aus und ein nicht zu übersehendes Rechteck wird auf dem Bildschirm angezeigt. Der Bug ist wohl in rxvt-unicode-lite behoben, in 256color aber absichtlich nicht.
Das Verhalten lässt sich ausschalten, indem man die Option --enable-iso14755 in debian/rules auf --disable-iso14755 setzt. Quellpaket danach mit dpkg -b source
aktualisieren!
Kopiert man dann die unten beschriebenen Skripte bzw. Konfigurationsdatei an die richtige Stelle lassen sich DEB-Pakete für i386 und Squeeze mit dem folgenden Befehl bauen. Beim ersten Mal noch --override-config
anhängen, damit die geänderte config eingelesen wird!
ARCH=i386 DIST=squeeze pbuilder build ncurses_5.9-4.dsc
ARCH=i386 DIST=squeeze pbuilder build rxvt-unicode_9.12-1.dsc
Die fertigen Pakete befinden sich danach in /var/cache/pbuilder/squeeze-i386/result
Die folgenden Skripte und Konfigurationen wurden mit geringen Änderungen aus dem Pbuilder Howto auf ubuntu.com übernommen. Empfehlenswert zum Nachlesen! Außerdem hilft man pbuilder weiter.
Hat man Pbuilder einmal so eingerichtet, lassen sich damit auch von einem Debiansystem Pakete für Ubuntu und umgekehrt erstellen, womit man ab sofort Software für 2/3 aller Linuxdistributionen leicht selbst übersetzen kann. 😉
Hooks
apt-preferences
Mit sogenannten Hooks lässt sich Pbuilder dazu bewegen, gewisse Prozesse und Abläufe mit Hilfe von Skripten automatisch während des Paketbaus oder davor und danach auszuführen. Mein Hook-Verzeichnis ist /var/cache/pbuilder/hook.d
Mit dem folgenden ausführbaren Skript E01apt-preferences wird den Paketen debhelper und lintian aus dem offiziellen Backport-Archiv eine höhere Pin-Priorität zugewiesen als den regulären Squeeze-Paketen. Damit werden beide Pakete automatisch aus Backports installiert, falls diese angefordert werden. Apt-Pinning hatte ich schon einmal allgemein vorgestellt, diese Methode hier demonstriert das Anpinnen von zwei spezifischen Paketen in /etc/apt/preferences innerhalb der Build-Umgebung von Pbuilder.
#!/bin/sh
set -e
STABLE_VERSION_REGEX='^6.0.[0-9]+
Es wird empfohlen das Verwenden von Backports auf das absolut notwendige Minimum zu begrenzen und so weit es geht auf die reinen Squeeze-Pakete zurückzugreifen.
Eine Shell ausführen, wenn das Bauen fehlschlägt
Das Skript wird als C10Shell in /var/cache/pbuilder/hook.d abgespeichert. Laut Pbuilder-Howto soll es für alle ausführbar sein (a+x). Ich muss hier in Zukunft einmal genauer nachforschen, ob das tatsächlich immer notwendig ist und ob man Pbuilder auch problemlos im User Mode Linux (UML) betreiben kann.
#!/bin/sh
# Shell aufrufen, wenn das Bauen fehlschlägt
apt-get install -y --force-yes vim less bash
cd /tmp/buildd/*/debian/..
/bin/bash < /dev/tty > /dev/tty 2> /dev/tty
Multiple Pbuilder und Archive: Konfiguration für pbuilderrc
HOOKDIR="/var/cache/pbuilder/hook.d/"
OTHERMIRROR="deb http://backports.debian.org/debian-backports squeeze-backports main"
# Codenamen für die verschiedenen Debian Versionen.
# Einfach editieren, falls die Codenamen sich in Zukunft ändern
UNSTABLE_CODENAME="sid"
TESTING_CODENAME="wheezy"
STABLE_CODENAME="squeeze"
STABLE_BACKPORTS_SUITE="$STABLE_CODENAME-backports"
# Liste der Debian Versionen.
DEBIAN_SUITES=($UNSTABLE_CODENAME $TESTING_CODENAME $STABLE_CODENAME
"unstable" "testing" "stable")
# Liste der Ubuntu Versionen.
UBUNTU_SUITES=("natty" "maverick" "lucid" "karmic" "jaunty" "intrepid" "oneiric")
# Debian-Spiegel
DEBIAN_MIRROR="ftp.de.debian.org"
UBUNTU_MIRROR="mirrors.kernel.org"
# Falls die Version nicht zu ermitteln ist, durchsuche das Changelog nach Hinweisen
if [ -z "${DIST}" ] && [ -r "debian/changelog" ]; then
DIST=$(dpkg-parsechangelog | awk '/^Distribution: / {print $2}')
# Benutze die Unstable Version für bestimmte Versions Werte
if $(echo "experimental UNRELEASED" | grep -q $DIST); then
DIST="$UNSTABLE_CODENAME"
fi
# Benutze die Stable Version für Backports.
if $(echo "$STABLE_BACKPORTS_SUITE" | grep -q $DIST); then
DIST="$STABLE"
fi
fi
# Optional: Standard Distribution/Version angeben
# z.B (${DIST:="unstable"}).
: ${DIST:="$(lsb_release --short --codename)"}
# Optional: Debians generische Namen(stable, testing, unstable) in die jeweiligen Codenamen umändern
case "$DIST" in
unstable)
DIST="$UNSTABLE_CODENAME"
;;
testing)
DIST="$TESTING_CODENAME"
;;
stable)
DIST="$STABLE_CODENAME"
;;
esac
# Optional: Die Standardarchitektur angeben. Z.B. (${ARCH:="i386"}).
: ${ARCH:="$(dpkg --print-architecture)"}
NAME="$DIST"
if [ -n "${ARCH}" ]; then
NAME="$NAME-$ARCH"
DEBOOTSTRAPOPTS=("--arch" "$ARCH" "${DEBOOTSTRAPOPTS[@]}")
fi
BASETGZ="/var/cache/pbuilder/$NAME-base.tgz"
# Optional: BASEPATH (und nicht BASETGZ) setzen, wenn man cowbuilder benutzt
# BASEPATH="/var/cache/pbuilder/$NAME/base.cow/"
DISTRIBUTION="$DIST"
BUILDRESULT="/var/cache/pbuilder/$NAME/result/"
APTCACHE="/var/cache/pbuilder/$NAME/aptcache/"
BUILDPLACE="/var/cache/pbuilder/build/"
BINDMOUNTS="/var/cache/archive"
if $(echo ${DEBIAN_SUITES[@]} | grep -q $DIST); then
# Debian configuration
MIRRORSITE="http://$DEBIAN_MIRROR/debian/"
COMPONENTS="main contrib non-free"
DEBOOTSTRAPOPTS=("${DEBOOTSTRAPOPTS[@]}" "--keyring=/usr/share/keyrings/debian-archive-keyring.gpg")
#OTHERMIRROR="deb file:///var/cache/archive $DIST/"
elif $(echo ${UBUNTU_SUITES[@]} | grep -q $DIST); then
# Ubuntu configuration
MIRRORSITE="http://$UBUNTU_MIRROR/ubuntu/"
COMPONENTS="main restricted universe multiverse"
DEBOOTSTRAPOPTS=("${DEBOOTSTRAPOPTS[@]}" "--keyring=/usr/share/keyrings/ubuntu-archive-keyring.gpg")
#OTHERMIRROR="deb file:///var/cache/archive $DIST/"
else
echo "Unknown distribution: $DIST"
exit 1
fi
if $(cat "/etc/debian_version" | grep -q -e "$STABLE_VERSION_REGEX"); then cat > "/etc/apt/preferences" << EOF Package: debhelper Pin: release a=squeeze-backports Pin-Priority: 999 Package: lintian Pin: release a=squeeze-backports Pin-Priority: 999 EOF fi
Es wird empfohlen das Verwenden von Backports auf das absolut notwendige Minimum zu begrenzen und so weit es geht auf die reinen Squeeze-Pakete zurückzugreifen.
Eine Shell ausführen, wenn das Bauen fehlschlägt
Das Skript wird als C10Shell in /var/cache/pbuilder/hook.d abgespeichert. Laut Pbuilder-Howto soll es für alle ausführbar sein (a+x). Ich muss hier in Zukunft einmal genauer nachforschen, ob das tatsächlich immer notwendig ist und ob man Pbuilder auch problemlos im User Mode Linux (UML) betreiben kann.
Multiple Pbuilder und Archive: Konfiguration für pbuilderrc