[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ siguiente ]


Guía del nuevo desarrollador de Debian
Capítulo 3 - Modificar las fuentes


Ten en cuenta que no hay espacio aquí para entrar en todos los detalles respecto a los arreglos que deben hacerse en las fuentes originales. Sin embargo, a continuación se detallan algunos de los problemas más frecuentes.


3.1 Utilizando quilt

El programa quilt ofrece un método básico para realizar y conservar las modificaciones del código fuente para construir paquetes Debian. Para empaquetar, es preferible realizar algunos cambios a la configuración predeterminada del programa, vamos a escribir lo siguiente en el archivo ~/.quiltrc. [14]

     d=. ; while [ ! -d "$d/debian" -a `readlink -e $d` != / ]; do d="$d/.."; done
     if [ -d "$d/debian" ] && [ -z "$QUILT_PATCHES" ]; then
         # Debian packaging case and unset $QUILT_PATCHES
         QUILT_PATCHES=debian/patches
         QUILT_PATCH_OPTS="--unified-reject-files"
         QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"
         QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
         QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;
             33:diff_ctx=35:diff_cctx=33"
         if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi
     fi

Véase quilt(1) y /usr/share/doc/quilt/quilt.html para utilizar quilt.


3.2 Arreglando fallos en el código fuente

Vamos a suponer que has encontrado el siguiente error en el archivo Makefile original: donde pone «install: gentoo» debería poner «install: gentoo-target».

     install: gentoo
             install ./gentoo $(BIN)
             install icons/* $(ICONS)
             install gentoorc-example $(HOME)/.gentoorc

Vamos a arreglar este error con la orden quilt y conservar las modificaciones a realizar en el archivo fix-gentoo-target.patch [15].

     $ mkdir debian/patches
     $ quilt new fix-gentoo-target.patch
     $ quilt add Makefile

Ahora cambia el archivo Makefile (con un editor) original como se muestra a continuación.

     install: gentoo-target
             install ./gentoo $(BIN)
             install icons/* $(ICONS)
             install gentoorc-example $(HOME)/.gentoorc

A continuación ejecuta quilt para que actualice el parche creando el archivo debian/patches/fix-gentoo-target.patch y añade la descripción de la modificación.

     $ quilt refresh
     $ quilt header -e
     ... describe el parche

3.3 Instalación del programa

Por lo general, los programas se instalan a sí mismos en el subdirectorio /usr/local. Pero los paquetes Debian no pueden utilizar este directorio ya que está reservado para el uso privado del administrador (o de los usuarios) sino que deben utilizar los directorios del sistema como /usr/bin según lo establecido por la normativa de jerarquía del sistema de archivos («Filesystem Hierarchy Standard» FHS, /usr/share/doc/debian-policy/fhs/fhs-2.3.html).

Es frecuente la utilización de make(1) para la construcción automatizada del programa y la ejecución de la orden "make install" instala directamente el programa en la ubicación deseada ejecutando la sección install del archivo Makefile. En la construcción de los paquetes binarios de Debian, el sistema de construcción instala los programas en una reconstrucción de la estructura de directorios del programa en un directorio temporal en lugar de hacerlo en su destino real.

Estas dos diferencias entre (1) la instalación del programa y (2) la «simulación» de instalación en el empaquetamiento Debian las maneja de forma transparente el paquete debhelper con las órdenes dh_auto_configure y dh_auto_install siempre que se cumplan los requisitos indicados a continuación.

Los programas que usan autoconf de GNU cumplen automáticamente con las convenciones GNU y su empaquetamiento es casi automático. Con estos requisitos y la heurística que aplica el paquete debhelper, es posible empaquetar sin hacer cambios en el sistema de construcción. El empaquetado no es tan complicado como puede parecer.

Si debes hacer cambios en el archivo Makefile, debes asegurarte que soportan la variable $(DESTDIR). La variable $(DESTDIR) no está definida en el archivo y se añadirá en todas las rutas de directorios usadas en la instalación del programa. El guión de empaquetamiento establece el valor de la variable $(DESTDIR) al valor del directorio temporal de instalación del programa en el proceso de construcción del paquete.

El directorio temporal usado por la orden dh_auto_install es debian/nombre_de_paquete para paquetes con un binario [16]. El contenido completo del directorio temporal será instalado en en sistema del usuario cuando se instale el paquete, con la diferencia que con dpkg la instalación se realizará a partir del directorio raíz del sistema (en lugar del directorio debian/ o debian/tmp utilizado en la construcción del paquete).

Aunque el programa se instalen en el directorio debian/nombre_del_paquete será necesario que se comporte correctamente cuando se instalen en el directorio raíz, esto es, cuando se instalen usando el archivo .deb. Debería evitar que el sistema de compilación incluya cadenas del tipo /home/mi/deb/paquete-versión/usr/share/paquete en el fichero de paquete.

Esta es la parte importante del Makefile de gentoo [17]:

       # ¿Dónde poner el binario en «make install»?
       BIN     = /usr/local/bin
       
       # ¿Dónde poner los iconos en «make install»? 
       ICONS   = /usr/local/share/gentoo/

Vemos que los ficheros están configurados para instalarse bajo /usr/local. Cambia estas rutas a:

       # ¿Dónde poner el binario en «make install»?
       BIN     = $(DESTDIR)/usr/bin
     
       # ¿Dónde poner los iconos en «make install»? 
       ICONS   = $(DESTDIR)/usr/share/gentoo

Pero ¿por qué en este directorio y no en otro? Porque los paquetes de Debian nunca se instalan bajo /usr/local, este árbol de directorio, está reservado para el uso del administrador del sistema. Así que estos ficheros deben instalarse en /usr.

La localización correcta de los binarios, iconos, documentación, etc, está especificada en el «Estándar de la jerarquía del sistema de ficheros» (véase /usr/share/doc/debian-policy/fhs). Te recomiendo que leas las secciones que podrían aplicarse a tu paquete.

Así pues, deberíamos instalar el binario en /usr/bin en lugar de /usr/local/bin y la página de manual en /usr/share/man/man1 en lugar de /usr/local/man/man1. No hemos mencionado ninguna página de manual en el Makefile de gentoo, pero en Debian se requiere que cada programa debe tener una, así que haremos una más tarde y la instalaremos en /usr/share/man/man1.

Algunos programas no usan variables en el makefile para definir rutas como éstas. Esto significa que tendrás que editar algunos de los ficheros de código C para arreglarlos y que usen las rutas correctas. Pero, ¿dónde buscar?, y exactamente, ¿el qué? Puedes probar a encontrarlos usando:

       grep -nr -e 'usr/local/lib' --include='*.[c|h]' .

grep buscará recursivamente en los subdirectorios los archivos de extensión .c y .h y te indicará el nombre del fichero y la línea cuando encuentre una concordancia con la cadena usr/local/lib.

Ahora edita esos ficheros y cambia en esas líneas usr/local/lib por usr/lib.

     $ vim '+argdo %s/usr\/local\/lib/usr\/lib/gce|update' +q \
           $(find . -type f -name '*.[c|h]')

¡Mucha atención en hacer otros cambios inadvertidos en el código! :-)

Después de esto deberías encontrar (en el archivo Makefile) el objetivo «install» (busca una línea que comience por «install:») y renombra todas las referencias a directorios distintos de los definidos al comienzo del Makefile.

Antes de corregir el error en el código original, el objetivo «install» de gentoo declaraba:

     install: gentoo-target
             install ./gentoo $(BIN)
             install icons/* $(ICONS)
             install gentoorc-example $(HOME)/.gentoorc

Ahora corregiremos el error, conservando las modificaciones en el archivo debian/patches/install.patch con la orden quilt.

     $ quilt new install.patch
     $ quilt add Makefile

Y ahora escribe los cambios con el editor:

     install: gentoo-target
             install -d $(BIN) $(ICONS) $(DESTDIR)/etc
             install ./gentoo $(BIN)
             install -m644 icons/* $(ICONS)
             install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc

Seguramente has notado que ahora hay una orden install -d antes de las demás órdenes de la regla. El Makefile original no lo tenía porque normalmente /usr/local/bin y otros directorios ya existen en el sistema donde se ejecuta «make install». Sin embargo, dado que lo instalaremos en un directorio vacío (o incluso inexistente), tendremos que crear cada uno de estos directorios.

También podemos añadir otras cosas al final de la regla, como la instalación de documentación adicional que los desarrolladores originales a veces omiten:

            install -d $(DESTDIR)/usr/share/doc/gentoo/html
            cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html

Después de comprobar que sea todo correcto, haz que quilt actualice la modificación en el archivo debian/patches/install.patch y añade la descripción en la cabecera del archivo.

     $ quilt refresh
     $ quilt header -e
     ... describe el parche

Ahora ya tienes un par de parches en el paquete.

  1. Corrección de un error en el código fuente: debian/patches/fix-gentoo-target.patch

  1. Una modificación específica del empaquetado Debian: debian/patches/install.patch

Siempre que hagas cambios que no estén específicamente relacionados con el paquete Debian, tales como debian/patches/fix-gentoo-target.patch, asegúrate de que los envías al desarrollador original para que éste los pueda incluir en la próxima revisión del programa y así le puedan ser útiles a alguien más. Además, recuerda hacer que tus cambios no sean específicos para Debian o GNU/Linux (¡ni siquiera para Unix!) antes de enviarlos, hazlo portable. Esto hará que tus arreglos sean más fáciles de aplicar.

Ten en cuenta que no tienes que enviar ninguno de los ficheros debian/* al desarrollador original.


3.4 Diferencias en las bibliotecas

Hay otro problema común: las bibliotecas son generalmente diferentes entre plataformas. Por ejemplo, un Makefile puede contener una referencia a una biblioteca que no exista en Debian o ni siquiera en GNU/Linux. En este caso, se necesita cambiarla a una biblioteca que sí exista en Debian y sirva para el mismo propósito.

Así, si hay una línea en el Makefile (o Makefile.in) de tu programa que dice algo como lo siguiente (y tu programa no compila) [18]:

       LIBS = -lcurses -lcosas -lmás_cosas

Corrige esto con el archivo debian/patches/ncurse.patch cambiando curses por ncurses.

     $ quilt new ncurse.patch
     $ quilt add Makefile
     $ sed -i -e "s/-lcurses/-lncurses/g" Makefile
     $ quilt refresh
     $ quilt header -e
     ... describe el cambio

[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ siguiente ]


Guía del nuevo desarrollador de Debian

versión 1.2.25, 2010-12-21 14:06:56 UTC

Josip Rodin joy-mg@debian.org

Traducido por Javier Fernández-Sanguino Peña jfs@debian.org
David Martínez ender@debian.org
Ana Beatriz Guerrero López ana@debian.org
Francisco Javier Cuadrado fcocuadrado@gmail.com
Innocent De Marchi tangram.peces@gmail.com