Come posso ottenere e modificare il codice sorgente dei pacchetti installati tramite apt-get?


163

Presumo che tutte le applicazioni installate tramite apt-getsiano open source; ma per quelli disponibili in quel modo, dove posso ottenere il codice sorgente per queste applicazioni e aggiornarle?

Ho un paio di applicazioni che utilizzo regolarmente che non vengono più sviluppate attivamente e vorrei aggiungere funzionalità. Dove andrei per ottenere i diritti per aggiornare queste applicazioni?

In questo caso, in particolare, mi riferisco al pacchetto hellanzb


7
apt-getsupporta anche programmi a sorgente chiuso, quindi il tuo presupposto iniziale non è corretto.
Flimm,

Risposte:


183

Utilizzare il comando apt-get source <package>(non usare sudo con esso) per scaricare l'origine di un pacchetto.

Da 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.

Per compilare un pacchetto dall'origine, installare prima le dipendenze di compilazione:

sudo apt-get build-dep <package>  

Quindi utilizzare dpkg-buildpackageper creare un .debfile. Dal foglio di riferimento rapido APT e Dpkg :

dpkg-buildpackage Crea un pacchetto Debian da un albero dei sorgenti Debian. È necessario trovarsi nella directory principale dell'albero dei sorgenti affinché funzioni. Esempio di utilizzo:

 dpkg-buildpackage -rfakeroot -uc -b

Dove gli -rfakerootindica di utilizzare il programma fakeroot per simulare i privilegi di root (per scopi di proprietà), -ucsta per "Non firmare crittograficamente il log delle modifiche " e -bsta per "Crea solo il pacchetto binario"

In un terminale, cdnella directory contenente l'origine del pacchetto (ad es. ~/code/hellanzb-0.13) Ed eseguire il comando seguente:

dpkg-buildpackage -rfakeroot -uc -b

Se la compilazione ha esito positivo, sarà presente un .debfile nella
directory principale (ad es ~/code/hellanzb_0.13-6.1_all.deb.).


come posso installare dalla fonte modificata. oltre a ripristinarlo per essere utilizzato da altri utenti. Grazie!
myusuf3,

1
@dustyprogrammer Aggiornato la mia risposta con le istruzioni sulla creazione di un .debpacchetto dal codice sorgente. Per quanto riguarda il trasferimento del pacchetto modificato nei repository, dovresti parlarne con un MOTU .
Isaia,

@DoR c'è un modo per creare un deb che si installa di default in una directory personalizzata? allo stesso modo possiamo installare usando --prefix durante il processo di configurazione? in realtà non riesco a trovare i tarball per il sorgente di una libreria, ecco perché non riesco a configurare --prefix e farlo installarlo .. ma quel sorgente di pakages è disponibile tramite apt, quindi stavo pensando di installare il pacchetto sorgente nel prefisso desiderato .
ashishsony,

2
Se non si desidera utilizzare apt-get source (ad esempio quando si crea un pacchetto prelevato da un'altra distro), scaricare i 3 file di origine e utilizzare 'dpkg-source -x [fine] .dsc' per estrarre i file e applicare il differisce prima di dpkg-buildpackage. ( ftp.debian.org/debian/doc/source-unpack.txt )
Shlomi Loubaton

Non sudo apt-get build-dep <package>installare le dipendenze come file binari? In tal caso, questa non è una build completa dalla fonte. Come si fanno le dipendenze di installazione build-dep dall'origine?
Ciao mondo,

21

In generale, è possibile ottenere l'origine di un pacchetto installato seguendo questa procedura:

  1. Abilita i repository di origine. Apri la dashboard (pulsante in alto a sinistra) e cerca sources. Ciò dovrebbe far apparire il Software & Updatesprogramma, eseguirlo e assicurarsi di avere l'opzione "Codice sorgente" selezionata:

    inserisci qui la descrizione dell'immagine

  2. Apri un terminale ed esegui questo comando:

    apt-get source vlc
    

Ciò scaricherà le fonti di vlc nella tua directory corrente e potrai visualizzarle a tuo piacimento.

Naturalmente, nel caso in cui vlc, puoi anche scaricarli direttamente dal sito Web di videolan.org: https://www.videolan.org/vlc/download-sources.html


1
Non dovresti aver bisogno di usare sudo con 'apt-get source'
Squidly

@MrBones argh! No, certo che no, forza dell'abitudine. Grazie per segnalarlo.
terdon

nel terminale: software-properties-gtk <--- che avvierà il pannello della GUI "Software e aggiornamenti". (Non è
apparso

17

Puoi usare apt-get source --compiledirettamente:

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

Ha funzionato per me. Il .deb finisce nella directory da cui hai eseguito il comando.


9
Ha funzionato anche per me, grazie. Solo un dettaglio in più: puoi installare il .deb consudo dpkg -i <package>.deb
waldyrious il

La migliore soluzione tranne che apt tornerà alla versione del repository perché hai dimenticato di documentare il log delle modifiche con "dch -i".
Futal


2

Esempio minimo con il hellopacchetto

Tutto questo e molto altro è descritto su: https://www.debian.org/doc/manuals/maint-guide/build.en.html

Innanzitutto otteniamo un pacchetto di esempio per modificare l'origine per:

sudo apt-get install hello
hello

uscite:

Hello, world!

Ora facciamolo. Ottieni la fonte:

apt-get source hello
cd hello-*

e apri:

vim src/hello.c

e modifica il messaggio in:

Hello, world hacked!

Quindi fai lo stesso sul test, altrimenti il ​​test fastidioso inizierà a fallire:

vim tests/greeting-1

Quindi ricostruire con:

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

Verso la fine dell'output, dice:

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

così ha creato il .deb nella directory principale, come osi. Quindi finalmente installiamo e testiamo il pacchetto modificato:

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

e il gioco è fatto, emette il nuovo messaggio:

Hello, world hacked!

Testato su Ubuntu 18.04.

Vecchia bzrrisposta

TODO: questa ha smesso di funzionare su Ubuntu 16.04 Xenial, in mancanza di: bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/hello/".. bzr branch lp:ubuntu/wily/hellofunziona e bzr branch lp:ubuntu/xenial/hellofallisce di nuovo. Per qualche motivo https://code.launchpad.net/ubuntu/+source/hello non mostra Xenial: https://web.archive.org/save/https://code.launchpad.net/ubuntu/+source /Ciao

Come accennato su https://askubuntu.com/a/81889/52975, esiste anche un approccio specifico per Ubuntu bzr.

Ottieni l'ultima versione:

bzr branch lp:ubuntu/hello

Versione specifica:

bzr branch lp:ubuntu/trusty/hello

Puoi anche usare pull-lp-source:

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

Quindi sarai in grado di modificarlo:

cd hello
vim some_file

Ricostruiscilo:

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

E installalo:

sudo dpkg -i ../hello.deb

La guida al packaging di Ubuntu è una buona fonte di informazioni.


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/". Guida al packaging di Ubuntu , in particolare 4.2. Ottenere la fonte dice: bzr branch ubuntu:lightdm lightdm.quickswitch bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/lightdm/". che casino. :-(
Stéphane Gourichon,

Usato pull-lp-sourceinvece, ma non otteniamo un repository bzr. bzr bd -- -b -us -ucdice bzr: ERROR: Not a branch: "/org/gourichon/localdata/SG/projects/sysadmin/sysadmin_ergozel/2016/2016-08-15/blouarp/lightdm-1.18.3/".: - / Grazie per qualsiasi suggerimento.
Stéphane Gourichon,

@ StéphaneGourichon hummm, ti riproduco su Ubuntu 16.04 Xenial. L'aggiunta della versione specifica funziona:, bzr lp:ubuntu/wily/helloma per qualche motivo non esiste una xenialversione? E nessuno mostra su: code.launchpad.net/ubuntu/+source/hello Vai figura.
Ciro Santilli 17 改造 中心 法轮功 六四 事件

1
Grazie per la cura della riproduzione. Quindi ho scelto la carta sbagliata. Aperto bugs.launchpad.net/ubuntu/+source/bzr/+bug/1614053 citando questa pagina.
Stéphane Gourichon,

1
Più conveniente di alcuni degli altri approcci. E grazie per gli altri consigli degli
esperti
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.