Como obtenho e modifico o código fonte dos pacotes instalados através do apt-get?

163

Estou assumindo que todos os aplicativos instalados por apt-getmeio de código aberto; mas para aqueles que estão disponíveis dessa maneira, onde posso obter o código-fonte desses aplicativos e atualizá-los?

Tenho algumas aplicações que uso regularmente que não estão mais sendo ativamente desenvolvidas e gostaria de adicionar recursos. Onde eu iria obter os direitos para atualizar esses aplicativos?

Neste caso especificamente, estou me referindo ao pacote hellanzb

myusuf3
fonte
7
apt-gettambém suporta programas de código fechado, portanto, sua suposição inicial está incorreta.
Flimm

Respostas:

183

Use o comando apt-get source <package>(não use o sudo) para baixar a fonte de um pacote.

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

Para criar um pacote a partir da fonte, primeiro instale as dependências de compilação:

sudo apt-get build-dep <package>  

Em seguida, use dpkg-buildpackagepara criar um .debarquivo. Da folha de referência rápida do APT e do Dpkg :

dpkg-buildpackage Cria um pacote Debian a partir de uma árvore de fontes Debian. Você deve estar no diretório principal da árvore de origem para que isso funcione. Uso da amostra:

 dpkg-buildpackage -rfakeroot -uc -b

Onde o -rfakerootinstrui a usar o programa fakeroot para simular privilégios de root (para fins de propriedade), -ucsignifica "Não assinar criptograficamente o log de alterações" e -bsignifica "Construir apenas o pacote binário"

Em um terminal, cdno diretório que contém a origem do pacote (por exemplo ~/code/hellanzb-0.13) e execute o seguinte comando:

dpkg-buildpackage -rfakeroot -uc -b

Se a compilação for bem-sucedida, haverá um .debarquivo localizado no
diretório pai (por exemplo ~/code/hellanzb_0.13-6.1_all.deb).

Isaías
fonte
como posso instalar a partir da fonte modificada. bem como enviá-lo de volta para outros usuários. Obrigado!
myusuf3
1
@dustyprogrammer Atualizei minha resposta com instruções sobre como criar um .debpacote a partir do código-fonte. Quanto a colocar seu pacote modificado nos repositórios, você deve conversar com um MOTU sobre isso.
Isaiah
O @DoR existe uma maneira de criar uma deb que é instalada por padrão em um diretório personalizado? da mesma maneira que podemos instalar usando o --prefix durante o processo de configuração? na verdade, não consigo encontrar os tarballs para a fonte de uma biblioteca, é por isso que não consigo configurar --prefix e instalá-la .. mas essa fonte do pakages está disponível através do apt, então eu estava pensando em instalar o pacote de origem no prefixo desejado .
ashishsony
2
Se você não quiser usar o apt-get source (por exemplo, ao criar um pacote retirado de outra distribuição), baixe os 3 arquivos de origem e use 'dpkg-source -x [fine] .dsc' para extrair os arquivos e aplicar o diffs antes do dpkg-buildpackage. ( ftp.debian.org/debian/doc/source-unpack.txt )
Shlomi Loubaton
Será que sudo apt-get build-dep <package>instalar as dependências como binários? Nesse caso, essa não é uma compilação completa da fonte. Como alguém faz build-dep instalar dependências da fonte?
Olá Mundo
21

Em geral, você pode obter a fonte de um pacote instalado seguindo este procedimento:

  1. Ative os repositórios de origem. Abra o painel (botão superior esquerdo) e procure sources. Isso deve abrir o Software & Updatesprograma, execute-o e verifique se a opção "Código-fonte" está selecionada:

    insira a descrição da imagem aqui

  2. Abra um terminal e execute este comando:

    apt-get source vlc
    

Isso fará o download das fontes do vlc no diretório atual e você poderá visualizá-las quando quiser.

Obviamente, no caso de vlc, você também pode baixá-los diretamente do site videolan.org: https://www.videolan.org/vlc/download-sources.html

terdon
fonte
1
Você não deve precisar de usar sudo com 'fonte apt-get'
squidly
@MrBones argh! Não, claro que não, força do hábito. Obrigado por apontar isso.
terdon
no terminal: software-properties-gtk <--- que iniciará o painel da GUI "Software & Updates". (Ele não apareceu na busca dashboard para mim por alguma razão.)
pestophagous
17

Você pode usar apt-get source --compilediretamente:

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

Trabalhou para mim. O .deb acaba no diretório do qual você executou o comando.

kaleissin
fonte
9
Trabalhou para mim também, obrigado. Apenas um detalhe extra: você pode instalar o .deb comsudo dpkg -i <package>.deb
waldyrious
A melhor solução, exceto que o apt, reverterá para a versão do repositório, porque você esqueceu de documentar o registro de alterações com "dch -i".
Futal 24/08/16
2

Exemplo mínimo com o hellopacote

Tudo isso e muito mais estão descritos em: https://www.debian.org/doc/manuals/maint-guide/build.en.html

Primeiro, vamos obter um pacote de amostra para modificar a fonte:

sudo apt-get install hello
hello

saídas:

Hello, world!

Agora vamos cortar isso. Obtenha a fonte:

apt-get source hello
cd hello-*

e aberto:

vim src/hello.c

e modifique a mensagem para:

Hello, world hacked!

Faça o mesmo no teste, caso contrário, o teste irritante começará a falhar:

vim tests/greeting-1

Em seguida, reconstrua com:

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

Perto do final da saída, diz:

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

por isso, criou o .deb no diretório pai, como ousa. Finalmente, instalamos e testamos o pacote modificado:

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

e pronto, ele gera a nova mensagem:

Hello, world hacked!

Testado no Ubuntu 18.04.

bzrResposta antiga

TODO: isto parou de funcionar no Ubuntu 16.04 hospitaleiro, falhando com: bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/hello/".. bzr branch lp:ubuntu/wily/hellofunciona e bzr branch lp:ubuntu/xenial/hellofalha novamente. Por alguma razão, https://code.launchpad.net/ubuntu/+source/hello não mostra o Xenial: https://web.archive.org/save/https://code.launchpad.net/ubuntu/+source /Olá

Como mencionado em https://askubuntu.com/a/81889/52975 , também há uma abordagem específica do Ubuntu bzr.

Obtenha a última versão:

bzr branch lp:ubuntu/hello

Versão específica:

bzr branch lp:ubuntu/trusty/hello

Você também pode usar pull-lp-source:

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

Então você poderá editá-lo:

cd hello
vim some_file

Reconstrua-o:

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

E instale-o:

sudo dpkg -i ../hello.deb

O guia de pacotes do Ubuntu é uma boa fonte de informações.

Ciro Santilli adicionou uma nova foto
fonte
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/". Guia de empacotamento do Ubuntu , especificamente 4.2. Obtendo a fonte diz: bzr branch ubuntu:lightdm lightdm.quickswitch bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/lightdm/". Que bagunça. :-(
Stéphane Gourichon
Usado em pull-lp-sourcevez disso, mas não obtemos um repositório bzr. bzr bd -- -b -us -ucdiz bzr: ERROR: Not a branch: "/org/gourichon/localdata/SG/projects/sysadmin/sysadmin_ergozel/2016/2016-08-15/blouarp/lightdm-1.18.3/".: - / Obrigado por qualquer dica.
Stéphane Gourichon
@ StéphaneGourichon hummm, eu o reproduzo no Ubuntu 16.04 Xenial. Adicionar a versão específica funciona:, bzr lp:ubuntu/wily/hellomas por algum motivo não há xenialversão? E nenhum aparece em: code.launchpad.net/ubuntu/+source/hello Go figure.
Ciro Santilli escreveu
1
Obrigado por cuidar de se reproduzir. Tipo que pegou o cartão errado, então. Bugs.launchpad.net/ubuntu/+source/bzr/+bug/1614053 aberto mencionando esta página.
Stéphane Gourichon 17/08/16
1
Mais conveniente do que algumas das outras abordagens. E graças para as outras dicas :)
nealmcb