[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ siguiente ]
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.
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
.
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
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.
El archivo Makefile
debe seguir las convenciones GNU de forma que
admita la variable $(DESTDIR). (véase
/usr/share/doc/gnu-standards/standards.html#Makefile-Conventions
o
http://www.gnu.org/prep/standards/html_node/DESTDIR.html#DESTDIR
).
El código fuente sigue el estándar de la jerarquía del sistema de ficheros. («Filesystem Hierarchy Standard» o FHS).
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.
Corrección de un error en el código fuente:
debian/patches/fix-gentoo-target.patch
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.
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-22 12:44:34 UTCjoy-mg@debian.org
jfs@debian.org
ender@debian.org
ana@debian.org
fcocuadrado@gmail.com
tangram.peces@gmail.com