[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ A ] [ siguiente ]
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). Esto significa que tienes que mirar el sistema de construcción
de tu programa, generalmente empezando por el fichero «Makefile». Éste es el
guión make(1)
que se usará para automatizar la creación de este
programa. Para más detalles sobre los ficheros «Makefiles», consulta El fichero «rules», Sección 4.4.
Observa que si tu programa usa GNU automake(1)
y/o
autoconf(1)
, lo que quiere decir que las fuentes incluyen ficheros
Makefile.am y Makefile.in, respectivamente, ya que necesitarás modificar esos
ficheros, porque cada invocación de automake reescribirá los ficheros
«Makefile.in» con información generada a partir de los ficheros «Makefile.am»,
y cada llamada a ./configure
hará lo mismo con los ficheros
«Makefile», con información de los ficheros «Makefile.in». Editar los ficheros
«Makefile.am» requiere algunos conocimientos de automake
, que
puedes obtener leyendo la entrada de info
para automake, mientras
que editar los ficheros «Makefile.in» es casi lo mismo que editar ficheros
«Makefile», simplemente basta con poner atención en las variables, es decir,
cualquier cadena que empiece y acabe con el caracter «@», como por ejemplo
@CFLAGS@ o @LN_S@, que se sustituyen por otros valores cada vez que se ejecute
./configure
. Por favor, lee
/usr/share/doc/autotools-dev/README.Debian.gz
antes de empezar.
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.
La mayor parte de los programas tienen alguna manera de instalarse en la estructura de directorios existente en tu sistema, para que los binarios sean incluidos en tu $PATH, y para que encuentre la documentación y páginas de manual en los lugares habituales. Sin embargo, si lo instalas de esta forma, el programa se instalará con los demás binarios que ya están en tu sistema. Esto dificultará a las herramientas de paquetes averiguar qué archivos pertenecen a tu paquete y cuales no.
Por lo tanto, necesitas hacer algo más: instalar el programa en un subdirectorio temporal desde el cual las herramientas de desarrollo construirán el paquete .deb que se pueda instalar. Todo lo que se incluye en este directorio será instalado en el sistema del usuario cuando instale su paquete, la única diferencia es que dpkg instalará los ficheros en el directorio raíz.
Este directorio temporal se creará bajo el directorio debian/ que está dentro
del árbol del código descomprimido, generalmente con el nombre
debian/nombre_de_paquete
.
Ten en cuenta que, aunque necesitas que el programa se instale en
debian/nombre_de_paquete
, también necesitas que se comporte
correctamente cuando se instale en el directorio raíz, es decir, cuando se
instale desde el paquete .deb. Así que no deberías permitir que al construirse
lo haga con cadenas como
/home/me/deb/gentoo-0.9.12/usr/share/gentoo dentro de los archivos
del paquete a distribuir.
Esto será sencillo con los de programas que utilicen la herramienta GNU
autoconf
. La mayoría de estos programas tienen ficheros
«Makefile» por omisión que permiten configurar la instalación en un
subdirectorio cualquiera, aunque recordando que, por ejemplo, /usr
es el prefijo normal. Cuando detecte que tu programa usa
autoconf
, dh_make
fijará las opciones necesarias para
hacer esto automáticamente, así que puedes dejar de leer esta sección. Pero
con otros programas puede ser necesario que examines y edites los ficheros
«Makefile».
Esta es la parte importante del Makefile de gentoo:
# ¿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 aplicar 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]' .
(En cada subdirectorio que contenga ficheros .c y .h, grep
nos
indicará el nombre del fichero y la línea cuando encuentre una ocurrencia.
Ahora edita esos ficheros y cambia en esas líneas usr/local/lib con usr/share y ya está. Sólo tienes que reemplazar usr/local/lib por tu localización, pero debes ser muy cuidadoso para no modificar el resto del código, especialmente si no sabes mucho sobre cómo programar en C. :-)
Después de esto deberías encontrar 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. Anteriormente el objetivo «install» decía:
install: gentoo install ./gentoo $(BIN) install icons $(ICONS) install gentoorc-example $(HOME)/.gentoorc
Después del cambio dice:
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
Un lector atento se dará cuenta de que he cambiado «gentoo» a «gentoo-target» en la línea «install:». A eso se le llama arreglar un fallo en el programa. :-)
Siempre que hagas cambios que no estén específicamente relacionados con el paquete Debian, 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 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 de plataforma a plataforma. Por ejemplo, un Makefile puede contener una referencia a una biblioteca que no exista en Debian o ni siquiera en 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):
LIBS = -lcurses -lcosas -lmáscosas
Entonces cámbiala a lo siguiente, y funcionará casi con seguridad:
LIBS = -lncurses -lcosas -lmáscosas
(El autor se ha dado cuenta de que éste no es el mejor ejemplo ya que ahora el
paquete libncurses
incluye un enlace simbólico a libcurses.so,
pero no puedo pensar uno mejor. Cualquier sugerencia sería muy bien recibida
:-)
[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ A ] [ siguiente ]
Guía del nuevo desarrollador de Debian
version 1.2.11, 12 de enero de 2007.joy-mg@debian.org
jfs@debian.org
ender@debian.org
ana@debian.org