2011-11-04 14 views
7

La mayoría de los campos en un archivo de control dpkg (Debian) son sencillos. El truco es determinar la lista de dependencias (Depende :). Esperaba que dpkg-gencontrol pudiera hacer esto por mí mirando el resultado ldd para los ejecutables en el directorio del paquete. Quizás sí, pero no puedo hacer que funcione.¿Hay alguna manera de determinar automáticamente las dependencias al configurar un archivo de control dpkg?

Si esto es lo que es para dpkg-gencontrol, el error que estoy consiguiendo es:

dpkg-gencontrol: error: syntax error in control_template at line 7: first block lacks a source field. 

Como referencia, el comando es dpkg-gencontrol -v1.1 -ccontrol_template -lchangelog -Pdebian. El archivo contiene control_template esto:

Package: my-package 
Maintainer: Joe Coder <[email protected]> 
Description: The my-package system 
A longer description that runs to the end of one line and then 
extends to another line. 
Priority: optional 

Si esto no es lo que es para dpkg-gencontrol, ¿alguien tiene alguna sugerencia en cuanto a lo que puedo hacer, o consejos sobre cómo configurar la lista de dependencias, a ser posible de forma automática?

Es cierto que inferir las dependencias de una manera general es probablemente un problema muy difícil, especialmente si se amplía la búsqueda de secuencias de comandos y otros programas. Espero que existan algunas herramientas que funcionen la mayor parte del tiempo.

Tenga en cuenta que esto es sólo para distribución interna. No estoy creando un paquete para entrar en una distribución de Linux o incluso para ser descargado por el público en general, por lo que estoy feliz de doblar/romper las reglas estándar si es necesario.

Respuesta

10

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.

+0

Buen trabajo, pero reprogramó una buena parte de dpkg-buildpackage. Usted está al tanto de esa herramienta, ¿verdad? – thiton

+0

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

1

En realidad, mirar la lista de bibliotecas incluidas es bastante común para los programas C y simplemente para el trabajo de shlibs helper (dpkg-shlibdeps). Mire su página de manual para obtener ayuda, pero básicamente se reduce a usar ${shlibs:Depends} en su línea depende.

+0

Esta fue la clave que me ayudó a encontrar una solución. Gracias, Thilton. Y como referencia, no fue dh_shlibdeps lo que ayudó, sino dpkg-shlibdeps. –

+0

@randallecook: Gracias por la pista, editada en consecuencia. – thiton

Cuestiones relacionadas