¿Cómo construir un paquete Debian / Ubuntu desde la fuente?

116

Tengo la fuente de un programa (tomado de cvs / svn / git / ...) y me gustaría construir un paquete Debian / Ubuntu para él. El paquete está presente en los repositorios, pero:

  • Es una versión anterior (sin las funciones que necesito)
  • Necesito opciones de compilación ligeramente diferentes a las predeterminadas.

¿Cuál es la forma más sencilla de hacerlo? Me preocupan un par de cosas

  • ¿Cómo puedo comprobar si he enumerado todas las dependencias correctamente? (Puedo obtener algunas sugerencias al ver de qué dependía la versión anterior, pero es posible que se hayan agregado nuevas dependencias).
  • ¿Cómo puedo evitar que el sistema de actualización instale la versión anterior en el repositorio en una actualización?
  • ¿Cómo puedo evitar que el sistema instale una versión más nueva (cuando esté disponible), sobrescribiendo mi paquete personalizado?
Ryszard Szopa
fuente
Similar en AU: askubuntu.com/questions/28372/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

78

puede usar el paquete especial "checkinstall" para todos los paquetes que aún no están en debian / ubuntu.

Puede usar "uupdate" ( apt-get install devscripts) para construir un paquete desde la fuente con las fuentes debian existentes:

Ejemplo de 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
fuente
¡Gracias! Acabo de usar esto para portar Subversion 1.6.6 a una instalación de Ubuntu que solo tiene 1.6.5 como su última versión disponible, y funcionó a la perfección. ¡Me ahorró bastantes horas de retoques! :)
Carlos Villela
¿Podrías dar un poco más de contexto sobre estos comandos? ¿Dónde está libdrm-2.3.1exactamente? También de dónde libdrm-2.4.1.tar.gzvino (mi suposición inicial es que es el binario compilado de la aplicación que queremos empaquetar en un deb, pero reemplazando la versión existente, ¿es correcto?)
wheeler
Si recibe el error You must put some 'source' URIs in your sources.list, elimine el comentario de las líneas deb-src en su/etc/apt/sources.list
Christian
27

Primero, la pregunta del título: Asumiendo que el directorio debian ya está allí, esté en el directorio fuente (el directorio que contiene el directorio debian) e invoque dpkg-buildpackage. Me gusta ejecutarlo con estas opciones:

dpkg-buildpackage -us -uc -nc

lo que significa que no firme el resultado y no limpie.

¿Cómo puedo comprobar si he enumerado todas las dependencias correctamente?

Obtener las dependencias es un arte negro. La forma "oficial" es comprobar que la compilación depende si el paquete se compila solo con el sistema base, los paquetes "esenciales para la compilación" y las dependencias de compilación que ha especificado. No conozco una respuesta general para las dependencias regulares, solo ingrese :)

¿Cómo puedo evitar que el sistema de actualización instale la versión anterior en el repositorio en una actualización? ¿Cómo puedo evitar que el sistema instale una versión más nueva (cuando esté disponible), sobrescribiendo mi paquete personalizado?

Mi conocimiento puede estar desactualizado en este caso, pero para abordar ambos: use dpkg --set-selections. Suponiendo que nullidentd era el paquete que deseaba quedarse, ejecútelo como root

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

Alternativamente, dado que está construyendo desde la fuente, puede usar una época para establecer el número de versión artificialmente alto y nunca más lo molestará. Para usar una época, agregue una nueva entrada al archivo debian / changelog y coloque un 99: delante del número de versión. Dado mi ejemplo nullidentd, la primera línea de su registro de cambios actualizado leería:

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

El enlace de Bernard es bueno, especialmente si tiene que crear el directorio debian usted mismo; también son útiles la referencia para desarrolladores y la página de recursos generales . El enlace de Adam también se ve bien, pero no estoy familiarizado con él.

Daniel Bungert
fuente
1
"dpkg --set-selections" todavía funciona, pero un método mejor en estos días sería "aptitude hold nullidentd".
Mark Baker
6

Para lo que quiera hacer, probablemente quiera usar la fuente diff de debian, por lo que su paquete es similar al oficial, aparte de la versión anterior utilizada. Puede descargar el diff de origen de packages.debian.org , o puede obtenerlo junto con el archivo .dsc y el archivo de origen original usando "apt-get source".

Luego descomprime tu nueva versión de la fuente original, cambia a ese directorio y aplica la diferencia que descargaste haciendo

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

Luego, realice los cambios que deseaba para compilar las opciones y compile el paquete haciendo

dpkg-buildpackage -rfakeroot -us -uc
Mark Baker
fuente
3
  • ponga el directorio "debian" del paquete original en su directorio fuente
  • utilizar " dch " para actualizar la versión del paquete
  • use "debuild" para construir el paquete
zowers
fuente
2

Yo creo esto es el paquete Debian 'bible'.

Bueno, es la guía para nuevos mantenedores de Debian, por lo que gran parte de ella no se aplicará, pero cubren lo que va a donde ir.

Bernardo
fuente
1

Aquí hay un tutorial para construir un paquete Debian.

Básicamente, necesitas:

  1. Configura la estructura de tu carpeta
  2. Crea un archivo de control
  3. Opcionalmente, cree scripts postinst o prerm
  4. Ejecute dpkg-deb

Por lo general, hago todo esto en mi Makefile, así que puedo escribir make para escupir el binario y empaquetarlo de una vez.

Adam Pierce
fuente
1

¿Cómo puedo comprobar si he enumerado todas las dependencias correctamente?

El pbuilderes una excelente herramienta para el control de ambas dependencias de construcción y dependencias mediante la creación de un sistema de base limpia dentro de un entorno chroot. Al compilar el paquete dentro de pbuilder, puede verificar fácilmente las dependencias de compilación y, al probarlo dentro de un entorno de pbuilder, puede verificar las dependencias.

thiton
fuente
1

Si desea una forma rápida y sucia de instalar las dependencias de compilación, use:

apt-get build-dep

Esto instala las dependencias. Necesita líneas de fuentes en su sources.list para esto:

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

Si está transfiriendo paquetes de prueba a estable, tenga en cuenta que las dependencias pueden haber cambiado. El comando apt-get build-deb instala las dependencias para los paquetes fuente en su repositorio actual.

Pero, por supuesto, dpkg-buildpackage -us -uc le mostrará las dependencias desinstaladas.

Si desea compilar con más frecuencia, use cowbuilder.

apt-get install cowbuilder

Luego crea un área de construcción:

sudo DIST = squeeze ARCH = amd64 cowbuilder --crear

Luego compile un paquete fuente:

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

Observe dónde pone cowbuilder el paquete resultante.

¡Buena suerte!

Allard Hoeve
fuente