Home Wiki > Build Service/Debs bauen
Sign up | Login

Build Service/Debs bauen

tagline: Aus openSUSE

Icon-obsolete.png Dieser Artikel oder Abschnitt bezieht sich auf die Version 'Ubuntu 8.04' und ist nun veraltet!
Mehr Informationen sollten auf der Diskussionsseite des Artikels zu finden sein.


Für Debian bauen

Diese Seite stellt Informationen zum Paketbau für vom openSUSE Build Service unterstützte Debian-basierte Distributionen bereit, namentlich:

  • Debian
    • Debian Etch
  • xUbuntu
    • xUbuntu 6.06
    • xUbuntu 7.04
    • xUbuntu 7.10
    • xUbuntu 8.04

Debian-Pakete sind in zwei große Kategorien aufgeteilt: Binärpakete und Quellpakete. Die Binärpakete haben die Endung .deb und enthalten die kompilierte Version der Anwendung die Sie verbreiten wollen. Demgegenüber sind die Quellpakete keine einzelne Datei (wie bei Quell-SRPMs), sondern bestehen aus drei Dateien:

  1. dem zugehörigen Quellcodearchiv
  2. einer diff-Datei
  3. einer dsc-Datei

Ein wichtiger Punkt ist, dass der Build Service keine Quellpaketdepots für .deb-basierte Distributionen erstellt, sondern nur die .deb erstellt.

Folglich ist es wichtig, dies im Hinterkopf zu behalten, da ein 'Standard-Debian-Depot' mindestens aus zwei Verzeichnissen besteht:

(Ihr Paketdepotwurzelverzeichnis)
|
+-binary
+-source

Demgegenüber wird der Build Service direkt das binary-Verzeichnis mit dem Namen der Distribution erstellen (bspw. ist http://download.opensuse.org/repositories/home:/EmmeG/Debian_Etch/ dann das binary-Verzeichnis und nicht das Depotwurzelverzeichnis... das wäre dann http://download.opensuse.org/repositories/home:/EmmeG/ ).

Seien Sie sich auch klar darüber, dass die drei Teile, die zum Bau eines Quellpakets benötigt werden, nicht benötigt werden, um ein .deb-Paket zu bauen, aber notwendig sind, wenn Sie ein Quellpaketdepot erstellen wollen, und es ermöglichen wollen, das Nutzer auf ihren eigenen Maschinen via apt-get automatisch kompilieren und Pakete bauen können.

Der Build Service wird keine Quelldepots bauen, weshalb Sie der Einfachheit halber auch nicht wissen brauchen, wie diese aufgebaut sind und genutzt werden.

Der Build Service nutzt außerdem einige Magie, einige Zusatzinformationen können in der .dsc-Datei in Form von 'debtransform'-Tags angegeben werden. Diese sind in dieser E-Mail dokumentiert: http://lists.opensuse.org/opensuse-buildservice/2007-03/msg00067.html Und den Quellcode finden Sie hier: https://forgesvn1.novell.com/svn/opensuse/trunk/buildservice/src/build/debtransform

Wenn Sie sich diese anschauen, sehen Sie, dass drei Tags akzeptiert werden:

  • DEBTRANSFORM-TAR
  • DEBTRANSFORM-FILES-TAR
  • DEBTRANSFORM-SERIES

Diese können genutzt werden, um eine .tar.bz2-Datei als Quelle anzugeben, die zwischen RPM und Debian-basierten Bauten geteilt werden kann, und so können auch RPM-Patches in Debian-Bauten wiederverwendet werden. Sie können wie folgt mehrere tar.gz-Dateien in DEBTRANSFORM-FILES-TAR nutzen:

Debtransform-Files-Tar: debian.tar.gz debian-control-xUbuntu_6.06.tar.gz


Minimalsatz benötigter Dateien um ein .deb zu bauen

Um erfolgreich ein .deb-Paket zu bauen, benötigen Sie mindestens diese Dateien:

  1. Paketname.dsc
  2. debian.changelog
  3. debian.control
  4. debian.rules

Und natürlich noch ein Quellcodearchiv (tar.bz2), dass die Paketquelle zum kompilieren enthält.


Paketname.dsc

Eine Minimalvorlage für eine solche Datei:

Format: 1.0
Source: Paketname
Version: 5.6-3
Binary: Paketname
Maintainer: Vorname Nachname <email@hostname.org>
Architecture: any
Build-Depends: debhelper (>= 4.1.16), NamenVonPaketenDieZumBauBenötigtWerden
Files: 
 d57283ebb8157ae919762c58419353c8 133282 Paketname_5.6.orig.tar.gz
 2fecf324a32123b08cefc0f047bca5ee 63176 Paketname_5.6-1.diff.tar.gz

In der obigen Vorlage sind nur die absolut notwendigen Felder enthalten; es gibt noch viele weitere optionale Felder. Sie können alle Informationen über diese Felder unter http://www.debian.org/doc/debian-policy/ch-controlfields.html Flagge-Vereinigtes Koenigreich.png

finden.

Eine kleine Zusammenfassung über die Bedeutung der Felder:

  1. Format : ist die Formatversion des .deb-Pakets. Nehmen Sie 1.0
  2. Source : ist der Name des Quellcodearchivs ohne .tar.bz2
  3. Version : wird aus der Version der Quellen und der Ausgabe des Pakets zusammengesetzt. In der Vorlage ist 5.6 die Version des Quellcodes, während 3 (nach '-') die Ausgabe des Debian-Pakets ist. Jedes Mal, wenn Sie eine Datei, die zum Erstellen des .deb notwendig ist, ändern, sollten Sie die Paketausgabe erhöhen.
  4. Binary : ist der Name des Binärpakets, so wie er im apt-Verwalter gesehen wird (Zum Beispiel: um es zu installieren würden Sie apt-get install denNamenDenSieInsBinaryFeldGeschriebenHaben eingeben.)
  5. Maintainer : ist der Name des Betreuers der Quellen (nicht ihr Name oder der des Paketbauers)
  6. Architecture : die Liste der Architekturen für die Sie das Paket bauen wollen
  7. Build-Depends : die fürs Kompilieren notwendigen Bibliotheken. 'debhelper (>= 4.1.16)' muss immer angegeben werden, da es alle Helferskripte enthält, die vom System zu Bau benötigt werden.
  8. Files: theoretisch müssen hier die MD5SUM und die Größe in Byte der .orig.tar.gz und der .diff.tar.gz angegeben werden, in der Praxis setzen Sie einfach irgendwelche Werte ein, da es nicht wichtig ist, ob sie stimmen... Wichtig ist, dass dort drei Zeilen sind, wie in der Vorlage gezeigt. (bspw. könnten Sie die beiden Zeilen aus der Vorlage kopieren und 'Paketname' durch den Namen des zu bauenden .deb ersetzen und es ist ok... Den Rest übernimmt der Build Service.)


debian.changelog

Der Debian-Mechanismus zum erstellen von .deb-Dateien besteht darin, im Quellcodebaum ein Verzeichnis namens 'debian' einzufügen, dass eine Menge notwendiger Dateien zur Automatisierung der Kompilierung und der Paketierung enthält.

Sie müssen dies nicht selber machen, der Build Service wird das Verzeichnis für Sie erstellen und es mit allen Dateien füllen die debian.Dateiname heißen.

Dies trifft auf alle .deb-basierten Distributionen zu!! Deshalb müssen Sie auch für Ubuntu-Paketdepots eine Datei namens debian.changelog erstellen (und nicht ubuntu.changelog).

Dies ist die Minimalvorlage:

NameDesPakets (5.6-3) stable; urgency=low

  * Initial Release

 -- IhrName <ihreemail@hostname.de>  Mon, 25 Dec 2007 10:50:38 +0100

Sie mögen denken, dies sei ja nur ein Änderungsprotokoll... Aber die Syntax ist so zwanghaft, dass schon ein kleiner Fehler (bspw. ein fehlendes Leerzeichen) zum Abbruch des Paketbaus führt!! :-( Halten Sie sich also exakt an die unter http://www.debian.org/doc/debian-policy/ch-source.html#s-dpkgchangelog spezifizierte Syntax.


debian.control

Diese Datei wird genutzt um das Paket und seine Abhängigkeiten zu beschreiben, dies ist eine Minimalvorlage:

Source: Paketname
Section: Sektionsname
Priority: optional
Maintainer: ihrName <yourEmail@hostname.de>
Build-Depends: debhelper (>= 4.1.16), NamenVonZumBauNötigenPaketen

Package: NameDesPakets
Architecture: any
Depends: ${shlibs:Depends}
Description: This firs line is a brief description
 Then, here there is the long description of the package... 
 also here the syntax is very painful (look at the documentation of Debian Policy
 to avoid errors http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description)

Hier sind einige Informationen redundant, so das Sie sie aus der .dsc-Datei übernehmen können: 'Build-Depends', 'Package' ist das gleiche wie 'Binary', 'Architecture', 'Maintainer' ist normalerweise das gleiche wie in der letzten Liste von debian.changelog


debian.rules

Diese Datei im Makefile-Stil enthält alle Regeln zum Entpacken, Kompilieren und Paketieren der Quellen. Sie können in dieser Datei ändern was Sie möchten... aber es ist wesentlich einfacher, nur einige Zeilen zu ändern, so das es kompiliert wird... der Rest der Datei kann so gelassen werden.

#!/usr/bin/make -f
# Sample debian/rules that uses debhelper.
# GNU copyright 1997 to 1999 by Joey Hess.

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

# This is the debhelper compatibility version to use.
export DH_COMPAT=4

CFLAGS = -g
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
CFLAGS += -O0
else
CFLAGS += -O2
endif

build: build-stamp
build-stamp:
	dh_testdir

	# Add here commands to compile the package.
	./configure
	make all
	# --- end custom part for compiling

	touch build-stamp

clean:
	dh_testdir
	dh_testroot
	rm -f build-stamp

	# Add here commands to clean up after the build process.
	make clean
	# --- end custom part for cleaning up

	dh_clean

install: build
	dh_testdir
	dh_testroot
	dh_clean -k
	dh_installdirs

	# Add here commands to install the package
	# The DESTDIR Has To Be Exactly /usr/src/packages/BUILD/debian/debian/<nameOfPackage>
	make install DESTDIR=/usr/src/packages/BUILD/debian/ace
	# --- end custom part for installing

# Build architecture-independent files here.
binary-indep: build install
	# We have nothing to do by default.

# Build architecture-dependent files here.
binary-arch: build install
	dh_testdir
	dh_testroot
#	dh_installdebconf
	dh_installdocs
	dh_installexamples
	dh_installmenu
#	dh_installlogrotate
#	dh_installemacsen
#	dh_installpam
#	dh_installmime
#	dh_installinit
	dh_installcron
	dh_installman
	dh_installinfo
#	dh_undocumented
	dh_installchangelogs
	dh_link
	dh_strip
	dh_compress
	dh_fixperms
#	dh_makeshlibs
	dh_installdeb
#	dh_perl
	dh_shlibdeps
	dh_gencontrol
	dh_md5sums
	dh_builddeb

binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install


sources.list konfigurieren

Nach der Erstellung von .deb-Paketen wollen Sie das Paketdepot wahrscheinlich ihrer sources.list hinzufügen, um apt-get zur Installation ihrer Pakete nutzen zu können.

Wenn Sie einer Debian-Distribution bspw. mein Paketdepot hinzufügen wollen, fügen Sie ihrer sources.list die folgende Zeile hinzu:

deb http://download.opensuse.org/repositories/home:/EmmeG/Debian_Etch/ ./

Für Ubuntu ändern Sie das letzte Feld auf der Ubuntu-Verzeichnis.

deb http://download.opensuse.org/repositories/home:/EmmeG/xUbuntu_7.10/ ./

WENN SIE ALLERDINGS APT-GET UPDATE AUSFÜHREN, WERDEN SIE EINEN FEHLER ERHALTEN Und zwar antwortet der Hauptserver beim Abrufen der Daten von http://download.opensuse.org/repositories/home:/EmmeG/ mit einer HTTP-Weiterleitung (302), was apt-get für einen Fehler hält!!!

Unglücklicherweise ist dies keine Fehler in apt-get... Es ist eine Enscheidung der apt-Entwickler, die es für sehr unsicher halten, 302-Weiterleitungen für Paketdepots zu nutzen. (Wieso ?!?! Das sagen Sie uns nicht, sie sagen nur, es sei unsicher.)

Sie können dieses Problem aber auf zwei Wegen umgehen:

  1. Falls Sei einen eigenen Server haben, spiegeln Sie das Paketdepot auf diesen und leiten Sie ihre Nutzer direkt dorthin.
  2. Suchen Sie unter den Spiegelservern der Entwicklungsversion einen Server, der ihr Paketdepot spiegelt und leiten Sie ihr Nutzer direkt dorthin (in der Hoffnung, dass der Spiegel permanent da ist).


Beispiele

Einige Beispiele finden Sie im home-Projekt: https://build.opensuse.org/project/show?project=home%3AEmmeG


Der schnelle Weg

Sie werden wahrscheinlich schon eine paket.tar.bz2-Datei für die RPM-Distributionen haben. Um dies für Debian-basierte Bauten weiter zu nutzen und um sich all den in den obigen Schritten erwähnten Ärger zu ersparen, machen Sie einfach folgendes:

  1. Holen Sie sich die .dsc-Datei von http://packages.debian.org/ und benennen Sie sie in paket.dsc um.
  2. Holen Sie sich die .diff.gz Datei von http://packages.debian.org/ .
  3. Entpacken Sie die .diff-Datei in ein leeres Verzeichnis.
  4. Extrahieren Sie den Patch mit "patch -p0 < dateinamen", was ein "debian/" Unterverzeichnis erstellen wird.
  5. Verschieben Sie die .changelog-Datei aus dem Debian-Verzeichnis und nennen Sie sin paket.changes um.
  6. Komprimieren Sie das debian/ Verzeichnis in eine debian.tar.gz-Datei.
  7. Laden Sie die Dateien debian.tar.gz, paket.changes und paket.dsc in ihr Build Service-Projekt hoch.

HINWEIS: Ersetzen Sie "paket" in der obigen Beschreibung durch den Namen ihres Pakets.

Das war's, alle Debian-basierten bauten sollten nun problemlos funktionieren. Um Aktualisierungen vorzunehmen, laden Sie einfach eine neue unverfälschte paket.tar.bz2-Datei hoch, bearbeiten Sie die paket.changes-datei und lösen Sie einen Neubau aus.

Häufige Probleme

Über den Name Der Verpackung

RPM Verpackung Namen haben keine strikte Syntax wie Debian Verpackungen. Passen Sie auf vorher Ihr Archiven zu hochladen !

  • Verpackung Namen (beide Source und Binary, sehen Sie Package, Section 5.6.7) müssen nur Kleinbuchstaben (a-z), Zahlen (0-9), plus (+) und minus (-) Zeichen, und Punkte (.) enthalten. Sie müssen minimal zwei Buchstaben lang sein und beginnen mit einer alpha-numerische Buchstabe.

Mehr Infos auf http://www.debian.org/doc/debian-policy/ch-controlfields.html

Über das .tar.bz2

Mit Debian 4.0 und xUbuntu 8.04 und älteres durfte man nameDerVerpackgung.tar.bz2 nutzen. Diese dürfen mit .deb und .rpm Distributionen mitgeteilt werden. Mit Debian 5.0 und xUbuntu 8.10 darf man nur nameDerVerackung.tar.gz nutzen, wie erklärt im Debian Policy. Um Sourcen mit .rpm und .deb Distributionen für alle Plattformen in OBS mitzuteilen, ist es empfohlen nameDerVerpackung.tar.gz Dateien zu nutzen.

Über die "postinst" Skripte (post-installation)

Wenn Sie ein Skript in der Post-Einstellung laufen wollen, können Sie :

  • ein Datei der Name debian.postinst hochladen (notieren Sie sich 'debian' prefix), gleich wie debian.rules
  • Ihr Datei nameDerVerpackung.postinst im debian.tar.gz Datei hin einfügen

Sehen Sie Beispiel auf https://build.opensuse.org/package/show?package=openvas-server&project=security%3Aopenvas%3ASTABLE

Format des Patches

Debian 4.0 und xUbuntu < 8.x brauchen gleiche Namen für das Datei zu patchen und das neue Datei mit -p0 Patches (bnc#492297).

Hinzu kommt, dass xUbuntu 6.06 darf keinen Inhalt nach die Linie @@..@@ haben. Z.B.
@@ -37,7 +37,7 @@ openvas-libraries.tmpl: openvas-librarie
scheitert und
@@ -37,7 +37,7 @@
läuft gut. Entfernen Sie den Inhalt nach dem zweiten @@ und es lässt sich auflösen.

Anbindung der -deb Verpackung zu seinem Haupten

Ubuntu 6.06 versteht kein "(= ${binary:Version})" im Datei .control. Hier, "(= ${Source-Version})" muss genutzt werden.