Ubuntu 16.10 Yakkety Yak
Ubuntu 16.04 Xenial Xerus
Ubuntu 14.04 Trusty Tahr
Ein klassisches Problem bei Kompilierung eines Programms aus dem Quellcode ist, dass man (als Nicht-Entwickler) häufig nicht nachvollziehen kann, welche Dateien bei der Installation wohin kopiert werden. Das macht eine Deinstallation so gut wie unmöglich.
Checkinstall ist ein Kommandozeilenwerkzeug, um aus dem Quelltext ein Debian-Paket (.deb) zu erstellen, das anschließend automatisch installiert werden kann. Dadurch können selbstkompilierte Programme mit einer beliebigen Paketverwaltung wieder rückstandsfrei entfernt werden. Des Weiteren können diese Pakete verwendet werden, um eine lokale Paketquelle einzurichten.
Eine andere Methode der Kompilierung mit der Möglichkeit einer einfachen Deinstallation, aber ohne die Erstellung eines DEB-Pakets, ist die Nutzung von paco bzw. dessen Nachfolger porg.
Technisch betrachtet gilt die Verwendung von checkinstall als "quick & dirty", da nicht alle Möglichkeiten durch die herkömmliche Paketerstellung gegeben sind (beispielsweise Prüfsummen, Maintainer-Skripte oder Modifikationen beim Kompiliervorgang). Dadurch sind die mit checkinstall erstellten Pakete von geringerer Qualität als herkömmlich erstellte. Zur Veröffentlichung bestimmte Pakete sollte man deswegen unbedingt über den herkömmlichen Weg erzeugen. Weitere Informationen dazu finden sich unter Paketbau.
Für das Kompilieren von Kernelmodulen (Treibern) ist checkinstall nicht geeignet. Hierbei muss entweder auf die Debian-Methode oder auf die Installation über make install
als Standard-Methode zurückgegriffen werden. Ferner sei nochmals erwähnt, dass Kernel-Module bei Kernel-Updates, also der Installation eines neuen Kernels, immer neu kompiliert und installiert werden müssen. Hier bietet sich der Einsatz von dkms an, um diesen Vorgang zu automatisieren.
Das Programm ist Bestandteil der offiziellen Paketquellen. Folgendes Paket muss installiert werden [1]:
checkinstall (universe)
mit apturl
Paketliste zum Kopieren:
sudo apt-get install checkinstall
sudo aptitude install checkinstall
Ein einfaches Beispiele, die die Verwendung von checkinstall demonstriert [2][3]:
tar xvf foo-1.0.tar.gz cd foo-1.0 ./configure make sudo checkinstall
Der einzige Unterschied zum sonst üblichen Dreisatz aus configure
, make
und sudo make install
ist in der letzten Zeile zu finden: statt einer direkten Installation erstellt checkinstall zuerst ein Debian-Paket, das anschließend sofort installiert wird (ein Beispieldurchlauf befindet sich am Ende des Artikels).
Bevor ein Debian-Paket erstellt wird, fragt checkinstall zunächst einige wichtige Paketmetainformationen ab:
Die Frage nach dem Erstellen eines Standardordners "docs" für das Paket kann man einfach bestätigen.
In die Paketbeschreibung kann man je nach Wunsch nichts oder z. B. die Kurzbeschreibung des Programms aus der Dokumentation übernehmen.
Abschließend gibt checkinstall eine Übersicht über die Paketinformationen, die man editieren kann. Wichtig dabei sind korrekt gesetzter Paketname und eine Versionsnummer.
Der Paketname hat insbesondere für eine parallele Installation des selbst kompilierten Programms zu einem bereits in der Paketverwaltung bestehendem Paket eine besondere Bedeutung. Man kann natürlich den Paketnamen ändern, damit das bestehende Paket nicht überschrieben wird. Dadurch kann es aber auch zu Überschneidungen kommen, bei denen eine Fehlermeldung ausgegeben wird, dass eine Datei überschrieben werden soll, die auch in dem "ursprünglichen" Paket enthalten ist - die Installation bricht dann ab! Hier sollte man also zuvor an die --prefix
-Einstellung beim configure-Skript denken.
Eine falsche Versionsnummer kann die Paketverwaltung dazu veranlassen, das "alte" Paket aus den offiziellen Paketquellen immer wieder zur Aktualisierung vorzuschlagen. Um das zu vermeiden, sollte man sich die Versionierung der Ubuntu-Pakete ansehen und die Versionsnummer dementsprechend setzen. Die vom Programmautor verwendete Art der Versionierung eines Programms kann von der Ubuntu-Versionierung abweichen.
checkinstall wird nach dem Durchlauf ausgeben, ob die Installation erfolgreich war und wo das neu erstelle Paket abgelegt wurde. Eine spätere Deinstallation erfolgt dann mittels einer beliebigen Paketverwaltung.
Möchte man auf eine automatische Installation des neu erstellten Pakets verzichten, lässt man das sudo
einfach weg. Zwangsläufig wird checkinstall einen Fehler ausgeben, weil ein Paket ohne Root-Rechte nicht installiert werden kann. Das Paket wird aber trotzdem im Quelltextverzeichnis erstellt und kann anschließend manuell installiert werden [4].
Alternativ hilft auch der folgende Aufruf:
checkinstall --install=no
Neben diesem einfachen Beispiel besitzt das Programm eine Reihe weiterer Optionen, die der Manpage zu entnehmen sind. checkinstall verwendet die Datei /etc/checkinstallrc für systemweite Einstellungen.
Bricht checkinstall die Installation mit obskuren Fehlern ab, dann liegt das meist daran, dass es neue Dateien nicht anlegen kann. Das Problem liegt dann im "file translation code" von installwatch (einem Unterprogramm von checkinstall), das hierfür ein Art virtuelles Dateisystem bereitstellt, damit das Eigentliche nicht angerührt wird. Die Installationsroutine kann manchmal neu erstellte Dateien nicht finden und bricht deswegen ab. Dies kann dann beispielsweise so aussehen:
install: cannot change permissions of `/usr/local/etc/mplayer': No such file or directory make: *** [install-dirs] Fehler 1
Lösung: Mit der Option --fstrans=no
beim Aufruf von checkinstall wird diese Funktion deaktiviert. Oft ist eine Installation auch erfolgreich, wenn zunächst make install
ausgeführt wird, und danach ein checkinstall
erfolgt.
Problematisch ist in diesem Zusammenhang, dass mit Root-Rechten erstellte Dateien im eigenen Homeverzeichnis nicht vom eigentlichen Benutzer gelöscht werden können. Zum Löschen der mit sudo...
selbst erstellten Pakete sind grundsätzlich Root-Rechte erforderlich.
Tritt beim Erstellen des Debian-Pakets obiger Fehler auf, so liegt dies wahrscheinlich daran, dass beim Aufruf von checkinstall und der damit einhergehenden Erstellung der Datei ./doc-pak eine ungültige Versionsnummer angegeben wurde.
dpkg-deb: Fehler: Parsen der Datei »/var/tmp/tmp.y9z26Ip5DO/package/DEBIAN/control«, nahe Zeile 7 Paket »mplayer«: Fehler in Versionszeichenkette »vaapi-1«: Versionsnummer beginnt nicht mit einer Ziffer /var/tmp/tmp.y9z26Ip5DO/dpkgbuild.log (END)
Ein praktisches Beispiel:
checkinstall 1.6.2, Copyright 2009 Felipe Eduardo Sanchez Diaz Duran Diese Software wurde unter der GNU GPL veröffentlicht ***************************************** **** Debian package creation selected *** ***************************************** Das Paket wird entsprechend dieser Vorgaben erstellt: 0 - Maintainer: [ root@Ideapad-S205 ] 1 - Summary: [ mplayer VAAPI support ] 2 - Name: [ mplayer ] 3 - Version: [ vaapi ] Versionsnummer beginnt NICHT mit einer Zahl! 4 - Release: [ 1 ] 5 - License: [ GPL ] 6 - Group: [ checkinstall ] 7 - Architecture: [ amd64 ] 8 - Source location: [ mplayer-vaapi ] 9 - Alternate source location: [ ] 10 - Requires: [ ] 11 - Provides: [ mplayer ] 12 - Conflicts: [ ] 13 - Replaces: [ ] Geben Sie die betreffende Nummer ein, um die Vorgaben zu ändern: Installing with make install... ====================== Installations-Ergebnisse ========================== install -d /usr/local/bin /usr/local/etc/mplayer /usr/local/lib install -m 755 -s mencoder /usr/local/bin install -d /usr/local/share/man/man1 install -m 644 DOCS/man/en/mplayer.1 /usr/local/share/man/man1/ cd /usr/local/share/man/man1 && ln -sf mplayer.1 mencoder.1 install -m 755 -s mplayer /usr/local/bin ====================== Installation erfolgreich ========================== Copying documentation directory... ./ ./AUTHORS ./Changelog ./README ./LICENSE Kopiere Dateien in das temporäre Verzeichnis...OK Stripping ELF binaries and libraries...OK Komprimiere man-Seiten...OK Erzeuge Datei-Liste...OK Erstelle Debian-Paket... FAILED! Hier das Resultat: .deb kann nicht erstellt werden *** Paket-Erstellung fehlgeschlagen Möchten Sie die log-Datei sehen? [y]: y Lösche temporäre Dateien...OK Schreibe Sicherungs-Paket...OK OK Lösche temporäres Verzeichnis...OK
Lösung: Beim Aufruf von checkinstall und der Abfrage:
"Geben Sie die betreffende Nummer ein, um die Vorgaben zu ändern:"
die 3
wählen und eine Versionsnummer eingeben (am besten die Richtige), die mit einer Zahl beginnt. Dann sollte checkinstall problemlos durchlaufen.
Alternativ checkinstall direkt die Versionsnummer beim Aufruf übergeben:
sudo checkinstall --pkgversion VERSIONSNUMMER
Diese Revision wurde am 13. März 2017 20:52 von axt erstellt.