Skip to topic | Skip to bottom
Home
Linux

Start of topic | Skip to actions

Debian Pakete bauen und kompilieren

Paketformat

Als Linux-Distribution muss die Software in Debian neben der ausführbaren Binärform i. A. auch als SourceCode? vorliegen. Dazu gibt es auch zwei verschiedene Paketformate:

Binärpakete
Pakete mit der Endung .deb enthalten die erzeugten Binärdateien. Diese Dateien werden mit der Debian-Paketverwaltung dpkg installiert. Bei dem deb Paket handelt es sich um ein ar Archiv, dass wiederum zwei tar Archive enthält: Eines mit den zu installierenden Dateien (data.tar.gz) und eines mit den Kontroll-Informationen (control.tar.gz). Zusätzlich ist eine Datei mit Versions-Informationen enthalten (debian-binary).
Sourcepakete
Ein Source-Paket besteht aus drei Dateien: Der Debian Source Control Datei (.dsc), einem tar Archiv mit den orignalen ("upstream") Quellen (.orig.tar.gz) und einer gepackten Patch-Datei mit den Debian-spezifischen Anpassungen (.diff.gz).

Backports

Vorkompilierte Pakete aus der unstable-Distribution erwarten zumeist neuere Bibliotheken, als im System installiert sind. Um die Systemstabilität nicht zu mindern, sollten diese Pakete stattdessen aus den Quellen neukompiliert werden.

Um aus einem in der Debian-Distribution enthaltenen Source-Paket ein Binär-Paket zu bauen, sind im Idealfall die folgenden Schritte nötig:

  1. Für den Bau benötigte Pakete installieren:
    Dies erledigt das Kommando apt-get build-dep Paketname. (Zusätzlich muss noch das Meta-Paket DebPkg:build-essential installiert sein, dass für die Installation allgemein zum Bau von Binaries nötige Tools (Compiler, Linker, usw.) sorgt.
  2. Ein Repository mit Source-Paketen in die /etc/apt/sources.list eintragen, bspw.
    deb-src http://mirror.gsi.de/distrib/debian testing main
    Anschließend mit apt-get update die Informationen über die verfügbaren Pakete aktualisieren.
  3. Mit apt-get die Quellen herunterladen, entpacken, kompiliert und packen:
    Dazu dient das Kommando apt-get -b source Paketname. Nach dem Herunterladen und Entpacken der Quellen wird automatisch dpkg-buildpackage -b -uc aufgerufen, dass den eigentlichen Paketbau erledigt. (Ohne -b werden lediglich die Quelltexte heruntergeladen und entpackt.).
  4. Das Binärpaket installieren:
    dpkg -i Paketname_Versionsnummer_Plattform.deb.

Beispiel: apt-get -b source disktype baut das für Woody noch nicht verfügbare DebPkg:disktype Utility.

Probleme

Unerfüllbare build dependencies

Ansatz 1: Rekursiver backport

Beispiel: DebPkg:chkrootkit -> DebPkg:po-debconf -> DebPkg:intltool-debian

Ansatz 2: Paketabhängigkeiten ignorieren/ändern

Beispiel: Bau von chkrootkit mit -d

Sollte beim Installieren der build dependencies oder beim Bau etwas schiefgehen, kann man mit das Paket herunterladen und auspacken. Zunächst sollte man die Datei debian/control im Quelltextbaum untersuchen. Diese enthält die wichtigsten Informationen zu den vermeintlichen Abhängigkeiten. Der eigentliche Bau (configure, make, ...) und das Zusammenpacken der Dateien wird durch die Datei debian/rules gesteuert. Schließlich kann man mit dpkg-buildpackage -b -uc im Wurzelverzeichnis des entpackten Archives den Bau des Binärpaketes anstoßen.

Bau von Debian-Paketen für Perl-Module

Zum Bau von Debian-Paketen aus Perl-Packages vom CPAN gibt es das Tool Man:dh-make-perl. Dieses Tool ermöglicht, Perl-Module mit Hilfe der Debian-Paketverwaltung auf einem Rechnerhaufen zu verteilen, was mit Perl selbst nicht möglich ist, soweit mir bekannt ist. Um ein Debian-Paket für ein Perl-Modul zu erzeugen, reicht dh-make-perl --build --cpan Modulname. Der Paketbau funktioniert analog zur Verwendung des Perl-Moduls CPAN:Bundle::CPAN; es werden jedoch keine Abhängigkeiten beachtet, man muss also die Abhängigkeiten des Moduls herausfinden und die entsprechenden Pakete ebenfalls bauen.

Bau von Kernelpaketen

Siehe KernelBuild.

Wie man Debian-Pakete für Kernel-Module selbst baut

Paketbau aus Sourcen / Umwandlung mit alien

Tools

Vorgehensweise

  • Das Quellpaket, z.B. tw_cli-linux-x86_64-9.3.0.7.tgz, an einenm geeigneten Ort kopieren.
  • fakeroot alien -g tw_cli-linux-x86_64-9.3.0.7.tgz erzeugt zwei Verzeichnisse, tw_cli... und tw_cli....orig, die beide das ausgepackte Archiv enthalten. In ersterem erzeugt alien auch das Unterverzeichnis debian.
  • Im Unterverzeichnis debian finden sich die Dateien changelog  control  copyright  rules
  • Diese Dateien sind nach eigenem Gutdünken und/oder Maßgabe ähnlicher Paketbauten zu editieren.
  • In changelog notiert man, was man gerade zu tun beabsichtigt.
  • control dient der Debian-Paketverwaltung dazu festzustellen, wie das Paket heißt, in welches Archiv es gehört, was drin steckt usw.
  • rules ist das Makefile für den Paketbau:

debian/rules

  • export DH_COMPAT=4 ist aktuell offenbar eine nötige Angabe, die bei einem anderen Wert als 4 angemeckert wird.

  • dh_installinit Installiert debian/package.init nach /etc/init.d/package und erzeugt den nötigen Code zum Anlegen der /etc/rc?.d/ Links für debian/postinst.

  • Das von alien erzeugte rules enthält die Zeile
# Copy the packages's files.
        find . -maxdepth 1 -mindepth 1 -not -name debian -print0 | \ xargs -0 -r -i cp -a {} debian/$(PACKAGE)
  • Dieser Eintrag kann ersetzt werden, wenn die Zielverzeichnisse der einzelnen im Paket enthaltenen Dateien bekannt sind, im Beispiel des 3ware 3DM2 Pakets also:
        mkdir -p debian/tmp/html
        tar xfz 3dm-lnx.tgz -C debian/tmp
        cp debian/tmp/3dm2.x86_64 debian/$(PACKAGE)/usr/sbin/3dm2
        tar xfz debian/tmp/3dm-help.tgz -C debian/tmp/html

        cp -a debian/3dm2.conf debian/$(PACKAGE)/usr/share/3ware-dm2/
        cp -a debian/3dm2.conf debian/$(PACKAGE)/etc/3ware-dm2/

  • Die per Default auskommentierten Zeilen für dh_strip und dh_fixperms können offenbar aktiviert werden.

debian/Paketname.dirs
  • Damit wie oben im rule File angegeben die Dateien auch nach debian/$(PACKAGE)/... kopiert werden können, muß offenbar im debian Verzeichnis eine Datei Paketname.dirs erzeugt werden, die die Zielverzeichnisse ohne führenden Slash auflistet.

debian/postinst
  • In debian/postinst sollte ziemlich am Schluß eine Zeile #DEBHELPER# stehen (siehe ~christo/debian/sarge/3ware/3ware-dm2-9.3.0.7/debian/postinst). Und in debian/rules steht dh_installinit (siehe man dh_installinit).
  • *.debhelper (hier z.B. 3ware-dm2.postrm.debhelper) sollte es gar nicht geben, sondern beim Paketbau von ebenjenem erzeugt werden. Dann wird der Platzhalter #DEBHELPER# mit dem Inhalt der Datei ersetzt und diese kann in die Tonne (sollte debclean eigentlich übernehmen).
  • Sind hingegen beim Paketbau Dateien *.debhelper schon vorhanden, wird der Inhalt der Datei stattdessen offenbar angehängt. Im Falle von init - Dateien führt das dazu, daß der Start des Dienstes (hier 3dm2) als Abschluss der Installation des Pakets fehlschlägt.

Bau des Pakets
  • Mit fakeroot dpkg-buildpackage -b -uc kann schließlich das Binärpaket gebaut werden.

Debian-konformes patchen mit dpatch

Um in Debian-Paketen Dateien zu patchen, kann das Tool dpatch verwendet werden.

Nötige Änderungen an debian/rules:

  1. include /usr/share/dpatch/dpatch.make in die Preambel der Datei einfügen
  2. Das Ziel build (oder configure oder configure-stamp) vom Ziel patch (oder patch-stamp) abhängig machen: build: patch
  3. Das Ziel clean vom Ziel unpatch abhängig machen: clean: unpatch

Die anzuwendenden Patches müssen in debian/patches/ stehen werden und in der Datei debian/patches/00list aufgeführt werden.

Patches können "interaktiv" mit dpatch-edit-patch geschrieben werden.

Paketbau aus Sourcen mit Hilfe von checkinstall

Mittels checkinstall lassen sich bei der Übersetzung und Installation von »Tarballs« gleich auch einfache Debian-Pakete erstellen. Dazu ist folgende Vorgehensweise ratsam:

  1. Falls notwendig Installation von checkinstall mit:
    apt-get install checkinstall
  2. Download des gewünschten Programmpaketes, etwa blafasel.tar.gz.
  3. Auspacken des Paketes nach /tmp mit:
    tar -xvzf blafasel.tar.gz -C /tmp
  4. Wechsel in das Paketverzeichnis mit:
    cd /tmp/blafasel
  5. Falls notwendig Installationshinweise (zumeist in den Dateien README oder INSTALL untergebracht) lesen.
  6. Falls notwendig erforderliche Entwicklerbibliotheken (zumeist libirgendwas-devel bezeichnet) installieren.
  7. Konfiguration durchführen mit:
    ./configure
    Hiermit werden eine oder mehrere Dateien namens Makefile erzeugt, die den Übersetzungsprozeß steuern. Ferner ist es an dieser Stelle möglich, den Installationsort anzupassen sowie bestimmte Funktionen des Programmpaketes ein- oder auszuschalten. Eine Übersicht der verfügbaren Schalter wird nach Eingabe von ./configure --help angezeigt.
  8. Der Compilerlauf wird angestoßen mit:
    make
    Je nach Rechnergeschwindigkeit und Paketumfang kann dieser Schritt einige Sekunden, aber auch einige Stunden dauern.
  9. Nun nicht wie gewohnt als "root" durch make install das Paket installieren, sondern gleichzeitig ein Debian-Paket daraus bauen mit:
    checkinstall make install
    Im folgenden Dialog lassen sich Paketparameter wie Name, Versions- und Releasenummer anpassen:
    *** Warning: The package version "blafasel" does not
    *** Warning: contain any digits. dpkg might not like that.

    This package will be built according to these values:

    0 - Maintainer: [ tux@linux.dom ]
    1 - Summary: [ Blafasel 1.0.1 for Debian Sarge ]
    2 - Name: [ blafasel ]
    3 - Version: [ blafasel ]
    4 - Release: [ 1 ]
    5 - License: [ GPL ]
    6 - Group: [ useless ]
    7 - Architecture: [ i386 ]
    8 - Source location: [ blafasel.tar.gz ]
    9 - Alternate source location: [ ]

    Enter a number to change any of them or press ENTER to continue: 3
    Enter new version:
    >> 1.0.1

    This package will be built according to these values:

    0 - Maintainer: [ tux@linux.dom ]
    1 - Summary: [ Blafasel 1.0.1 for Debian Sarge ]
    2 - Name: [ blafasel ]
    3 - Version: [ 1.0.1 ]
    4 - Release: [ 1 ]
    ...
  10. Das fertige Debian-Paket findet sich im aktuellen Verzeichnis, der Name setzt sich aus Paketname, Version und Release sowie Architektur zusammmen, hier also blafasel-1.0.1-1_i386.deb und kann nun verteilt werden.
In der Anwendung einfach, ist checkinstall allerdings auch in seiner Funktion limitiert. Laut M. F. Krafft in The Debian System (1. Auflage 2005, S. 241f) lassen sich so nur Dateien installieren, nicht jedoch bereits vorhandene Dateien während der Installation verändern. Ferner werden Konfigurationsdateien nicht als solche in der Paketdatenbank registriert, was zu Problemen bei Updates führen kann.


Siehe auch:

-- ChristopherHuhn, ThomasRoth, StefanHaller -- 2004 - 2007
to top


Linux.DebianPaketBau moved from Linux.PaketBau on 16 Sep 2004 - 11:00 by Main.christo - put it back
You are here: Linux > DebianPaketVerwaltung > DebianPaketBau

to top