Después de algo de investigación inspirado en la respuesta de thiton, y un montón de prueba y error, finalmente encontré una solución a mi problema. Resulta que dpkg-gencontrol no es la herramienta para inferir dependencias de paquetes de ejecutables, dpkg-shlibdeps es. Sin embargo, las cosas deben configurarse cuidadosamente para que los dos programas ayuden a generar un paquete. Sigue leyendo ....
Correr dpkg-shlibdeps -O <executable>
resultados en una lista de los paquetes y versiones que necesita ser instalado para ese ejecutable para funcionar. Perfecto. Casi. Idealmente, dpkg-gencontrol podría usar esto en su procesamiento, que afirma ser capaz de hacer a través de su función de sustitución de variables.
Para hacer esto sin problemas, tuve que crear una estructura de directorios que coincide con la expectativa de las herramientas de los paquetes de Debian. Se ve básicamente como esto:
my_project_directory/
main.c (or other source code, etc.)
debian/
changelog (created by hand; see below)
control (this is basically a template, created by hand; see below)
files (created by dpkg-gencontrol)
substvars (created by dpkg-shlibdeps and used by dpkg-gencontrol)
tmp/ (tmp is the root of the target system's filesystem)
path/
to/
my/
project/
executable_1 (this will be installed at /path/to/my/project)
executable_2 (this, too)
var/
www/
index.php (this will be installed at /var/www on target systems)
DEBIAN/ (create this by hand)
control (created by dpkg-gencontrol and used in the final package)
Tenga en cuenta que las herramientas de los paquetes de Debian conservan el propietario y el grupo de todos los archivos en el directorio debian/tmp /. Por lo tanto, si quiere archivos propiedad de root o de otro usuario cuando está instalado, las cosas se vuelven complicadas. Una opción es preparar el árbol de directorios de Debian como raíz y configurar los propietarios como lo desee. Si prefiere no ejecutar como root, o no está permitido, hay otra forma.
Cree una secuencia de comandos que invoca chown, etc. para ajustar las propiedades como lo desee, con la última línea dpkg-deb -b debian/tmp .
(que crea el paquete .deb, vea a continuación un ejemplo). Ejecútelo a través de fakeroot, otra herramienta de Debian, como esta: fakeroot ./fix_ownerships_and_build.sh
. Fakeroot permite que los programas se comporten como si fueran root, sin cambiar realmente las cosas como lo haría root. Fue creado solo para este escenario.
Miré por qué dpkg-gencontrol generaba el error "primer bloque carece de un campo de origen", incluso llegando a leer su fuente Perl. Como sucede a menudo, el código de error es preciso sin proporcionar suficiente contexto para saber qué hacer: el archivo de control realmente necesita un campo llamado "fuente", en su primer (de dos) bloques.
Hay dos tipos de paquetes Debian, fuente y binario. Pensé que necesitaba uno binario ya que solo quiero poner ejecutables compilados en él, pero no pude lograr que funcionara. Probé un paquete fuente y agregué un campo fuente a mi archivo de control. Esto eliminó el error de "primer bloque no tiene campo de origen", pero condujo a otro. Al leer la documentación más de cerca, me di cuenta de que los paquetes fuente need two "paragraphs" en sus archivos de control. Una vez que he cambiado de archivo de control para parecerse a esto, se comenzó a trabajar (casi):
Source: my-package
Maintainer: Joe Coder <[email protected]>
Package: my-package
Priority: optional
Architecture: amd64
Depends: ${shlibs:Depends}, apache2, php5
Description: The My-Package System
A longer description that runs to the end of one line and then
extends to another line.
Lo que todavía faltaba era un fichero de cambios. Este es un archivo para mantener un historial de versiones de un paquete, con cambios significativos, números de versión, fechas y personas responsables. Normalmente mantengo tal cosa en mi propio formato, que cuidadosamente convertí al riguroso formato de registro de cambios de Debian. Por alguna razón, el registro de cambios fue omitido en el paquete final, por lo que salió de mi archivo de la historia solo y utiliza un marcador de posición en su lugar, con la apariencia siguiente:
my-package (1.0) unstable; urgency=low
* placeholder changelog to satisfy dpkg-gencontrol
-- Joe Coder <[email protected]> Thu, 3 Nov 2011 16:49:00 -0700
Los dos espacios a la izquierda en la línea con el * son esenciales , al igual que el espacio líder único en la línea con el -, como son los dos espacios entre la dirección de correo electrónico y la fecha. Y sí, la fecha debe ser precisa, zona horaria y todo, a pesar de que no necesita ser precisa.
Poniendo todo junto, con un árbol de directorio debian configurar como se describe anteriormente, la secuencia de comandos necesarios para construir un paquete son los siguientes:
dpkg-shlibdeps debian/tmp/path/to/my/project/executable_1 \
debian/tmp/path/to/my/project/executable_2
dpkg-gencontrol -v1.1 (or whatever version you are building)
fakeroot ./fix_ownerships_and_build.sh
donde fix_ownerships_and_build.sh se ve así:
chown -R root:root debian/tmp/path (or whatever user is appropriate)
chown -R www-data:www-data debian/tmp/var/www/* (same goes here)
dpkg-deb -b debian/tmp . (this leads to a nice my-package_1.1_amd64.deb file)
Eso es todo. Espero que esta respuesta ayude a otros a progresar más rápido que yo.
Buen trabajo, pero reprogramó una buena parte de dpkg-buildpackage. Usted está al tanto de esa herramienta, ¿verdad? – thiton
Algo. Hay docenas de herramientas relacionadas con dpkg, y estaba interesado en mantener las cosas simples. Las herramientas de Debian también parecían tan enfocadas en crear paquetes desde fuentes originales para su distribución con Debian, lo cual no es exactamente lo que estaba tratando de hacer. Empecé construyendo un árbol de directorios simple, un archivo de control mínimo y una única llamada a 'dpkg-deb -b'. Estaba tratando de encontrar las adiciones mínimas a esa base para conseguir lo que quería. De alguna manera creció. :) Buscaré en dpkg-buildpackage. La reinvención de la rueda es a menudo una gran parte de aprender cosas. –