Debian-Paket-erstellen
Inhaltsverzeichnis
Debian Paket erstellen
Da es im Netz viele Anleitungen gibt, setze ich einfach noch eine dazu: Wie erstelle ich ein Debian Paket. Das Problem bei vielen Anleitungen besteht darin, dass vorhandene Debian Pakete neu zusammen gesetzt werden, oder Programme die mit dem Unix Dreisatz (configure;make;make install) arbeiten. In diesem Fall habe ich nicht einmal das.
Das Programm ist das Java Tool Vert.x, welches nur aus einer Zahl von (Java) Dateien besteht. Des Weiteren muss das ausführbare Programm "vertx" auch noch verändert werden, sodass es die Konfigurationsdatei nicht im $HOME erwartet wird, sondern unter /etc/vertx/.
Vorbereitungen
- Download von dem Programm
$ wget https://bintray.com/artifact/download/vertx/downloads/vert.x-3.2.1-full.tar.gz |
Dummerweise entpackt sich das Programm nur in den Ordner "vertx", was nicht Debian konform ist. Daher benennen wir es um und packen es erneut:
$ tar xzf vert.x-3.2.1-full.tar.gz $ mv vertx vert.x-3.2.1-full $ rm vert.x-3.2.1-full.tar.gz $ tar czf vert.x-3.2.1-full.tar.gz vert.x-3.2.1-full |
Würde man das Tar nun (erneut) auspacken, landet es diesmal unter dem Namen vert.x-3.2.1-full. Das ist wichtig, da sonst der Build Prozess am Ende fehl schlägt.
Die Dateistruktur sieht wie folgt aus:
~/vert.x-3.2.1-full$ ls -l total 20 drwxr-xr-x+ 2 fakeuser fakeuser 4096 Feb 29 15:51 bin drwxr-xr-x+ 2 fakeuser fakeuser 4096 Feb 29 15:51 conf drwxr-xr-x+ 2 fakeuser fakeuser 4096 Feb 29 15:51 lib -rw-r--r-- 1 fakeuser fakeuser 7074 Feb 5 14:06 vertx-stack.json |
Paket Struktur erstellen
Damit Im Paket der Richtige Name und Mailadresse steht, werden diese kurzerhand exportiert:
$ export EMAIL="fakeuser@example.com" $ export DEBFULLNAME="Fake User" |
Als nächstes muss in dem entpackten Verzeichnis die entsprechende Debian Struktur erstellt werden. Das kann mit folgendem Kommando erledigt werden:
~/vert.x-3.2.1-full$ dh_make -f ../vert.x-3.2.1-full.tar.gz |
Das Kommando fragt nun diverse Informationen ab:
Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch? [s/i/m/l/k/n] i Maintainer name : Fake User Email-Address : fakeuser@example.com Date : Mon, 29 Feb 2016 16:24:11 +0100 Package Name : vert.x Version : 3.2.1-full License : blank Type of Package : Independent Hit <enter> to confirm: Skipping creating ../vert.x_3.2.1-full.orig.tar.gz because it already exists Currently there is no top level Makefile. This may require additional tuning. Done. Please edit the files in the debian/ subdirectory now. You should also check that the vert.x Makefiles install into $DESTDIR and not in / .
Ich habe mich in diesem Fall für "i" (indep binary) entschieden, es wäre aber auch "s" gegangen. Wie man der Meldung entnehmen kann, bemerkt das Programm, dass kein Makefile vorhanden ist. Um diesem Umstand zu kompensieren, wird ein Makefile mittels eines Patches erstellt.
Schaut man danach in das debian/ Verzeichnis, finden sich da nun ein Haufen Dateien, die für unsere Zwecke nicht benötigt werden. Daher kann man die getrost löschen:
~/vert.x-3.2.1-full$ rm debian/*.ex ~/vert.x-3.2.1-full$ rm debian/*.EX |
Dann editieren wir schonmal die Changelog. Dazu am Besten das Kommando "dch" verwenden:
~/vert.x-3.2.1-full$ dch |
Und sinnvolle Dinge einfügen:
- changelog
vert.x (3.2.1-full-1.1) UNRELEASED; urgency=medium * Non-maintainer upload. -- <fakeuser@devpc21n-02.inatec.local> Tue, 01 Mar 2016 09:10:11 +0100 vert.x (3.2.1-full-1) unstable; urgency=low * Initial release -- Fake User <fakeuser@example.com> Mon, 29 Feb 2016 16:24:11 +0100 |
Da Vert.x keine reine GPL Anwendung ist, sondern auch unter der Apache 2.0 Lizenz vertrieben wird, die entsprechend auch anpassen:
- copyright
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: vert.x Source: http://vertx.io Files: * Copyright: 2011-2012 the original author or authors License: Apache-2.0 Files: debian/* Copyright: 2012 Diego Lopez Leon <diegoll@itcrowdarg.com> License: Apache-2.0 License: Apache-2.0 Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at . http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. . On Debian systems, the complete text of the Apache version 2.0 license can be found in "/usr/share/common-licenses/Apache-2.0". |
Die README.Debian kann man auch mit passenden Hinweisen versehen
- README.Debian
vert.x-full for Debian ----------------- Vert.x executable file patched, to find its configuration under /etc/vertx and the libs are under /usr/lib/vertx -- Fake User <fakeuser@example.com> Mon, 29 Feb 2016 16:24:11 +0100 |
Als nächstes kommt die Datei debian/control. Darin werden unter anderem die Paketinformationen abgelegt, welche Abhängigkeiten erfüllt sein müssen, und auch in welche Kategorien es gehört:
- debian/control
Hier ist zu beachten, dass als "Architecture" "all" angegeben wird, was bedeutet, dass das Paket auf allen Plattformen installiert werden kann. Also i386/AMD64/ARM ..
Source: vert.x Section: java Priority: optional Maintainer: unknown <fakeuser@devpc21n-02.inatec.local> Build-Depends: debhelper (>= 9) Standards-Version: 3.9.5 Homepage: http://vertx.io #Vcs-Git: git://anonscm.debian.org/collab-maint/vert.x.git #Vcs-Browser: http://anonscm.debian.org/?p=collab-maint/vert.x.git;a=summary Package: vert.x Depends: default-jre | java7-runtime, ${misc:Depends} Architecture: all Description: Toolkit for building reactive applications on the JVM Vert.x is event driven and non blocking. This means your app can handle a lot of concurrency using a small number of kernel threads. Vert.x lets your app scale with minimal hardware. |
Fehlt noch die debian/rules Datei. Sie wird abgearbeitet, wenn ein Paket erstellt wird. Da wir quilt verwenden wollen, müssen wir das Debian mitteilen:
- debian/rules
#!/usr/bin/make -f # See debhelper(7) (uncomment to enable) # output every command that modifies files on the build system. DH_VERBOSE = 1 %: dh $@ --with quilt |
Das hinzufügen kann man sich allerdings auch sparen, wenn in der debian/source/format und debian/compat folgendes enthalten ist:
- debian/source/format
3.0 (quilt) |
- debian/compat
9 |
Patch erstellen
Die beste Herleitung dazu habe ich auf dieser Webseite gefunden. Daher ist das hier nur eine verkürzte Darstellung der Kommandos. Im Wesentlichen wird Quilt verwendet, um Debianpakete auf humane Art und Weise zu verändert, bzw. deren Dateien. Damit das gut klappt, sollten ein paar Empfehlungen umgesetzt werden:
Zuerst die Quilt Konfigurationsdatei des Users, unter dem das Debian Paket erstellt wird.
- Quilt Konfiguration: ~/.quiltrc
d=. ; while [ ! -d $d/debian -a `readlink -e $d` != / ]; do d=$d/..; done if [ -d $d/debian ] && [ -z $QUILT_PATCHES ]; then # falls in Debian-Paketbaum mit ungesetztem $QUILT_PATCHES QUILT_PATCHES="debian/patches" QUILT_PATCH_OPTS="--reject-format=unified" QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto" QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index" QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:diff_ctx=35:diff_cctx=33" if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi fi |
Als nächstes sollte unbedingt Vim passend für Tabs konfiguriert werden, da ansonsten das Makefile nicht funktioniert:
- Vim Konfiguration: ~/.vimrc
autocmd FileType make setlocal noexpandtab |
Erste Aufgabe: einen Patch erstellen, der ein Makefile im ~/vert.x-3.2.1-full/ Ordner erzeugt.
~$ cd vert.x-3.2.1-full ~/vert.x-3.2.1-full$ quilt series ~/vert.x-3.2.1-full$ quilt new 01_add-makefile.diff Patch patches/01_add-makefile.diff is now on top |
"quilt series" listet auf, welche Patches bereits Quilt bekannt sind. In unserem Fall ist die Ausgabe leer. Mit "quilt new 01_add-makefile.diff" erstellen wir den entsprechenden Patch, was im Grunde auch ein fertiger Diff sein kann. Da wir aber noch nichts haben ... Dann stellen wir sozusagen die Verbindung zwischen dem Patch und der betreffenden Datei her. In unserem Fall das noch nicht existierende Makefile:
~/vert.x-3.2.1-full$ quilt add Makefile File Makefile added to patch patches/01_add-makefile.diff |
Nun können wir das Makefile nach unserem Wünschen erstellen (auf die Tabs achten !!!) :
~/vert.x-3.2.1-full$ quilt edit Makefile |
- ~/vert.x-3.2.1-full$ Makefile
all: install: install -D -m755 bin/vertx $(DESTDIR)/usr/bin/vertx mkdir -p $(DESTDIR)/usr/lib/vertx cp lib/*.jar $(DESTDIR)/usr/lib/vertx cp vertx-stack.json $(DESTDIR)/usr/lib/vertx mkdir -p $(DESTDIR)/etc/vertx cp -r conf/* $(DESTDIR)/etc/vertx |
- Diff anschauen
~/vert.x-3.2.1-full$ quilt diff Index: vert.x-3.2.1-full/Makefile =================================================================== --- /dev/null +++ vert.x-3.2.1-full/Makefile @@ -0,0 +1,8 @@ +all: + +install: + install -D -m755 bin/vertx $(DESTDIR)/usr/bin/vertx + mkdir -p $(DESTDIR)/usr/lib/vertx + cp lib/*.jar $(DESTDIR)/usr/lib/vertx + mkdir -p $(DESTDIR)/etc/vertx + cp -r conf/* $(DESTDIR)/etc/vertx |
- Patch unter debian/patches erstellen lassen
$ quilt refresh Refreshed patch 01_add-makefile.diff |
Der Patch ist nun vorhanden, fehlt nur noch der Quilt Header:
$ quilt header --dep3 -e |
Description: Add Makefile Vert.x doesn't come with a Makefile, so the patch adds one to copy the files to the new place. Author: Fake User <fakeuser@example.com> Origin: other --- This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ |
Das Ergebnis:
$ cat debian/patches/01_add-makefile.diff Description: Add Makefile Vert.x doesn't come with a Makefile, so the patch adds one to copy the files to the new place. Author: Fake User <fakeuser@example.com> Origin: other --- This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +all: + +install: + install -D -m755 bin/vertx $(DESTDIR)/usr/bin/vertx + mkdir -p $(DESTDIR)/usr/lib/vertx + cp lib/*.jar $(DESTDIR)/usr/lib/vertx + mkdir -p $(DESTDIR)/etc/vertx + cp -r conf/* $(DESTDIR)/etc/vertx |
Hat das auch geklappt, können wir nun den Patch "rückgängig" machen, da das spätere Debian Paket ja den Patch bei der Installation einpflegt:
$ quilt pop -a Removing patch 01_add-makefile.diff Removing Makefile No patches applied |
Zum Testen schadet es nichts, zu schauen, ob auch immer noch alles klappt:
$ quilt push Applying patch 01_add-makefile.diff patching file Makefile Now at patch 01_add-makefile.diff |
Sieht gut aus, dann nicht vergessen, wieder aufzuräumen, mit "quilt pop -a".
Nun kommt der zweite Patch, der dafür sorgt, dass Vert.x seine Konfiguration unter /etc/vertx findet, sowie die Dateien unter /usr/lib/vertx: Gleiches Spiel
$ quilt new 02_fix_vertx_path.diff $ quilt add bin/vertx $ quilt edit bin/vertx # Alles anpassen $ quilt diff --- a/bin/vertx +++ b/bin/vertx @@ -61,25 +61,9 @@ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` fi -# Attempt to set VERTX_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/.." -VERTX_HOME="`pwd -P`" -cd "$SAVED" - -CLASSPATH=${CLASSPATH}:${VERTX_HOME}/conf:${VERTX_HOME}/lib/* +LIBDIR=/usr/lib/vertx +CONFDIR=/etc/vertx +CLASSPATH=${CLASSPATH}:${CONFDIR}/:${LIBDIR}/* # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then @@ -193,8 +177,7 @@ exec "$JAVACMD" \ "${JVM_OPTS[@]}" \ - -Djava.util.logging.config.file=${VERTX_JUL_CONFIG:-${VERTX_HOME}/conf/logging.properties} \ - -Dvertx.home=$VERTX_HOME\ + -Djava.util.logging.config.file=${CONFDIR}/logging.properties \ -Dvertx.cli.usage.prefix=vertx\ -Dvertx.clusterManagerFactory=io.vertx.spi.cluster.impl.hazelcast.HazelcastClusterManagerFactory\ -classpath "$CLASSPATH" \ $ quilt refresh $ quilt header --dep3 -e $ while quilt push; do quilt refresh; done |
Das letzte Kommando geht noch einmal durch alle Patches und erzeugt nochmal neue, für den Fall, dass doch noch Änderungen stattgefunden haben.
Paket erzeugen
Der letzte Schritt ist es nun, das Paket zu erzeugen. Dafür wird das Kommando "debuild" verwendet:
~/vertx-debian/vert.x-3.2.1-full$ debuild -us -uc dpkg-buildpackage -rfakeroot -D -us -uc dpkg-buildpackage: source package vert.x-full dpkg-buildpackage: source version 3.2.1 dpkg-buildpackage: source distribution stable dpkg-buildpackage: source changed by Denny Fuchs <denny.fuchs@powerpay21.com> dpkg-source --before-build vert.x-3.2.1-full dpkg-buildpackage: host architecture amd64 fakeroot debian/rules clean dh clean --with quilt dh_testdir dh_auto_clean dh_quilt_unpatch Removing patch 02_fix_vertx_pathes.diff Restoring bin/vertx [...] |
Quellen
- https://wiki.debian.org/IntroDebianPackaging
- http://stackoverflow.com/questions/10999948/how-to-include-a-directory-in-the-package-debuild
- https://www.debian.org/doc/manuals/maint-guide/dreq.en.html#s-rules
- https://raphaelhertzog.com/2012/08/08/how-to-use-quilt-to-manage-patches-in-debian-packages/
- https://wiki.debconf.org/upload/2/27/Handout.pdf
--Denny (Diskussion) 13:07, 1. Mär. 2016 (CET)