Debian-Paket-erstellen

aus PUG, der Penguin User Group
Wechseln zu: Navigation, Suche

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
Gnome-terminal.png
$ 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:

Gnome-terminal.png
$ 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:

Gnome-terminal.png
~/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:

Gnome-terminal.png
$ 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:

Gnome-terminal.png
~/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:

Gnome-terminal.png
~/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:

Debian-term.png
~/vert.x-3.2.1-full$ dch

Und sinnvolle Dinge einfügen:

  • changelog
Ascii.png
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
Ascii.png
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
Ascii.png
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 ..

Ascii.png
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
Ascii.png
#!/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
Ascii.png
3.0 (quilt)
  • debian/compat
Ascii.png
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
Ascii.png
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
Ascii.png
autocmd FileType make setlocal noexpandtab

Erste Aufgabe: einen Patch erstellen, der ein Makefile im ~/vert.x-3.2.1-full/ Ordner erzeugt.

Debian-term.png
~$ 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:

Debian-term.png
~/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 !!!) :

Debian-term.png
~/vert.x-3.2.1-full$ quilt edit Makefile
  • ~/vert.x-3.2.1-full$ Makefile
Ascii.png
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
Debian-term.png
~/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
Debian-term.png
$ quilt refresh
Refreshed patch 01_add-makefile.diff

Der Patch ist nun vorhanden, fehlt nur noch der Quilt Header:

Debian-term.png
$ quilt header --dep3 -e
Ascii.png
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:

Debian-term.png
$ 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:

Debian-term.png
$ 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:

Debian-term.png
$ 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

Debian-term.png
$ 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:

Debian-term.png
~/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


--Denny (Diskussion) 13:07, 1. Mär. 2016 (CET)