Wie erstelle ich ein Debian / Ubuntu-Paket aus dem Quellcode?

116

Ich habe die Quelle eines Programms (entnommen aus cvs / svn / git / ...) und möchte ein Debian / Ubuntu-Paket dafür erstellen. Das Paket ist in den Repositorys vorhanden, aber:

  • Es ist eine ältere Version (ohne Funktionen, die ich brauche)
  • Ich benötige etwas andere Kompilierungsoptionen als die Standardoptionen.

Was ist der einfachste Weg, dies zu tun? Ich mache mir Sorgen um ein paar Dinge

  • Wie kann ich überprüfen, ob ich alle Abhängigkeiten korrekt aufgelistet habe? (Ich kann einige Hinweise erhalten, indem ich mir anschaue, was von der älteren Version abhängt, aber möglicherweise wurden neue Abhängigkeiten hinzugefügt.)
  • Wie kann ich verhindern, dass das Update-System bei einem Update die ältere Version im Repo installiert?
  • Wie kann ich verhindern, dass das System eine neuere Version installiert (wenn diese nicht mehr verfügbar ist) und mein benutzerdefiniertes Paket überschreibt?
Ryszard Szopa
quelle
Ähnlich auf AU: askubuntu.com/questions/28372/…
Ciro Santilli 17 冠状 病 六四 事件 17

Antworten:

78

Sie können das spezielle Paket "checkinstall" für alle Pakete verwenden, die noch nicht einmal in debian / ubuntu sind.

Sie können "uupdate" ( apt-get install devscripts) verwenden, um ein Paket aus der Quelle mit vorhandenen Debian-Quellen zu erstellen:

Beispiel für libdrm2:

apt-get build-dep libdrm2
apt-get source libdrm2
cd libdrm-2.3.1
uupdate ~/Downloads/libdrm-2.4.1.tar.gz
cd ../libdrm-2.4.1
dpkg-buildpackage -us -uc -nc
Paweł Gościcki
quelle
Vielen Dank! Ich habe dies gerade verwendet, um Subversion 1.6.6 auf eine Ubuntu-Installation zu portieren, die nur 1.6.5 als neueste verfügbare Version hat, und es hat einwandfrei funktioniert. Hat mir ein paar Stunden Basteln erspart! :)
Carlos Villela
Könnten Sie etwas mehr Kontext zu diesen Befehlen geben? Wo ist libdrm-2.3.1genau? Auch woher kam libdrm-2.4.1.tar.gz(meine anfängliche Annahme ist, dass es sich um die kompilierte Binärdatei der Anwendung handelt, die wir in eine Debatte packen möchten, aber die vorhandene Version ersetzt, ist das richtig?)
Wheeler
Wenn Sie den Fehler erhalten You must put some 'source' URIs in your sources.list, kommentieren Sie die deb-src-Zeilen in Ihrem/etc/apt/sources.list
Christian
27

Zunächst die Titelfrage: Angenommen, das Debian-Verzeichnis ist bereits vorhanden, befinden Sie sich im Quellverzeichnis (dem Verzeichnis, das das Debian-Verzeichnis enthält) und rufen Sie dpkg-buildpackage auf. Ich möchte es mit folgenden Optionen ausführen:

dpkg-buildpackage -us -uc -nc

was bedeutet, nicht das Ergebnis unterschreiben und nicht reinigen.

Wie kann ich überprüfen, ob ich alle Abhängigkeiten korrekt aufgelistet habe?

Die Abhängigkeiten zu bekommen ist eine schwarze Kunst. Die "offizielle" Methode zum Überprüfen der Build-Abhängigkeit besteht darin, ob das Paket nur mit dem Basissystem, den "Build-Essential" -Paketen und den von Ihnen angegebenen Build-Abhängigkeiten erstellt wird. Ich kenne keine allgemeine Antwort für reguläre Abhängigkeiten, wate einfach rein :)

Wie kann ich verhindern, dass das Update-System bei einem Update die ältere Version im Repo installiert? Wie kann ich verhindern, dass das System eine neuere Version installiert (wenn diese nicht mehr verfügbar ist) und mein benutzerdefiniertes Paket überschreibt?

Mein Wissen ist in diesem Fall möglicherweise veraltet, aber um beides anzusprechen: Verwenden Sie dpkg --set-selections. Angenommen, nullidentd war das Paket, das Sie beibehalten und als root ausführen wollten

echo 'nullidentd hold' | dpkg --set-selections

Alternativ können Sie, da Sie aus dem Quellcode erstellen, eine Epoche verwenden , um die Versionsnummer künstlich hoch einzustellen, und nie wieder gestört werden. Um eine Epoche zu verwenden, fügen Sie der Debian / Changelog-Datei einen neuen Eintrag hinzu und setzen Sie ein 99: vor die Versionsnummer. In meinem nullidentd-Beispiel würde die erste Zeile Ihres aktualisierten Änderungsprotokolls lauten:

nullidentd (99:1.0-4) unstable; urgency=low

Bernards Link ist gut, besonders wenn Sie das Debian-Verzeichnis selbst erstellen müssen - hilfreich sind auch die Entwicklerreferenz und die allgemeine Ressourcenseite . Adams Link sieht auch gut aus, aber ich kenne ihn nicht.

Daniel Bungert
quelle
1
"dpkg --set-selections" funktioniert immer noch, aber eine bessere Methode wäre heutzutage "aptitude hold nullidentd".
Mark Baker
6

Für das, was Sie tun möchten, möchten Sie wahrscheinlich das Debian-Quellendiff verwenden, sodass Ihr Paket abgesehen von der verwendeten Upstream-Version dem offiziellen ähnlich ist. Sie können den Quellendifferenz von packages.debian.org herunterladen oder ihn zusammen mit der .dsc und dem ursprünglichen Quellarchiv mithilfe von "apt-get source" herunterladen .

Anschließend entpacken Sie Ihre neue Version der Upstream-Quelle, wechseln in dieses Verzeichnis und wenden den von Ihnen heruntergeladenen Diff an

zcat ~/downloaded.diff.gz | patch -p1
chmod +x debian/rules

Nehmen Sie dann die Änderungen vor, die Sie zum Kompilieren von Optionen vornehmen möchten, und erstellen Sie das Paket, indem Sie dies tun

dpkg-buildpackage -rfakeroot -us -uc
Mark Baker
quelle
3
  • Legen Sie das Verzeichnis "debian" aus dem Originalpaket in Ihr Quellverzeichnis
  • Verwenden Sie " dch ", um die Version des Pakets zu aktualisieren
  • Verwenden Sie "debuild", um das Paket zu erstellen
zowers
quelle
2

Ich glaube, das ist das Debian-Paket 'Bibel'.

Nun, es ist das Debian-Handbuch für neue Betreuer, daher ist vieles nicht anwendbar, aber sie decken ab, was wohin geht.

Bernard
quelle
1

Hier ist ein Tutorial zum Erstellen eines Debian-Pakets.

Grundsätzlich müssen Sie:

  1. Richten Sie Ihre Ordnerstruktur ein
  2. Erstellen Sie eine Steuerdatei
  3. Optional können Sie Postinst- oder Prerm- Skripte erstellen
  4. Führen Sie dpkg-deb aus

Normalerweise mache ich das alles in meinem Makefile, also kann ich einfach make eingeben, um die Binärdatei auszuspucken und sie auf einmal zu verpacken.

Adam Pierce
quelle
1

Wie kann ich überprüfen, ob ich alle Abhängigkeiten korrekt aufgelistet habe?

Dies pbuilderist ein hervorragendes Tool zum Überprüfen von Build-Abhängigkeiten und Abhängigkeiten, indem ein sauberes Basissystem in einer Chroot-Umgebung eingerichtet wird. Durch Kompilieren des Pakets in pbuilder können Sie die Build-Abhängigkeiten einfach überprüfen, und durch Testen in einer pbuilder-Umgebung können Sie die Abhängigkeiten überprüfen.

Thiton
quelle
1

Wenn Sie die Build-Abhängigkeiten schnell und unkompliziert installieren möchten, verwenden Sie:

apt-get build-dep

Dadurch werden die Abhängigkeiten installiert. Dazu benötigen Sie Quellzeilen in Ihrer Quellenliste:

deb-src http://ftp.nl.debian.org/debian/ squeeze-updates main contrib non-free

Wenn Sie Pakete vom Testen auf Stable zurückportieren, werden Sie darauf hingewiesen, dass sich die Abhängigkeiten möglicherweise geändert haben. Der Befehl apt-get build-deb installiert Abhängigkeiten für die Quellpakete in Ihrem aktuellen Repository.

Aber natürlich zeigt dpkg-buildpackage -us -uc alle deinstallierten Abhängigkeiten an.

Wenn Sie häufiger kompilieren möchten, verwenden Sie Cowbuilder.

apt-get install cowbuilder

Erstellen Sie dann einen Build-Bereich:

sudo DIST = Squeeze ARCH = amd64 Cowbuilder --create

Kompilieren Sie dann ein Quellpaket:

apt-get source cowsay

# do your magic editing
dpkg-source -b cowsay-3.03+dfsg1              # build the new source packages
cowbuilder --build cowsay_3.03+dfsg1-2.dsc    # build the packages from source

Beobachten Sie, wo Cowbuilder das resultierende Paket ablegt.

Viel Glück!

Allard Hoeve
quelle