Wie bekomme und ändere ich den Quellcode von Paketen, die über apt-get installiert wurden?

163

Ich gehe davon aus, dass alle über installierten Anwendungen apt-getOpen Source sind. aber für diejenigen, die auf diese Weise verfügbar sind, wo kann ich den Quellcode für diese Anwendungen erhalten sowie sie aktualisieren?

Ich verwende regelmäßig einige Anwendungen, die nicht mehr aktiv entwickelt werden, und möchte Funktionen hinzufügen. Wohin sollte ich gehen, um die Rechte zum Aktualisieren dieser Anwendungen zu erhalten?

In diesem Fall beziehe ich mich speziell auf das hellanzb- Paket

myusuf3
quelle
7
apt-getunterstützt auch Closed-Source-Programme, sodass Ihre ursprüngliche Annahme falsch ist.
Flimm

Antworten:

183

Verwenden Sie den Befehl apt-get source <package>(verwenden Sie nicht sudo), um die Quelle eines Pakets herunterzuladen.

Von man apt-get:

   source
       source causes apt-get to fetch source packages. APT will examine the
       available packages to decide which source package to fetch. It will then
       find and download into the current directory the newest available version of
       that source package while respect the default release, set with the option
       APT::Default-Release, the -t option or per package with the pkg/release
       syntax, if possible.

       Source packages are tracked separately from binary packages via deb-src type
       lines in the sources.list(5) file. This means that you will need to add such
       a line for each repository you want to get sources from. If you don't do
       this you will properly get another (newer, older or none) source version
       than the one you have installed or could install.

       If the --compile option is specified then the package will be compiled to a
       binary .deb using dpkg-buildpackage, if --download-only is specified then
       the source package will not be unpacked.

       A specific source version can be retrieved by postfixing the source name
       with an equals and then the version to fetch, similar to the mechanism used
       for the package files. This enables exact matching of the source package
       name and version, implicitly enabling the APT::Get::Only-Source option.

       Note that source packages are not tracked like binary packages, they exist
       only in the current directory and are similar to downloading source tar
       balls.

Um ein Paket aus dem Quellcode zu erstellen, installieren Sie zuerst die Build-Abhängigkeiten:

sudo apt-get build-dep <package>  

Verwenden Sie dann dpkg-buildpackage, um eine .debDatei zu erstellen . Aus dem APT- und Dpkg-Schnellreferenzblatt :

dpkg-buildpackage Erstellt ein Debian-Paket aus einem Debian -Quellbaum . Sie müssen sich im Hauptverzeichnis des Quellbaums befinden, damit dies funktioniert. Beispielnutzung:

 dpkg-buildpackage -rfakeroot -uc -b

Wobei es -rfakerootanweist, das fakeroot-Programm zum Simulieren von Root-Rechten zu verwenden (für Eigentümerzwecke), -ucsteht für "Das Changelog nicht kryptografisch signieren" und -bsteht für "Nur das Binärpaket erstellen".

In einem Terminal cdin das Verzeichnis mit der Paketquelle (zB ~/code/hellanzb-0.13) und führen Sie den folgenden Befehl aus:

dpkg-buildpackage -rfakeroot -uc -b

Wenn der Build erfolgreich ist, befindet sich eine .debDatei im übergeordneten
Verzeichnis (z ~/code/hellanzb_0.13-6.1_all.deb. B. ).

Jesaja
quelle
Wie kann ich von der geänderten Quelle installieren. sowie es für andere Benutzer zur Verwendung zurückzusichern. Vielen Dank!
Myusuf3
1
@dustyprogrammer Aktualisiert meine Antwort mit Anweisungen zum Erstellen eines .debPakets aus dem Quellcode. Um Ihr modifiziertes Paket in die Repositories zu bekommen, sollten Sie mit einer MOTU darüber sprechen .
Jesaja
@DoR gibt es eine Möglichkeit, eine Deb zu erstellen, die standardmäßig in einem benutzerdefinierten Verzeichnis installiert wird? Wie können wir das --prefix während des Konfigurationsprozesses installieren? Tatsächlich kann ich die Tarballs für die Quelle einer Bibliothek nicht finden. Deshalb kann ich --prefix nicht konfigurieren und installieren. Aber diese Paketquelle ist über apt verfügbar. Deshalb habe ich mir überlegt, das Quellpaket in dem gewünschten Präfix zu installieren .
Ashishsony
2
Wenn Sie apt-get source nicht verwenden möchten (zum Beispiel, wenn Sie ein Paket aus einer anderen Distribution erstellen), laden Sie die 3 Quelldateien herunter und extrahieren Sie die Dateien mit 'dpkg-source -x [fine] .dsc' und wenden Sie die an Unterschiede vor dpkg-buildpackage. ( ftp.debian.org/debian/doc/source-unpack.txt )
Shlomi Loubaton
Hat sudo apt-get build-dep <package>installieren die Abhängigkeiten als Binärdateien? In diesem Fall handelt es sich nicht um eine vollständige Erstellung aus dem Quellcode. Wie macht man Build-Dep-Installationsabhängigkeiten von der Quelle?
Hallo Welt
21

Im Allgemeinen können Sie die Quelle eines installierten Pakets wie folgt abrufen:

  1. Aktivieren Sie die Quellrepositorys. Öffnen Sie das Dashboard (Schaltfläche oben links) und suchen Sie nach sources. Das sollte das Software & UpdatesProgramm aufrufen, ausführen und sicherstellen, dass die Option "Quellcode" ausgewählt ist:

    Bildbeschreibung hier eingeben

  2. Öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus:

    apt-get source vlc
    

Dadurch werden die Quellen von vlc in Ihr aktuelles Verzeichnis heruntergeladen, und Sie können sie nach Belieben anzeigen.

Natürlich vlckönnen Sie sie auch direkt von der videolan.org-Website herunterladen: https://www.videolan.org/vlc/download-sources.html

terdon
quelle
1
Sie sollten sudo nicht mit 'apt-get source' verwenden müssen
Squidly
@ MrBones Argh! Nein, natürlich nicht, Kraft der Gewohnheit. Vielen Dank für den Hinweis.
terdon
im Terminal: software-properties-gtk <---, das das GUI-Panel "Software & Updates" startet. (Es wurde aus irgendeinem Grund nicht in der Dashboard-Suche für mich
angezeigt
17

Sie können apt-get source --compiledirekt verwenden:

sudo apt-get build-dep <package>
sudo apt-get source --compile <package>

Hat für mich gearbeitet. Die .deb-Datei wird in dem Verzeichnis gespeichert, in dem Sie den Befehl ausgeführt haben.

kaleissin
quelle
9
Hat auch für mich funktioniert, danke. Nur ein zusätzliches Detail: Sie können die .deb mitsudo dpkg -i <package>.deb
waldyrious 23.11.13
Die beste Lösung, außer dass apt auf die Repository-Version zurückgreift, da Sie vergessen haben, das Changelog mit "dch -i" zu dokumentieren.
Futal
3

Weitere Informationen zu einem Paket, einschließlich der Upstream-URL und der Projekt- / Programmkontakte, finden Sie in der Copyright-Datei (auf die unter packages.debian.org verwiesen wird ).

Wenn das Paket enthalten und auf Ihrem System installiert ist, können Sie die Copyright-Datei auch direkt unter lesen /usr/share/doc/$package_or_program_name/copyright.

Sehen Sie, wie Sie den Quellcode des Debian-Pakets herunterladen können? .

ypid
quelle
2

Minimales Beispiel mit dem helloPaket

All dies und mehr finden Sie unter: https://www.debian.org/doc/manuals/maint-guide/build.en.html

Lassen Sie uns zuerst ein Beispielpaket zum Ändern der Quelle für Folgendes erhalten:

sudo apt-get install hello
hello

Ausgänge:

Hello, world!

Jetzt lass es uns hacken. Holen Sie sich die Quelle:

apt-get source hello
cd hello-*

und offen:

vim src/hello.c

und ändern Sie die Nachricht zu:

Hello, world hacked!

Machen Sie dasselbe beim Test, sonst schlägt der nervige Test fehl:

vim tests/greeting-1

Dann wieder aufbauen mit:

sudo apt-get install devscripts
sudo apt-get build-dep hello
debuild -b -uc -us

Gegen Ende der Ausgabe heißt es:

dpkg-deb: building package 'hello' in '../hello_2.10-1build1_amd64.deb'.

Also erstellte es die .deb im übergeordneten Verzeichnis, wie kann ich es wagen. Als letztes installieren und testen wir das modifizierte Paket:

sudo dpkg -i ../hello_2.10-1build1_amd64.deb
hello

und los geht's, es gibt die neue Nachricht aus:

Hello, world hacked!

Getestet unter Ubuntu 18.04.

Alte bzrAntwort

TODO: Auf Ubuntu 16.04 Xenial funktionierte dies nicht mehr bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/hello/".. bzr branch lp:ubuntu/wily/hellofunktioniert und bzr branch lp:ubuntu/xenial/hellofällt wieder aus. Aus irgendeinem Grund zeigt https://code.launchpad.net/ubuntu/+source/hello Xenial nicht an: https://web.archive.org/save/https://code.launchpad.net/ubuntu/+source /Hallo

Wie unter https://askubuntu.com/a/81889/52975 erwähnt, gibt es auch einen Ubuntu-spezifischen Ansatz mit bzr.

Die neueste Version bekommen:

bzr branch lp:ubuntu/hello

Spezifische Version:

bzr branch lp:ubuntu/trusty/hello

Sie können auch verwenden pull-lp-source:

sudo apt-get install ubuntu-dev-tools
pull-lp-source hello

Dann können Sie es bearbeiten:

cd hello
vim some_file

Erstellen Sie es neu:

dch -i 
debcommit
bzr bd -- -b -us -uc

Und installiere es:

sudo dpkg -i ../hello.deb

Der Ubuntu-Verpackungsleitfaden ist eine gute Informationsquelle.

Ciro Santilli ist ein Schauspieler
quelle
bzr branch lp:ubuntu/hello bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/hello/". bzr branch lp:ubuntu/xenial/lightdm bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/xenial/lightdm/". Ubuntu-Verpackungshandbuch , insbesondere 4.2. Immer die Quelle sagt: bzr branch ubuntu:lightdm lightdm.quickswitch bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/lightdm/". Was für ein Durcheinander. :-(
Stéphane Gourichon
Wird pull-lp-sourcestattdessen verwendet, aber dann erhalten wir kein bzr-Repository. bzr bd -- -b -us -ucsagt bzr: ERROR: Not a branch: "/org/gourichon/localdata/SG/projects/sysadmin/sysadmin_ergozel/2016/2016-08-15/blouarp/lightdm-1.18.3/".: - / Danke für jeden Hinweis.
Stéphane Gourichon
@ StéphaneGourichon hummm, ich reproduziere dich auf Ubuntu 16.04 Xenial. Hinzufügen der spezifischen Version funktioniert:, bzr lp:ubuntu/wily/helloaber aus irgendeinem Grund gibt es keine xenialVersion? Und keiner zeigt auf: code.launchpad.net/ubuntu/+source/hello Go figure.
Ciro Santilli新疆改造中心法轮功六四事件
1
Vielen Dank, dass Sie sich um die Reproduktion gekümmert haben. Irgendwie hat er dann die falsche Karte ausgewählt. Eröffnet bugs.launchpad.net/ubuntu/+source/bzr/+bug/1614053 diese Seite zu erwähnen.
Stéphane Gourichon
1
Bequemer als einige der anderen Ansätze. Und danke für die anderen Insider-Tipps :)
Nealmcb