En esta segunda parte se tratara el tema de la construccion y manipulacion basica de paquetes .deb , digo basica por que el tema es tan extenso que es imposible que este documento cubra todos los aspectos en su totalidad, aun asi intentare profundizar en algunos puntos que considero seran de suma importancia para entender el funcionamiento del sistema de paquetes apt.
Este documento presupone la obligada lectura del capitulo anterior, puesto que utilizaremos la clave gpg generada en dicho capitulo para firmar nuestros paquetes.
Otro punto importante a mencionar es que en este documento se tratara la construccion de paquetes deb desde la fuentes usando el software de ayuda para dicho fin , es decir , se omitira el metodo de creacion de paquetes de forma manual.
Como ya es costumbre antes de continuar con este howto , hare las acotaciones necesarias para seguir correctamente el proceso.
Como regla general se estableceran durante el desarrollo de este documento la sigueinetes directivas
1-Todos los comando ejecutados como usuario normal estaran precedidos por un simbolo "$" el cual no forma parte del comando y solo se usara como referencia , por ejemplo :
- Código: Seleccionar todo
$ mkdir -p /home/loquesea
2-Todos los comandos ejecutados com root (administardor) estaran precedidos por el simbolo "#" el cual no forma parte del coamdo y solo se usara comor eferencia , por ejemplo:
- Código: Seleccionar todo
# mkdir -p /etc/loquesea
3-En caso de que un comando no presente ninguno de los 2 sombolos anterirores , es entonces un indicativo de que puede ser ejecutado indistintamente ya sea como root o como user , como ejemplo
- Código: Seleccionar todo
mkdir -p /loquesea
4-Para crear archivos de configuracion nuevos se usuara un comando del tipo
- Código: Seleccionar todo
# cat > /etc/vsftpd.conf << EOF
aca va el contenido
EOF
El ejemplo anteriror ilustra el funcionamiento del comando , es decir , dicho comando solicita al sistema la creacion de un archivo llamado "vsftp.conf" en la ruta /etc con el contenido "aca va el contenido" .Es recomendable si no se tiene mucha experiencia en linux , hacer copy & paste de estos comandos.
Si vas a hacer "copy & paste" asegurate de omitir los simbolos "$" "#" en los comandos
INSTALANDO LAS HERRAMIENTAS NECESARIAS Y ESTABLECENDIO VARIABLES
Como he mencionado anteriromente aqui utilizaremos el metodo de construccion de paquetes usando las herramientas creadas por los desarrolladores de debian para crear dichos deb's , entonces comenzamos instalando lo necesario
- Código: Seleccionar todo
# apt-get install build-essential gcc fakeroot dh-make devscripts autoconf automake autotools-dev debhelper
El siguiente paso sera crear una estructura de directorios en nuestro home con la cual por conveniencia se trabajara de hoy en adelante , esta estructura sera basicamente un directorio llamado "build" dentro del cual se crearan carpetas para cada uno de los programas que se vallan a compilar y dentro de esta sera descompreso el codigo fuente de dichos programas , en este caso y durante toda esta seccion del documeto usaremos un programa ficticio llamado "foo-0.0.1" a manera de ejemplo, entonces creamos el direcorio build y el direcotorio "foo" dentro de este
- Código: Seleccionar todo
$ mkdir -p ~/build/foo
La disposicion general a manera de ejemplo se muestra en la siguiente figura :

Casi todos los programas y scripts usados para la construccion de paquetes necesitan algunas variables de entorno para hacer correctamente su trrbajao .Es muy comun que dichas variables sean pasadas como parametros al programa o script durante su usuo , sin embargo para facilitar esta tarea y mas si planeas empaquetar varios programas es altamente recomendable establecer estas variables de entorno de forma permanente en el archvio ~/.bashrc del empaquetador.Dichas variables son las sigueintes
DEBEMAIL Esta variable es tomada por el programa dh-make para establecer elcorreo electronico del empaquetador
EMAIL Establece nuestra direccion de correo electronico
DEBNAME Esta variable tambien es necesaria para indicarle a dh-make el nombre del empaquetador
DEBFULLNAME El nombre completo y real del empaquetador
OJO , LOS PAQUETES SIEMPRE DEBEN SER ECHOS COMO USUARIO NORMAL AYUDANDOSE POR EL PROGRAMA FAKEROOT , JAMAS DEBE USARSE A ROOT PARA ESTOS FINES.
Ahora bien , una vez habiendo comprendido esto procedemos a editar el .bashrc del usuario que enpaquetara.
- Código: Seleccionar todo
nano ~/.bashrc
ahi buscamos la linea "export HISTCONTROL=ignoredups" y justo debajo agregamos las variables que deseamos sean establecidas. Estas variable deberan ir precedidas del el comando "export" , asi pues si nos basamos en la explicacion anterior deberia ser algo como esto
- Código: Seleccionar todo
export HISTCONTROL=ignoredups
export EMAIL="usuario@cuenta.com"
export DEBMAIL=$EMAIL
export DEBNAME="Nombre o nick del epaquetador"
export DEBFULLNAME="Nombre Completo del empaquetador"
A manera de ejemplo ilustrativo pongo a continuacion mi propio .bashrc
- Código: Seleccionar todo
export HISTCONTROL=ignoredups
export EMAIL="miguex@ikimlinux.org"
export DEBMAIL=$EMAIL
export DEBNAME="Miguel A: Reynosso"
export DEBFULLNAME=$DEBNAME
por ultimo sera necesario configurar el archivo /etc/devscripts.conf del cual seran tomadas las opciones por por parte del conjunto de scripsts creado por los desarroladores para facilitar la tarea de empaquetamiento (paquete devscripts) . Las mas importantes para nuestra causa y de momento mas necesarias debido a que seran indespensables para el script "debuild" seran las opciones "DEBSIGN_KEYID=" la cual establece el ID de usuario que dirmara el paquete y esta ubicada ubicada en la linea 228 .La otra es "DEBUILD_ROOTCMD=" y esta determina el co,mando que se usara para enmascara al usuario normal como root , esta queda ubicada en la liena 248 , en la primera se establecera el ID de usario de gnupg creado en el capitulo anteriro , en la segunda se usarra invariablemete el comando "fakerrot" , entonces esas lineas deberian verse mas o menos asi:
DEBSIGN_KEYID=[ID de usuario]
DEBUILD_ROOTCMD="fakeroot"
DEBIANIZANDO EL CODIGO FUENTE
El programa que sera usado para crear la estructura de un paquete deb sera dh-make , este dejara por decirlo asi "Debianizado" el codigo fuente del programa que querramor empaquetear
La debianizacion del codigo fuente de un programa no es mas que la creacion de un directorio llamdo "debian" dentro del arbol de las fuentes.Dicho directorio contiene una serie de archivos "templete" necesarios para realizar ciertas acciones , algunos de estos son mas importantes que otros y en mayor o menor medida necesarios para el correcto tratamiento del futuro paquete .deb por parte de apt , aptitude y dpkg . A continuacion se muestra una ilustracion de la debianizacion:

Esta debianizacion es regularmente ejecutada por el programa dh-make ,como mencione anterirormente y creara automaticamente el directorio "debian" y los archivos necesarios dentro de este .A continuacion dare un abrebe reseña de la utilidad de algunos de estos archivos.
changelog
Este archivo contiene el registro de cambios que ha sufrido el paquete , asi como la version , rama y prioridad .Este archivo es critico en importancia para el proceso de empaquetemiento
control
Este archivo es tal vez el mas importante de todos ya que aqui se indican las dependencias de compilacion y ejecucion del futuro paquete , ademas , es aqui donde se define si dicho paquete entra en conflico o reemplaza a otro .
rules
Este archivo contiene las reglas para la construccion del paquete por parte de las herramientas de compilacion.aqui se pueden definir en la mayoria de los casos las opciones "./configure" y / o modificar las mismas a conveniencia.
copyright
La licencia del paquete , regularmente gpl
preinstal
contiene los comandos que seran ejecutados justo antes de ser einstalado el paqute
postinstall
contiene los comandos que seran ejecutados justo despues de ser instalado el paqute
prerm
contiene los comandos que seran ejecutados justo antes de ser desinstalado el paqute
postrm
contiene los comandos que seran ejecutados justo despues de ser desinstalado el paqute
Obviamente aqui solo he explicado la funcion de los archivos que yo personalemte considero mas importantes, sin embargo si deseas conocer en su totalidad el funcionamiento y descripcion a fondo de dichos archivos , entonces es recomendable leer la documentacion ubicada en http://www.debian.com/devel/
TRABAJANDO CON EL PRIMER PAQUETE
Ya hemos visto a "grosso modo" algunos aspectos del empaqueto , asi mismo se han configurado correctamente las herramientas necesarias y se han establecido las variables de entorno necesarias, ahora toca el momento practico del manual.
Para comenzar recordaremos que el programa a empaquetar sera foo-0.0.1 y que sera construido en el directorio build dentro de nuestro home , si aun no has creado este directorio , entonces este es el momento correcto para hacerlo
- Código: Seleccionar todo
$ mkdir -p ~/build/foo
Ahora, suponiendo que ha sido descargado en el escritorio (sitio en donde firefox descarga regularmente los archivos ) habra que moverlo a su correspondiente carpeta
- Código: Seleccionar todo
$ mv ~/Desktop/foo-0.0.1.tar.gz ~/build/foo
nos dirigimos al directorio foo y desempaqueteamso las fuentes
- Código: Seleccionar todo
$ cd ~/build/foo
$ tar -xzvf foo-0.0.1
Esto nos dejara dentro del directorio "foo" el paquete tar.gz con el codigo fuente original asi como el directorio con las fuentes descompresas.Este directorio debe tener absoluta y rigurosamente su nombre con el formato <nombre>-<version> , el cual en nuestro caso deberia ser foo-0.0.1 , de lo contrario no sera posible debianizar el paquete con dh-make .Una vez verificados estos datos no internamos al directorio de las fuentes
- Código: Seleccionar todo
$ cd foo-0.0.1
Y debianizamos el paquete con dh-make y los sigueinetes parametros
- Código: Seleccionar todo
$ dh_make -c gpl -s -f ../foo-0.0.1.tar.gz
a continiacionuna breve explicacion de los parametros usados
dh_make
Se invoca a este programa
-c
Lisencia bajo la cual se encuentra el programa y que tambien sera usada para determinar la licencia del futuro paquete.Esto ,salvo contadas ocaciones quedara establecido en gpl
-s
Se indica a dh_make que deseamos construir un paquete debian de un binario sencillo.Esto es necesario ya que dh-make es capaz de debianizar fuentes para crear binarios, librerias y modulos de kernel
-f
Indica el lugar en donde se encuentra el codigo fuente original comprimido en tar.gz .Es sera usado para crear el archivo foo-0.0.1.orig.tar.gz ,ya que las politicas de debian es distribuir el codigo fuente original creado por el autor del programa y el trabajo del empaquteador asi como los parches correspondientes en un archivo .diff separado e independiente de las fuentes.Cuando por cualquier motivo no se tienen fuentes originales se utiliza el parametro --creatorig el lugar de -f para crear estas ultimas
Por supuesto en la tabla anteriror solo fueron descritas las opciones necesarias para este ejemplo , sin embargo si deseas amas informacion puedes leer la documentacion de dh-make incluida en el paquete con el comando :
- Código: Seleccionar todo
$ man dh_make
O consular las opciones de ayuda rapidas con el comando
- Código: Seleccionar todo
$ dh_make --help
Bien , suponiendo que no hubo errores en el proceso anterior deberiamos tener ya en este momento la carpeta debian dentro de foo-0.0.1 y como ya fue anterirormente explicado , esta carpeta deberia contener una serie de archivos adicionales con la extencion .ex .Cada uno de estos archivo tiene alguna funcion , sin embargo estos regularmente no son necesarios para crear un paquete de un binario sencillo y yo en lo personal los elimino todos , si deseas hacer esto ultimo ejecuta
- Código: Seleccionar todo
$ rm debian/*.ex
$ rm debian/*.EX
CONFIGURANDO LOS ARCHIVOS "CONTROL" Y "CHANGELOG"
Bien , llegado a este punto sera absolutamente necesario configurar al menos el archivo "control" el cual se encuentra dentro del directorio "debian" , pues es aqui en donde seran definidos puntos criticos y de suma importancia para el correcto tratamiento de nuestro futuro paqute por parte de apt, aptitud ey dpkg.
Lo primero que debemos saber es que todos los programas tienen dependencias de compilacion y dependencias de ejecucion .
Las dependecias de compilacion son los paquetes que contienen los headers y/o librerias de desarrollo necesarias para que nuestras fuentes se compilen de forma correcta.Estas dependencias regularmente son indicadas por el propi autor del programa en un archivo dentro de las fuentes llamado "INSTALL" de no ser asi sera necesario averiguarlas con el penoso metodo de "ensayo y error" (al menos yo no conozco otro metodo) coriendo el script ./configure incluido dentro de las fuentes y observando los errores de este , los cuales nos daran una pista de los paquetes necesarios para construir el binario , estos datos deberan ser colocados en el archivo control en el guin indicado como "Build-Depends".
Las dependencias de ejecucion son los paquetes que necesitan estar instaldos en el sistema para que el fututro programa funcione correctamente.
Otros campos interezantes son
Recommends
Aqui se colocan los programas que se recomienda instalar para añadir funcionalidades extra a nuestro futro programa
Suggests
Aqui se ponen los paqutees que tal vez pordria interezarnos instalar
Replaces
Aca se colocan , si es que procede , los paquetes que son reemplazados por el nuestro
Conflicts
Aqui se colocan los paquetes que entran en conflicto con el nuestro.Este campo regularmente se usas junto con el anteriro (Replaces)
A continuacion un archivo control de ejemplo
- Código: Seleccionar todo
Source: graveman
Section: media
Priority: extra
Maintainer: Miguel Reynosso <miguelinux@debian-mx.com>
Build-Depends: debhelper (>= 5), autotools-dev, libglib2.0-dev (>= 2.14.5-2), libgtk2.0-dev (>= 2.12.5-2), libglade2-dev (>= 1:2.6.2-1), libid3tag0-dev (>= 0.15.1b-10), libmad0-dev (>= 0.15.1b-2.1), libogg-dev (>= 1.1.3-3), libvorbis-dev (>= 1.2.0.dfsg-3), libflac-dev (>= 1.2.1-1), libmng-dev (>= 1.0.9-1), libsox-dev (>= 14.0.0-5), zlib1g-dev (>= 1:1.2.3.3.dfsg-11), libpango1.0-dev (>= 1.18.4-1)
Standards-Version: 3.7.2
Package: graveman
Architecture: i386
Depends: libatk1.0-0 (>= 1.20.0), libc6 (>= 2.7-1), libcairo2 (>= 1.4.0), libflac8, libglade2-0 (>= 1:2.6.1), libglib2.0-0 (>= 2.14.5-2), libgtk2.0-0 (>= 2.12.0), libid3tag0 (>= 0.15.1b), libmad0 (>= 0.15.1b), libmng1 (>= 1.0.3-1), libogg0 (>= 1.0rc3), libpango1.0-0 (>= 1.18.4), libvorbis0a (>= 1.1.2), libxml2, zlib1g, cdrecord, mkisofs, sox, vorbis-tools, dvd+rw-tools, cdrdao
Description: graphical tool to burn dvd and cd, gtk based
Graphical tool to burn dvd and cdi, made with gtk. You can:
* Burn audio cd from wav, ogg or mp3.
* Duplicate cd audio, cd data and dvd data.
* Create iso images from data cd and dvd.
* Burn cd and dvd data from iso image.
* Format cd and dvd rewritable.
* Burn data cd and dvd with files and directories that you choose.
* Use drag and drop with nautilus or integrated file dialog.
.
Homepage: http://www.nongnu.org/graveman/
El archivo changelog contiene el registro de cambios del paqute asi como las personas que hivcieron estos cambos , este archivo puede editarse con el comando :
- Código: Seleccionar todo
$ debchange -i
Lo cual añadira una nueva entrada a nuestro archivo changelog .
- Código: Seleccionar todo
graveman (0.3.12-5) stable; urgency=low
* Initial release
-- Miguel Reynosso <miguelinux@debian-mx.com> Sun, 03 Feb 2008 21:30:01 -0600
Este utlimo proceso puede no ser necesario para los fines de este manual , ya que aqui se trata de construir paquetes y un mirror de manera informal , es decir , para nuestro uso personal , entonces al no requerir un enredoso proceso de administracion pues simplemente podemos dejar el archivo "changelog" sin edicion alguna.
Si necesitamos alguna opcion de compilacion personalizada o epecial ,entonces podemos editar el archivo debia/rules el cual contiene las reglas de contruccion del paqute.
COMPILANDO EL PAQUETE
Bien , hasta este momento si hemos segudo correctamente los pasos estaremos listos para ejecutar la orden final para construir el paquete , para lo cual usaremos el comando "debuild".
Este comando (en realidad script) ejecuta varios procesos en forma secuencial asegurando asi la mejor forma de construccion posible.Los procesos se corren mas o menos como sigue:
make clean
limpia el arbol de las fuentes antes de ser compiladas
dpkg-sources
Este comando genera el archivo .orig.tar.gz y el .diff segun lo estipulado
./configure
ejecuta el script configure del codigo fuente , el cual chekea y reune los datos necesarios.
make
llama a make para construir lo ejecutables
make install
Installa los binarios en el directorio temporal debian/foo recreando el arbol de directorios del sistema
dpkg --build
Ejecuta la empaquetacion temporal del archivo deb
dpkg-name
Le da el nombre correcto al paquete debian tempora
debsign
firma el paquete con nuetra clave gpg establecida previamente en el archivo "devscripts.conf" , si este dato no esta presente simplemente se nos advirte de esto y continua el proceso de empaquetamiento;
Una vez comprendido el procedimiento porcedemos a correr el comando
- Código: Seleccionar todo
$ debuild
en ocaciones es necesario jejcutar debuil con el parametro -nc
- Código: Seleccionar todo
$ debuild -nc
Esto tomara mas o menos su tiempo dependiendo del tamaño del paqute , al terminar tendremos varios archivo en el directorio superior dentro de los cuales se encontrara nuestro paqute foo_0.0.1-1_i386.deb
una tabla descriptiva a continuacio
foo_0.0.1-1_i386.deb
Este es el paquete debian
foo_0.0.1-1.orig.tar.gz
El codigo fuente original
foo_0.0.1-1.diff.gz
El parche que contiene el trabajo y modificaciones sobre las fuenetes originales
foo_0.0.1-1.dsc
Este archivo contiene una reseña de nuestro paquete y sera de suma importancia para el siguiente capitulo
foo_0.0.1-1.changes
Archivo de cambios
foo_0.0.1-1.build
Log de compilacion , es decir un registro de todo lo que sucedio mientras se compilaba nuestro paqute
Listo, ahora podremos instalar nuestro paqute con el comando
- Código: Seleccionar todo
# dpkg -i ../foo_0.0.1-1_i386.deb

Documento escrito por Miguel A. Reynosso (miguex) bajo liencia Creative Commons.
Fuentes:
Debian devel



