# 6. Neue Software paketieren

Auch wenn bereits tausende Pakete in den Ubuntu-Archiven vorhanden sind, gibt es noch immer sehr viele Programme, die nicht dort zu finden sind. Wenn es ein neues interessantes Programm gibt, das eine größere Verbreitung haben sollte, möchten Sie vielleicht versuchen ein Paket für Ubuntu zu erzeugen oder ein PPA einzurichten. Dieser Leitfaden hilft Ihnen Schritt für Schritt dabei die neuen Softwarepakete zu erstellen.

Sie sollten als erstes den :doc:`Vorbereitung<./getting-set-up>`s-Artikle lesen, um Ihre Entwicklungsumgebung vorzubereiten.

## 6.1. Das Programm überprüfen

Der erste Schritt in der Paketerstellung ist das Besorgen des veröffentlichen Quelltextes von Upstream (die Autoren von Software werden als “Upstream” bezeichnet) und das Überprüfen auf Kompilier- und Ausführbarkeit.

Dieser Leitfaden führt Sie anhand einer einfachen Anwendung namens GNU Hello, die von GNU.org veröffentlicht wurde, duch den Prozess des Paketbaus.

Falls du die nötigen Werkzeuge zur Erstellung noch nicht hast, lass uns sicherstellen, dass sie bereitgestellt werden. Ebenso wird mit fehlenden Abhängigkeiten verfahren.

Build-Werkzeuge installieren

    $ sudo apt-get install build-essential

Das Hauptpaket herunterladen

    $ wget -O hello-2.7.tar.gz "http://ftp.gnu.org/gnu/hello/hello-2.7.tar.gz"

Jetzt entpacke das Hauptpaket

    $ tar xf hello-2.7.tar.gz
    $ cd hello-2.7

Diese Anwendung nutzt das autoconf-Build-System, also wollen wir `./configure` ausführen, um uns für das Kompilieren vorzubereiten.

Dies wird die benötigten Erstellungsabhängigkeiten überprüfen. Um `hello` als einfaches Beispiel zu nehmen, `build-essential` sollte alles bereitstellen was wir brauchen. An komplexeren Programmen wird dieser Befehl scheitern, wenn du nicht die benötigten Bibliotheken und Entwicklungsdateien besitzt. Installiere die benötigten Pakete und Entwicklungsdateien bis der Befehl erfolgreich ausgeführt wird.:

    $ ./configure

Jetzt kannst Du den Quelltext kompilieren:

    $ make

Wenn das Kompilieren erfolgreich war, können Sie folgende Anwendung installieren und starten:

    $ sudo make install
    $ hello

## 6.2. Ein Paket starten

`bzr-builddeb` includes a plugin to create a new package from a template. The plugin is a wrapper around the `dh_make` command. You should already have these if you installed `packaging-dev`. Run the command providing the package name, version number, and path to the upstream tarball:

    $ sudo apt-get install dh-make
    $ cd ..
    $ bzr dh-make hello 2.7 hello-2.7.tar.gz

Wenn Sie nach dem Pakettyp gefragt werden, wählen Sie mit der Eingabe von `s` den Typ einzelne Binärdatei. Der Quelltext wird in einen Zweig importiert und das `debian/` Paketverzeichnis wird hinzugefügt. Sehen Sie sich einmal den Inhalt an. Die meisten Dateien werden nur für spezielle Pakete (beispielsweise Emacs Module) benötigt, sodass Sie mit dem Entfernen der nicht benötigten Dateien anfangen können:

    $ cd hello/debian
    $ rm *ex *EX

Du solltest nun jede der Dateien anpassen.

In `debian/changelog` change the version number to an Ubuntu version: `2.7-0ubuntu1` (upstream version 2.7, Debian version 0, Ubuntu version 1). Also change `unstable` to the current development Ubuntu release such as `trusty`.

Much of the package building work is done by a series of scripts called `debhelper`. The exact behaviour of `debhelper` changes with new major versions, the compat file instructs `debhelper` which version to act as. You will generally want to set this to the most recent version which is `9`.

Unter `control` sind alle Metadaten eines Paketes enthalten. Der erste Abschnitt beschreibt das Quellpaket. Der zweite Abschnitt beschreibt die Binärpakete, die erstellt werden. Unter `Build-Depends:` müssen alle Pakete eingetragen werden, von denen die Kompilierung abhängt. Für `hello` werden mindestens die folgenden benötigt:

    Build-Depends: debhelper (>= 9)

Sie müssen außerdem eine Beschreibung der Anwendung das Feld `Description:` eintragen.

`copyright` muss ausgefüllt werden um der Lizenz des Upstreams gerecht zu werden. Der Datei hello/COPYING nach ist das die GNU GPL 3 oder neuer.

`docs` enthält alle Dokumentationsdateien des Upstreams, die deiner Meinung nach in dem entgültigen Paket enthalten sein sollten.

`README.source` und `README.Debian` werden nur benötigt, wenn dein Paket nicht nur Standardfunktionen hat. Das trifft hier nicht zu, also können sie gelöscht werden.

`source/format` kann beibehalten werden, es beschreibt das Versionsformat des Quellpakets und sollte `3.0 (quilt)` sein.

Die Umfangreichste Datei ist `rules`. Hierbei handelt es sich um eine Make-Datei, die den Quelltext kompiliert und in ein Binärpaket verwandelt. Erfreulicherweise wird dabei heutzutage die meiste Arbeit von `debhelper 7` erledigt, sodass das universale `%` Make-Dateiziel nur das `dh` Script ausführt, das alles Benötigte durchführt.

Alle Dateien sind in größerer Ausführlichkeit in der Übersicht im Artikel über das Debian Verzeichnis beschrieben.

Schlussendlich kommitte den Code zu deinem Paketier-Zweig:

    $ bzr commit -m "Initial commit of Debian packaging."

## 6.3. Das Paket bauen

Jetzt wird überprüft, ob das Programm kompiliert und das -deb Binärpaket erfolgreich gebaut werden kann:

    $ bzr builddeb -- -us -uc
    $ cd ../../

Mit dem Befehl `bzr builddeb` wird das Paket im aktuellen Verzeichnis gebaut. Die Option `-us -uc` ist die Anweisung, dass das Paket nicht GPG signiert werden muss. Das Ergebnis wird in `..` ausgegeben.

Du kannst Dir den Inhalt eines Paketes mit folgendem Befehl ansehen:

    $ lesspipe hello_2.7-0ubuntu1_amd64.deb

Install the package and check it works (later you will be able to uninstall it using `sudo apt-get remove hello` if you want):

    $ sudo dpkg --install hello_2.7-0ubuntu1_amd64.deb

You can also install all packages at once using:

    $ sudo debi

## 6.4. Nächste Schritte

Auch wenn das .deb Binärpaket erfolgreich gebaut wird, ist im Bauprozess möglicherweise ein Fehler passiert. Viele Fehler können automatisch mit dem Werkzeug `lintian` gefunden werden, das auf die .dsc Metadaten Datei als auch auf das .deb Binärpaket angewendet werden kann:

    $ lintian hello_2.7-0ubuntu1.dsc
    $ lintian hello_2.7-0ubuntu1_amd64.deb

Ein Beschreibung von jedem ausgegebenen Problem kann auf der lintian website gefunden werden.

Nachdem der Fehler im Bauprozess behoben wurde, können Sie mit der Option `-nc` “no clean” das Paket erneut bauen, ohne mit der Kompilierung des Quelltextes starten zu müssen:

    $ bzr builddeb -- -nc -us -uc

Nachdem sichergestellt ist, dass das Paket auf dem eigenen Rechner erfolgreich gebaut werden kann, sollten Sie überprüfen, ob dies auch auf einem frisch installierten System funktioniert. Zu diesem Zweck kann `pbuilder` eingesetzt werden. Da das gebaute Paket in ein PPA (Personal Package Archive) hochgeladen werden soll, ist es erforderlich, das Paket zu signieren. So kann Launchpad überprüfen, dass dieses Paket wirklich von Ihnen stammt (die hochzuladende Datei muss signiert werden, da die `-us` und `-uc` Markierungen nicht wie zuvor an `bzr builddeb` übergeben wurden). Für das Signieren benötigen Sie eine funktionierende Version von GPG. Sollten Sie `pbuilder-dist` oder GPG noch nicht installiert haben, so machen Sie dies jetzt:

    $ bzr builddeb -S
    $ cd ../build-area
    $ pbuilder-dist trusty build hello_2.7-0ubuntu1.dsc

Wenn Sie mit Ihrem Paket zufrieden sind, wird es vermutlich Ihre Absicht sein, dass andere Benutzer Ihr Paket überprüfen. Dazu können Sie den Zweig in Launchpad hochladen:

    $ bzr push lp:~<lp-username>/+junk/hello-package

Das Hochladen in ein PPA hat mehrere Vorteile: Sie können einfach den Paketbauvorgang auf Fehlerfreiheit überprüfen und andere können die Binärpakete testen. Hierfür benötigen Sie ein PPA in Launchpad, in das Sie ihre Dateien mittels `dput` hochladen:

    $ dput ppa:<lp-username>/<ppa-name> hello_2.7-0ubuntu1.changes

Sehen Sie auch Hochladen für mehr Informationen.

Rückmeldungen können Sie über den `#ubuntu-motu` IRC Kanal erfragen sowie über die MOTU Mailing Liste.`MOTU mailing list`_. Möglicherweise können Sie bei besonderen Fragen auch ein spezielles Team um Rat bitten, beispielsweise das GNU Team.

## 6.5. Zur Einbindung einsenden

Es gibt eine Vielzahl von Wegen, auf denen ein Paket in Ubuntu einziehen kann. In den meisten Fällen ist der Weg über Debian der beste Weg. Auf diesem Weg wird versichert, dass das Paket die größte Anzahl an Nutzern hat da es nicht nur in Debian und Ubuntu vorhanden sein wird, sondern auch in ihren Derivaten. Hier sind einige nützliche Links für das Hinzufügen neuer Pakete im Debianprojekt:

> - Debian Mentors FAQ - Das debian-mentors Team kümmert sich um neue und zukünftige Debian-Entwickler. Hier kannst du Sponsoren finden, die deine Pakete in das Archiv hoch laden,

> - Work-Needing and Prospective Packages - Information darüber, wie man “Intent to Package” und “Request for Package” Bug-Reports schreibt und aktuelle Listen von offenen ITPs und RFPs.

> - Debian Developer’s Reference, 5.1. New packages - Das gesamte Dokument ist wichtig für Ubuntu- und Debian-Entwickler. Dieser Abschnitt beschäftigt sich mit den Prozessen für das Hochladen von neuen Paketen.

In some cases, it might make sense to go directly into Ubuntu first. For instance, Debian might be in a freeze making it unlikely that your package will make it into Ubuntu in time for the next release. This process is documented on the “New Packages” section of the Ubuntu wiki.

## 6.6. Bildschirmfotos

Hast du einmal ein Paket zu Debian hochgeladen, solltest du Bildschirmfotos bereitstellen um zukünftigen Benutzern einen Einblick in das Programm zu geben. Diese sollen auf http://screenshots.debian.net/upload hochgeladen werden.