Translation(s): English - Español - Italiano

(!) ?Discussion


Este tutorial está basado en el tutorial impartido en vivo por Gürkan Sengün en el canal de IRC #debian-women. Ha sido ligeramente modificado para ajustarse al estilo web y mantener los nombres de los participantes en el anonimato.

Introducción

Este tutorial está orientado a gente que nunca ha hecho un paquete debian, pero sí ha compilado por si mismo software desde las fuentes. Vamos a crear un pequeño paquete debian. Para ello necesitaremos algunas herramientas de Debian. Por favor haz:

    apt-get install build-essential devscripts dh-make

Puedes empaquetar todo aquello que sea Software Libre (que cumpla las «Directrices sobre software libre de Debian» DFSG para Debian (main). Antes de empaquetar algo para Debian, es una buena idea comprobar que nadie más lo ha hecho antes, una búsqueda rápida en Google, y luego una búsqueda para averiguar si hay un ITP. Una vez que estés seguro de que el software no está empaquetado, puedes enviar un ITP tú mismo.

Cualquiera puede trabajar en Debian. La gente que empaqueta software para Debian, puede ponerlo en red (en un servidor web). Si esa persona encuentra un patrocinador - alguien (un desarrollador Debian «Debian Developer», abreviado «DD») que compruebe y suba ese paquete a Debian)- pasa a ser un «Debian Maintainer» (DM) y aparece en: http://www.debian.org/devel/people. Cuando se sube un nuevo paquete a debian, primero aparece en la lista de espera de nuevos («Debian new queue», puedes encontrarla usando Google). Más tarde aparecerá en http://buildd.debian.org.

Obtención del software.

Este tutorial se explicará sobre el paquete wmforkplop (un pequeño dockapp, que muestra gráficamente el uso de la cpu), pero los pasos a seguir y los consejos generales se pueden aplicar a cualquier otro programa.

Puedes descargar el software usado en este tutorial desde: http://hules.free.fr/wmforkplop/.

Una buena idea cuando estás haciendo paquetes es tener un directorio llamado «debian» en tu «$HOME» (o quizá «sources/debian» o «src/debian», coges la idea), y en ese directorio descargar el código fuente de los programas originales.

Una vez que has descargado el código fuente, debes desempaquetarlo (en este caso con tar -xvfz wmforkplop-0.9.1.tar.gz). Como puedes ver, wmforkplop se desempaqueta correctamente dentro de wmforkplop-0.9.1, pero no todo el software está disponible tan correctamente, algunas veces la fastidian y se desempaqueta en el mismo directorio. Puedes echar un ojo al archivo tar haciendo tar -txvf tarfile.tar.gz, o usando mc.

Debianización

En tu «script» de entrada al sistema (.bashrc, .zshenv, etc), define las variables de entorno: export DEBEMAIL=tu@dirección_de.correo y export DEBFULLNAME="Tu nombre". Asegúrate de que has exportado esas variables antes de continuar, las usará dh_make.

Ahora es momento de moverte al nuevo directorio y ejecutar dh_make. Este programa hará unas preguntas y nos ayudará en la creación del nuevo paquete.

 Type of package: single binary, multiple binary, library, or kernel module? [s/m/l/k]

Nos está preguntando qué tipo de paquete queremos crear. Selecciona «s» para un único binario. Es el paquete habitual cuando estás empezando. Es mejor empezar por un paquete simple y luego ir haciendo paquetes más complicados cuando tengas más experiencia.

Nos mostrará alguna información más y esperará que pulsemos <enter> para confirmar, hazlo.

Preparación del paquete.

dh_make hace un trabajo estupendo ayudandonos a empezar con el paquete, pero hay aún mucho trabajo por hacer, en especial dentro del directorio debian/.

Una buena práctica es leer ahora los archivos README e INSTALL proporcionados con el paquete original. Ésto nos permitirá saber cómo se va a instalar el programa, y saber si tiene dependencias inesperadas. También, si el archivo INSTALL no es el de autotools, deberemos leerlo detalladamente para averiguar qué debemos instalar.

En el caso de wmforkplop, el README nos dice qué otro software necesitamos para poder construirlo: imlib2 y libgtop2; también hay un aviso de que el paquete original usa un tipo de letra: Vera.ttf, como este tipo de letra se proporciona con otro paquete (puedes comprobarlo usando http://packages.debian.org) tendremos una dependencia de ese paquete.

El archivo INSTALL nos dice que wmforkplop usa autotools, y por eso no es necesario tocar el «Makefile». En el caso de un software que no haga uso de autotools puedes necesitar cambiar el «Makefile» para hacerlo apropiado para Debian. Necesitas instalarlo en el directorio debian/ usando $(DESTDIR).

Ve al directorio debian/ y echa un vistazo a los diversos archivos que ha creado dh_make, pronto borraremos muchos de ellos. Algunos de ellos son archivos .ex (de ejemplo), no debes dejar ningún archivo .ex cuando termines de empaquetar.

Como nuestro software no es un demonio, podemos eliminar init.d.ex, y como no tiene nada que ver con emacs, podemos borrar también emacsen*. No necesitaremos los post*.ex ni pre*.ex. Borra también cron.d.ex, y manpage.*ml.ex (pero no manpage.1.ex, que éste sí lo usaremos). Borra también wmforkplop*, y conffile.ex ya que no hay archivos de configuración.

Como no tenemos avisos que hacer a nuestros usuarios (aún), podemos borrar también README.Debian. Despues de borrarlos te quedarán 10 archivos.

Veremos los archivos restantes en orden:

:debian/changelog:En este archivo verás el paquete, la versión-versión Debian, archivo y la urgencia, algo como wmforkplop (0.9.1-1) unstable; urgency=low. Donde 0.9.1 es la versión del programa, -1 es la revisión de Debian, unstable es el repositorio al que deberías subirlo y urgency=low establece cuánto tiempo pasará en paquete en «unstable» antes de que se intente migrar a «testing» («low» significa 10 días), normalmente usarás el valor «low», aunque «medium» y «high» también están disponibles.Nota1

Si hemos rellenado un ITP, tendremos un número de error ITP de bugs.debian.org, algo como #123456. Podemos cerrar el error al subir el paquete si ponemos (Closes: #123456) después de «* Initial Release» en el changelog.

El archivo debian/changelog puede parecer inocente pero es uno de los más importantes. Es analizado por varios robots (el 'bug bot', el 'buildd bot', etc); es el único archivo donde se establece la versión del paquete; esta es la información que se guardará con cada publicación.

:debian/control: Este archivo controla el nombre del paquete fuente, el nombre del paquete binario, en qué sección va el paquete. quién es el responsable (aquí podemos definir también co-responsables), si el paquete reemplaza a otro, sugerir y/o recomendar otras cosas y definir dependencias (tanto en fuentes como en binarios).

El nombre original (Source) sugerido es normalmente correcto, pero la sección (Section: unknown) sí que queremos cambiarla. Las posibles secciones están documentadas en: http://www.nl.debian.org/doc/debian-policy/ch-controlfields.html, elegiremos x11 para wmforkplop.

Priority: optional es correcto. Puedes mirar otros paquetes, usando apt-cache show para averiguar qué prioridad tienen. Por ejemplo, apt-cache show bash.

Despues de Mantainer: puedes añadir una nueva línea que diga Uploaders: Algún Amigo <amigo@correo.es>, esto establecerá quienes son los co-responsables. Es importante advertir que el campo Uploaders no se muestra cuando haces apt-cache show algunpaquete, pero aparecerá si haces apt-cache showrc algunpaquete.

Uno de los campos más importantes es Build-Depends. Éste lista los paquetes necesarios para construir este paquete. Para wmforkplop necesitamos hacer apt-cache search libgtop dev, y encontraremos: libgtop2-dev, ésto es lo que debemos añadir a la línea Build-Depends. Haz también apt-cache search imlib dev y añade libimlib2-dev a la línea Build-Depends. La línea debe tener ahora este aspecto: Build-Depends: debhelper (>= 4.0.0), libgtop2-dev, libimlib2-dev. Te preguntarás qué significa el (>= 4.0.0), a ésto se le llama dependencia de construcción con versión. A veces un programa necesita una biblioteca lo suficientemente nueva para funcionar correctamente (o para funcionar del todo), para eso sirve.

En Standards-Version debería poner 3.6.1, porque es la última versión de la norma: dpkg -l debian-policy (si lo tienes instalado, si no es así deberías hacerlo).

La parte superior que hemos editado es la información del paquete fuente, ahora viene el nombre del paquete binario: Package: wmforkplop. Ésto debería ser correcto. En Architecture: any dice que el paquete debe ser compilado en cualquier arquitectura (p. ej. se construirá en i386, sparc, powerpc, alfa, etc). Algunas veces tendremos datos (gráficos, sonido) o «shellscripts» que no necesitan compilarse, en ese caso deberíamos cambiarlo a all, dado que una vez que se construye es útil para todas las arquitecturas.

Las dependencias de binarios determinan qué paquetes deben estar disponibles cuando ejecutemos el programa. Aquí deberíamos añadir el paquete del tipo de fuente, el que contenga el archivo Vera.ttf. Podemos encontrarlo haciendo dpkg -S Vera.ttf: ttf-bitstream-vera. Así que nuestra línea debe quedar: Depends: ${shlibs:Depends}, ${misc:Depends}, ttf-bitstream-vera.. Los ${...} son sustituciones, son remplazados por otros valores que se calculan automáticamente por otras herramientas en el momento de la construcción. shlibs:Depends son las dependencias de bibliotecas calculadas automáticamente cuando ejecutas dh_shlibdeps en el archivo rules, misc:Depends se calcula por debhelper.

La primera línea del campo Description: es la descripción corta, de la siguiente línea en adelante es la descripción larga. La descripción corta debe dar una idea básica de qué es el paquete, siguiendo la sintaxis: «[paquete] is a [descripción corta]» Nota2. La descripción larga debe empezar una nueva frase (NO debe ser continuación de la descripción corta), tienes que dejar un espacio en blanco al comienzo de cada línea, y si quieres dejar una línea en blanco tienes que poner un espacio seguido de un punto. Para wmforkplop, una buena descripción corta sería: «dockapp displaying processes and forking activity» Nota3, y una buena descripción larga sería: «"Each time a new process is created, and each time another one dies, a spotlight appears on the applet and evolves. wmforkplop also displays the top cpu consuming processes, just like wmtop. It also has a process browser (click in the applet to bring it), which gives more informations about each process, and ability to kill a specific process, or "killall" all process who have the same name."» Nota4.

:debian/copyright:En este archivo debes especificar el autor original, el lugar desde el que descargaste el software, y la licencia del programa. Si el software es GPL puedes poner simplemente una nota breve, donde se diga «en sistemas Debian GNU/Linux puedes encontrar la licencia GPL completa en /usr/share/common-licences/GPL» Nota5. Pero si no es GPL (o BSD), debes incluir aquí la licencia completa. Si algunas partes del programa son GPL y otras partes alguna otra licencia, debes especificar muy claramente esas partes, y pegar la licencia literal en el archivo copyright.

:debian/docs:Este archivo incluye los documentos que se copiarán a /usr/share/doc/paquete cuando se instale. En el caso de wmforkplop podemos borrar el archivo Vera.txt, dado que ya hemos añadido la dependencia. Despues deberíamos echar un vistazo a los archivos ../{NEWS, README, TODO}. Si sólo hay instrucciones de instalación/compilación, no los queremos para el usuario del paquete binario, así que los podemos borrar también. Si hay información importante o interesante en esos archivos, los dejaremos ahí.

:debian/manpage.1.ex: Esto en un ejemplo de página del manual. Nuestro paquete no incluye la página del manual necesaria para el comando, así que necesitamos editarla. El binario, cuando se compile se llamará wmforkplop, por lo que renombraremos manpage.1.ex a wmforkplop.1, si te estás preguntando -¿Por qué .1?-, haz man man. No entraremos en detalles de cómo editar la página del manual aquí, simplemente cambia la sección (SECTION) a 1, y haz todos los cambios que te apetezcan.

:debian/menu.ex: Esto es un ejemplo de un archivo de menú para el paquete menú. Nuestro paquete es una herramienta gráfica, y necesitamos un archivo de menú, así que renombramos menu.ex a menu. Es posible agregar iconos a tus aplicaciones.

:debian/watch.ex: Esto es un archivo de ejemplo de watch, es seguro borrarlo aunque es realmente útil. Puedes usar uscan para comprobar si hay una nueva versión original.

:debian/compat: Este archivo determina el nivel de compatibilidad con debhelper. Debhelper ha pasado por numerosas revisiones, alguna de las cuales rompen la compatibilidad, puedes usar el número de «compat» para especificar la revisión de debhelper que necesita o acepta. Ya determinamos que requiere debhelper (>= 4.0.0), así que compat debe ser 4. Puedes tener un paquete antiguo, que use sintaxis antiguas de debhelper y deba ser «compat 1», o «compat 2». Se recomienda usar la última versión de todos modos.

:debian/manpages: Este archivo especifica dónde están las páginas del manual, pero no lo ha creado debhelper, necesitamos crearlo por nosotros mismos. En el directorio debian/ haz: echo "debian/wmforkplop.1" > manpages, y listo.

:debian/rules: Este archivo es similar a un «Makefile», contiene reglas para realizar diversas tareas. Debhelper ya lo habrá rellenado con varias reglas y tareas, algunas de ellas están comentadas. Una vez que lo hayas editado no deben quedar lineas comentadas. Es decir, debes descomentar aquellas que necesites y borrar aquellas que no. Lectura recomendada sobre «Makefile»:

Al final de todo el archivo, encontrarás tres ordenes comentadas: dh_perl, dh_python y dh_makeshlibs, puedes borrarlas todas, dado que ni estamos usando Perl, ni Python, ni haciendo «shlibs». Podemos borrar: dh_installinfo, dh_cron, dh_init, dh_mime, dh_pam, dh_emacsen, dh_logrotate, dh_debconf y dh_install por las mismas razones. Podríamos usar dh_debconf si tuviéramos que hacer alguna pregunta al usuario, y dh_install es para copiar archivos en el directorio temporal de construcción, pero no vamos a hacer ninguna copia adicional. Pero descomenta dh_installmenu (ya que vamos a tener un archivo de menú).

Construcción de paquetes

Casi hemos terminado con la preparación del paquete, el siguiente gran paso es construirlo. Lo haremos usando la orden debuild. Si no tienes preparada tu clave GPG, puedes hacer debuild -us -uc para construir el paquete sin firmarlo. Pero ten en cuenta que es una buena idea tener tu clave GPG preparada cuando construyas paquetes. Puede ocurrir que no tengas las dependencias necesarias, si es así, instalalas.

Cuando estés construyendo, puede ser que recibas algunos errores como: description-contains-tabs o W: wmforkplop: description-starts-with-leading-spaces o W: wmforkplop: manpage-section-mismatch. Ésto es frecuente, así que no te sientas mal por ello, corrige los errores y vuelve a intentar construirlo.

Una vez que termines de construir, deberías ir al directorio superior ($HOME/debian) y listar los archivos en él. Deberías tener un diff.gz. un .dsc y un orig.tar.gz, esos son el paquete fuente (sí, el paquete fuente son en realidad tres archivos); y un archivo .deb que es el paquete binario. Están también los archivos .build y .changes, puedes echarles un vistazo.

Ahora puedes ejecutar lintian sobre el paquete, para comprobar que está en buen estado: lintian -Ivi wmforkplop_0.9.1-1_i386.deb (o cualquiera que sea el archivo que has construido). Éste probablemente te listará una serie de errores y advertencias que deberás corregir y luego reconstruir el paquete.

Una vez que hayas corregido los errores y advertencias, deberás ejecutar lintian sobre el archivo .dsc (es decir, sobre el paquete fuente), o directamente sobre el archivo .changes (que ejecutará lintian sobre todos los archivos listados en él, útil si tienes varios paquetes binarios).

Instalación y ejecución.

La última prueba del paquete es instalarlo y ejecutarlo. Para instalarlo debes hacer: dpkg -i wmforkplop_0.9.1-1_i386.deb, después de instalarlo prueba las cosas que empaquetaste: prueba man wmforkplop, prueba a ejecutar wmforkplop y prueba el programa (ejecuta un «find /» selecciona la mancha más grande, selecciona «kill» y luego «gently»)

Compartiendo tu paquete.

Aunque no pongas tu paquete en Debian, todavía puedes compartirlo con otros poniéndolo en tu directorio servidorweb/debian.

Preguntas y respuestas

Estas son las preguntas y las respuestas que se hicieron durante la sesión de IRC espero que respondan muchas de las dudas habituales que puedan surgir al leer este tutorial.

¿Qué significa «ITP» y para que sirve?

ITP significa "Intención de empaquetar" (Intend To Package). Es un tipo especial de fallo, que indica que tu (o alguien) tiene intención de empaquetar un determinada software. ¿El objeto de los ITP's? Que no se duplique trabajo, así si alguien está empaquetando un programa que tú quieres empaquetar, no necesitas hacerlo dos veces.

Es una buena costumbre rellenar un ITP (usando reportbug o un cliente de correo) antes de empaquetar software. Esto «asegura» que no se malgasta esfuerzo (que otra persona empaquete el mismo programa que tú, si comprueban la base de datos de ITP).

Mira http://www.nl.debian.org/devel/wnpp/ para más información.

¿Qué son las «autotools»? ¿Qué es el «script» `./configure` ?

Las «autotools» son un conjunto de utilidades para ayudar a un programa a compilar en cualquier arquitectura. El ./configure trata de detectar la plataforma en la que está y genera un «Makefile» para ajustarse al entorno, o abandonar si no es posible.

Es una verdadera bendición, en los viejos tiempos tenías que editar el «Makefile» tú mismo y si tu plataforma no se mencionaba en el «Makefile», tenías que adivinar los valores para hacer que el programa compilara.

¿Cómo empaqueto paquetes no compilables? (documentos, páginas web, «shellscripts»)

No hay un tutorial sobre ésto dado las «miríadas» de posibilidades, hay tantos tipos diferentes de paquetes no compilados que es difícil establecer un patrón para ellos. Pero puedes mirar tomar paquetes como ejemplo, por ejemplo ttf-junicode (Architecture: all), o supertux (all and i386). Prueba apt-get source algúnpaquete y echa un vistazo a cómo está hecho.

Notas del traductor

Nota 1 Low=Baja, Medium=Media, High=Alta. Se mantienen los términos en inglés, tanto en las versiones como en las urgencias para no confundir al lector.

Nota 2 El texto de ambas descripciones así como el resto de contenidos en los archivos deben ir en inglés.

Nota 3«dockapp que muestra procesos y actividad de bifurcaciones».

Nota 4 «Cada vez que se crea un nuevo proceso, y cada vez que algún otro muere, una nueva mancha aparece y evoluciona. Wmforkplop también muestra los procesos que más cpu consumen, como wmtop. También tiene un visualizador de procesos (ha click en el applet para verlo), que proporciona información sobre cada proceso y la capacidad para "matar" un determinado proceso o "matar" todos los procesos que tienen el mismo nombre»

Nota 5«On Debian GNU/Linux systems you can find the complete GPL licence in /usr/share/common-licences/GPL»