¿Cómo obtengo y modifico el código fuente de los paquetes instalados a través de apt-get?

163

Supongo que todas las aplicaciones instaladas a través de apt-getcódigo abierto; pero para aquellos que están disponibles de esa manera, ¿dónde puedo obtener el código fuente de estas aplicaciones y actualizarlas?

Tengo un par de aplicaciones que uso regularmente que ya no se desarrollan activamente y me gustaría agregar funciones. ¿A dónde iría para obtener los derechos para actualizar estas aplicaciones?

En este caso específicamente, me estoy refiriendo al paquete hellanzb

myusuf3
fuente
77
apt-gettambién admite programas de código cerrado, por lo que su suposición inicial es incorrecta.
Flimm

Respuestas:

183

Use el comando apt-get source <package>(no use sudo con él) para descargar la fuente de un paquete.

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 compilar un paquete desde el origen, primero instale las dependencias de compilación:

sudo apt-get build-dep <package>  

Luego, use dpkg-buildpackagepara crear un .debarchivo. De APT y Dpkg Hoja de referencia rápida :

dpkg-buildpackage Crea un paquete Debian desde un árbol fuente de Debian. Debe estar en el directorio principal del árbol de origen para que esto funcione. Uso de la muestra:

 dpkg-buildpackage -rfakeroot -uc -b

Donde le -rfakerootindica que use el programa fakeroot para simular privilegios de root (para fines de propiedad), -ucsignifica "No firmar criptográficamente el registro de cambios" y -bsignifica "Construir solo el paquete binario"

En una terminal, cdingrese al directorio que contiene la fuente del paquete (por ejemplo ~/code/hellanzb-0.13) y ejecute el siguiente comando:

dpkg-buildpackage -rfakeroot -uc -b

Si la compilación es exitosa, habrá un .debarchivo ubicado en el
directorio principal (por ejemplo ~/code/hellanzb_0.13-6.1_all.deb).

Isaias
fuente
¿Cómo puedo instalar desde la fuente modificada? así como confirmarlo para que otros usuarios lo utilicen. ¡Gracias!
myusuf3
1
@dustyprogrammer Actualicé mi respuesta con instrucciones sobre cómo crear un .debpaquete a partir del código fuente. En cuanto a llevar su paquete modificado a los repositorios, debe hablar con una MOTU al respecto.
Isaías
@DoR ¿hay alguna manera de crear una deb que se instale por defecto en un directorio personalizado? de la misma manera que podemos instalar usando --prefix durante el proceso de configuración? en realidad no puedo encontrar los tarballs para la fuente de una biblioteca, es por eso que no puedo configurar --prefix, y hacer que lo instale .. pero esa fuente de paquetes está disponible a través de apt, así que estaba pensando en instalar el paquete fuente en el prefijo deseado .
ashishsony
2
Si no desea usar apt-get source (por ejemplo, cuando crea un paquete tomado de otra distribución) descargue los 3 archivos fuente y use 'dpkg-source -x [fine] .dsc' para extraer los archivos y aplicar el diffs antes de dpkg-buildpackage. ( ftp.debian.org/debian/doc/source-unpack.txt )
Shlomi Loubaton el
¿ sudo apt-get build-dep <package>Instala las dependencias como binarios? Si es así, esta no es una compilación completa desde la fuente. ¿Cómo se hacen las dependencias de instalación de build-dep desde la fuente?
Hola Mundo
21

En general, puede obtener el origen de un paquete instalado siguiendo este procedimiento:

  1. Habilite los repositorios de origen. Abra el panel de control (botón superior izquierdo) y busque sources. Eso debería abrir el Software & Updatesprograma, ejecutarlo y asegurarse de tener seleccionada la opción "Código fuente":

    ingrese la descripción de la imagen aquí

  2. Abra una terminal y ejecute este comando:

    apt-get source vlc
    

Eso descargará las fuentes de vlc a su directorio actual y podrá verlas cuando lo desee.

Por supuesto, en el caso de vlc, también puede descargarlos directamente del sitio web videolan.org: https://www.videolan.org/vlc/download-sources.html

terdon
fuente
1
No debería necesitar usar sudo con 'apt-get source'
Squidly
@MrBones argh! No, por supuesto que no, fuerza de hábito. Gracias por mencionarlo.
terdon
en el terminal: software-properties-gtk <--- que lanzará el panel de la GUI "Software & Updates". (No apareció en el tablero de búsqueda para mí por cualquier razón.)
molesto
17

Puedes usar apt-get source --compiledirectamente:

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

Trabajó para mi. El .deb termina en el directorio desde el que ejecutó el comando.

kaleissin
fuente
99
También funcionó para mí, gracias. Solo un detalle adicional: puede instalar el .deb consudo dpkg -i <package>.deb
waldyrious
La mejor solución, excepto que apt volverá a la versión del repositorio porque olvidó documentar el registro de cambios con "dch -i".
Futal
2

Ejemplo mínimo con el hellopaquete

Todo esto y más se describe en: https://www.debian.org/doc/manuals/maint-guide/build.en.html

Primero obtengamos un paquete de muestra para modificar la fuente de:

sudo apt-get install hello
hello

salidas:

Hello, world!

Ahora hackéelo. Obtén la fuente:

apt-get source hello
cd hello-*

y abierto:

vim src/hello.c

y modifique el mensaje para:

Hello, world hacked!

Luego haga lo mismo en la prueba; de lo contrario, la prueba molesta comenzará a fallar:

vim tests/greeting-1

Luego reconstruir con:

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

Cerca del final de la salida, dice:

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

así que creó el .deb en el directorio padre, ¿cómo se atreve? Así que finalmente instalamos y probamos el paquete modificado:

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

y ahí lo tienes, emite el nuevo mensaje:

Hello, world hacked!

Probado en Ubuntu 18.04.

Vieja bzrrespuesta

TODO: este dejó de funcionar en Ubuntu 16.04 Xenial, en su defecto con: bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/hello/".. bzr branch lp:ubuntu/wily/hellofunciona y bzr branch lp:ubuntu/xenial/hellofalla nuevamente. Por alguna razón, https://code.launchpad.net/ubuntu/+source/hello no muestra Xenial: https://web.archive.org/save/https://code.launchpad.net/ubuntu/+source /Hola

Como se menciona en https://askubuntu.com/a/81889/52975, también existe un enfoque específico de Ubuntu bzr.

Consigue la versión más reciente:

bzr branch lp:ubuntu/hello

Versión especifica:

bzr branch lp:ubuntu/trusty/hello

También puedes usar pull-lp-source:

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

Entonces podrás editarlo:

cd hello
vim some_file

Reconstruirlo:

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

E instalarlo:

sudo dpkg -i ../hello.deb

La guía de empaquetado de Ubuntu es una buena fuente de información.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
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/". Guía de empaquetado de Ubuntu , específicamente 4.2. Obtener la fuente dice: bzr branch ubuntu:lightdm lightdm.quickswitch bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/lightdm/". Qué desastre. :-(
Stéphane Gourichon
Se usa en su pull-lp-sourcelugar, pero luego no obtenemos un repositorio 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/".: - / Gracias por cualquier pista.
Stéphane Gourichon
@ StéphaneGourichon hummm, te reproduzco en Ubuntu 16.04 Xenial. Agregar la versión específica funciona: ¿ bzr lp:ubuntu/wily/hellopero por alguna razón no hay xenialversión? Y ninguno se muestra en: code.launchpad.net/ubuntu/+source/hello Go figure.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
Gracias por cuidar la reproducción. Algo así como la carta equivocada, entonces. Abrió bugs.launchpad.net/ubuntu/+source/bzr/+bug/1614053 mencionando esta página.
Stéphane Gourichon
1
Más conveniente que algunos de los otros enfoques. Y gracias por los otros consejos
internos