DebianPackaging

Ubuntu Open Week - Empaquetamiento en Debian - René Mayorga - Martes 3 de noviembre 2009

   1 [19:00:19] <alucardni>  Para la última charla del día de hoy
   2 [19:00:38] <alucardni>  les dejo a rmayorga, Debian Developer que nos acompaña desde El Salvador
   3 [19:00:50] <alucardni>  rmayorga, el canal es todo tuyo :-)
   4 [19:00:55] <rmayorga>   buenas noches/días/tardes
   5 [19:01:15] <rmayorga>   primero, la idea es hacer un taller, mas que una charla, así que alguien esta dispuesto a seguir bien
   6 [19:01:35] <rmayorga>   también, no se si puedo quitar el +m y dejar abierto a que las preguntas sean publicas
   7 [19:01:59] <alucardni>  rmayorga, es decisión tuya
   8 [19:02:13] <rmayorga>   :)
   9 [19:02:45] <rmayorga>   bueno, vamos a trabajar un paquete sencillo, quien quiuera seguir, y quien tenga dudas, totalmente bienvenido
  10 [19:02:50] <rmayorga>   si pueden ir descargando
  11 [19:02:53] <rmayorga>   http://projects.thepozer.net/versions/download/19?attachment_id=25
  12 [19:03:09] <rmayorga>   también para ahorrar tiempo si pueden hacer desde ya un apt-get build-dep gmysqlcc
  13 [19:03:18] <rmayorga>   para que descargue todas las dependencias de construcción
  14 [19:03:29] <rmayorga>   y apt-get install dh-make
  15 [19:04:25] <rmayorga>   para iniciar, hablar un poco de .deb como tal
  16 [19:05:04] <rmayorga>   básicamente un .deb es un contenedor .ar, que en su interior tiene un .tar.gz con los archivos a instalar, y otro .tar.gz con archivos de control
  17 [19:05:39] <jamesjedimaster>    .ar? no sera .tar?
  18 [19:05:57] <rmayorga>   a la fecha existen varias formas de generar .debs, existen también varias opciones de utilizar a la hora de elegír el estilo de empaquetar, usando herramientas como debhelper
  19 [19:05:57] <rmayorga>   jamesjedimaster: no, ar
  20 [19:06:18] <rmayorga>   http://en.wikipedia.org/wiki/Ar_(Unix)
  21 [19:06:25] <rmayorga>   jamesjedimaster: ↑↑↑↑↑
  22 [19:06:37] <jamesjedimaster>    ok
  23 [19:07:01] <rmayorga>   bueno, sigo :), no voy a explicar mucho sobre el formato, sino mas bien como llegar al resultado
  24 [19:07:36] <rmayorga>   independientementemente de el estilo que usemos para empaquetar existe algo básico
  25 [19:08:18] <rmayorga>   un paquete binario como ya sabemos va a ser el .deb, el contenedor ar con lo que explicaba arriba, pero para esto tenemos un source, el source de un .deb son básicamente varios archivos
  26 [19:08:30] <rmayorga>   el .orig.tar.gz que es el tarball original de la aplicación, el que nos provee «upstream»
  27 [19:08:58] <rmayorga>   .diff.gz que es un .diff con todos los cambios introducidos por el maintainer de Debian para generar el .deb
  28 [19:09:34] <rmayorga>   y un .dsc que es un archivo de control del source, donde se encuentran varias cosas, por ejemplo checksums y shasums de los archivos anteriores
  29 [19:10:00] <rmayorga>   para efectos de entender un poco, yo puedo descargar cualquier paquete con apt-get source para ver estos archivos
  30 [19:10:18] <rmayorga>   ok, no se si quien va a seguir tiene el archivo que pase a descargar
  31 [19:10:24] <rmayorga>   y logro descargar las dependencias
  32 [19:10:27] <z-itou16>   si
  33 [19:11:21] <rmayorga>   ok, lo primero en el caso es verificar que la aplicación compile, pero no lo vamos a hacer de esa forma, sino que creemos un directorio temporal de trabajo, copiemos el tarball de gmysqlcc ahi(el que acabamos de descargar)
  34 [19:11:35] <rmayorga>   y lo sacamos del tar, tar -xvzf ...
  35 [19:12:32] <rmayorga>   luego entramos al directorio del paquete, donde se encuentra el source, y ejecutamos dh_make -f ../gmysqlcc-0.3.0.tar.gz
  36 [19:12:59] <rmayorga>   dh_make es una herramienta para hacer la «debianización» inicial de un paquete, todo esto es bastante simple, por lo que lo podríamos hacer nosotros totalmente a mano
  37 [19:13:16] <rmayorga>   lo que va a pasar con esto, es que simplemente se creeara un directorio debian/ dentro de los sources del paquete
  38 [19:13:30] <rmayorga>   este directorio tendra los archivos necesarios para construír el paquete
  39 [19:13:50] <rmayorga>   dh_make pregunta :  Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch or cdbs?
  40 [19:14:07] <rmayorga>   por lo que deberíamos de responderle con una «s» pues lo que estamos creando es un paquete binario simple
  41 [19:15:00] <rmayorga>   al terminar con esto podemos ver que se creo el directorio
  42 [19:15:31] <rmayorga>   dentro del directorio tenemos varios archivos con .EX y .ex
  43 [19:16:09] <rmayorga>   los archivos mas importantes son:
  44 [19:16:40] <rmayorga>   debian/rules, debian/control, debian/changelog, debian/compat, debian/copyright
  45 [19:16:56] <rmayorga>   si queremos podemos borrar todos los demas y dejar solo esos, para trabajar en base a esos archivos
  46 [19:17:36] <rmayorga>   quien me sigue me dice si voy muy rapido
  47 [19:17:47] <z-itou16>   yo sigo
  48 [19:17:55] <z-itou16>   ya tengo los .ex
  49 [19:18:08] <rmayorga>   borremos todos los .ex :)
  50 [19:18:10] <rmayorga>   y los .EX
  51 [19:18:15] <z-itou16>   ok
  52 [19:18:33] <rmayorga>   en medio explico un poco sobre debian/rules
  53 [19:18:49] <rmayorga>   debian/rules básicamente es un Makefile, *NO* un bash script
  54 [19:19:15] <rmayorga>   donde declaramos los «pasos» para construir el binario, lo que esto tiene que hacer
  55 [19:20:02] <rmayorga>   es construír el fuente, generar los binarios/manuales/etc y colocarlos todos en sus respectivos lugares dentro de un directorio temporal de debian/, luego en los últimos targets, armar el .deb con toda esta información
  56 [19:20:37] <rmayorga>   para debian/rules se pueden usar herramientas como debhelper o como cdbs, cada una tiene sus pros/contras, o usar un «plain» makefile
  57 [19:21:51] <rmayorga>   actualmente todo se redujo mucho, con lo de debhelper7 y los «tiny rules» la idea es hacer todo mas fácil y mas standard
  58 [19:22:01] <rmayorga>   por eso si vemos el archivo solo van a lograr ver un :
  59 [19:22:02] <rmayorga>   %:
  60 [19:22:03] <rmayorga>           dh  $@
  61 [19:22:23] <rmayorga>   que en el caso del clásico ./configure && make && make install  debería de bastar
  62 [19:22:50] <rmayorga>   si queremos ver un poco la extructura anterior podemos bajar el paquete original en otro directorio con apt-get source gmysqlcc
  63 [19:23:41] <rmayorga>   para hacerlo interesante, voy a explicar un poco lo de los targets de debian/rules en la versión vieja
  64 [19:24:38] <rmayorga>   los targets importantes son: build, clean, install, binary-indep y binary-arch
  65 [19:25:11] <rmayorga>   build como dice, construye el paquete, puede tener dependencias, como el caso de config
  66 [19:26:08] <rmayorga>   clean limpia todo, y es necesario asegurarse que se limpie bien después de construir, pues sino se hace se pueden generar errores cuando el paquete se construye mas de una vez, también por politica de debian que el clean no deje todo tal y como lo encontro podría ser un problema serio
  67 [19:26:27] <rmayorga>   install, se encarga de instalar todo en su lugar
  68 [19:26:47] <rmayorga>   y los dos últimos, binary-indep y binary-arch son los que generan el binario(.deb)
  69 [19:27:13] <rmayorga>   solamente se tiene que usar uno, dependiendo del caso del paquete
  70 [19:28:09] <rmayorga>   ejemplo, si es un paquete que no depende de arquitectura(imagenes, php, perl, python), se usa binary-indep, y si es un paquete que depende de arquitectura(C,C++) se usa binary-arch
  71 [19:28:22] <rmayorga>   en estos targets me aseguro de armar completo el .deb
  72 [19:28:43] <rmayorga>   si tenemos el archivo debian/rules que pedí descargaramos con apt-get source podemos ver mas o menos la estructura de los targets
  73 [19:29:35] <rmayorga>   las llamadas que se hacen, como por ejemplo dh_install
  74 [19:29:42] <rmayorga>   tienen su propio manual
  75 [19:29:53] <rmayorga>   por lo que podriamos realizar un man dh_install por ejemplo
  76 [19:30:18] <rmayorga>   y el manual completo en man debhelpper
  77 [19:30:51] <rmayorga>   estas llamadas de debhelper cumplen funciones especificas y son de las herramientas que hablaba en un principio
  78 [19:31:05] <rmayorga>   ayudan a hacer todo un poco mas standard y a evitar en cierto modo errores de los maintainers
  79 [19:31:33] <rmayorga>   pues mucha gente depende de que una apliación haga la mayoría de cosas bien y no es necesario hacerlas manulmente
  80 [19:32:08] <rmayorga>   vamos a probar construir con el debian/rules que genero dh_make, sino funciona luego copiamos este de ejemplo para que funcione.
  81 [19:32:13] <rmayorga>   alguna duda hasta aqui ?
  82 [19:32:32] <z-itou16>   el rule
  83 [19:32:38] <JADardon>   <<Pregunta>> ¿Para que sirven los archivos .ex .EX?
  84 [19:32:44] <rmayorga>   eran ejemplos
  85 [19:33:09] <rmayorga>   por lo que los podes borrar, la mayoría tienen sus funciones reales (cuando no son ejemplos)
  86 [19:33:12] <rmayorga>   como init script
  87 [19:33:18] <rmayorga>   o maint-scripts
  88 [19:33:21] <rmayorga>   z-itou16: si ?
  89 [19:33:27] <z-itou16>   veo una diff
  90 [19:33:42] <z-itou16>   entre el tar que se descargo el link vs el apt
  91 [19:33:45] <z-itou16>   en el rule
  92 [19:33:56] <z-itou16>   el rule de source se ve para mi algo mas entendible
  93 [19:33:58] <rmayorga>   si, el debian/rules de apt-get source es mas grande
  94 [19:34:05] <z-itou16>   ahh ok
  95 [19:34:10] <rmayorga>   el que descargaste con el link no tenía debian/rules
  96 [19:34:14] <rmayorga>   lo creo dh_make
  97 [19:34:18] <JADardon>   gracias
  98 [19:34:25] <z-itou16>   si correcto es un src
  99 [19:34:30] <z-itou16>   si disculpe
 100 [19:34:37] <rmayorga>   bueno, la idea es que sea al reves, la diferencia es que la versión de apt-get source usa el formato de debhelper versión 5
 101 [19:34:47] <rmayorga>   y la que creo dh_make usa debhelper versión 7
 102 [19:35:16] <rmayorga>   a mi en lo particular, me gusta mas la versión vieja :)
 103 [19:35:32] <rmayorga>   bueno, vamos con el segúndo archivo
 104 [19:35:56] <rmayorga>   debian/control
 105 [19:36:25] <rmayorga>   el primer campo Source: es el nombre del paquete
 106 [19:36:40] <rmayorga>   del «source», podriamos tener un «source» y varios binarios
 107 [19:36:54] <rmayorga>   generados desde el mismo source
 108 [19:37:09] <rmayorga>   el caso cuando vemos algo como foo-data, foo-common, foo-dev
 109 [19:37:35] <rmayorga>   el Source en ese caso podría ser foo, los otros binarios generados apartir del source
 110 [19:37:56] <rmayorga>   siguiendo los campos, Section
 111 [19:38:30] <rmayorga>   determina la sección del archivo a la que pertenece el paquete, ejemplo: net, misc, gnome, etc
 112 [19:38:49] <rmayorga>   para el caso de la audiencia, no sabría decir cual es la analogía en Ubuntu
 113 [19:39:37] <rmayorga>   aqui también usamos main como algo que se asume, si dice ejemplo «net» pertenece a «main/net», pero si el paquete es no-libre fuera algo como «non-free/net»
 114 [19:40:09] <rmayorga>   luego el priority, este no lo voy a explicar, pero tiene que ver con lo que es essential, optional, etc
 115 [19:40:37] <rmayorga>   luego Maintainer que es el mantenedor del paquete
 116 [19:40:50] <rmayorga>   Build-Depends y Build-Depends-Indep
 117 [19:41:07] <rmayorga>   se usa Build-Depends cuando el paquete es dependiente de arquitectura(C/C++)
 118 [19:41:25] <rmayorga>   y Build-Depends-Indep cuando el paquete no depende de arquitectura(php,perl, etc)
 119 [19:41:55] <rmayorga>   ojo, estas no son depencias para que el paquete funcione
 120 [19:42:03] <rmayorga>   sino que son las dependencias necesarias para que el paquete construya
 121 [19:42:25] <rmayorga>   ejemplo, lo que instalaron cuando estaban haciendo apt-get build-dep
 122 [19:43:13] <rmayorga>   Standards-Version contiene la versión de debian-policy con que se esta trabajando, la última 3.8.3
 123 [19:43:37] <rmayorga>   http://www.debian.org/doc/debian-policy/
 124 [19:43:57] <rmayorga>   el link de debian-policy, ahí estan explicados todos estos campos
 125 [19:44:04] <rmayorga>   y algunos que no estan en los paquetes de ejemplo
 126 [19:44:10] <rmayorga>   también todos los ficheros
 127 [19:44:11] <rmayorga>   etc
 128 [19:44:24] <rmayorga>   debian se toma muy en serio su politica
 129 [19:44:38] <rmayorga>   así que es algo muy importante de leer si les interesa el tema
 130 [19:44:52] <rmayorga>   ok
 131 [19:45:03] <rmayorga>   hasta ahí la definición del primer parrafo en el archivo
 132 [19:45:11] <rmayorga>   esa es la definición del source
 133 [19:45:21] <rmayorga>   luego los binarios se definen abajo, con Package
 134 [19:45:25] <rmayorga>   y el nombre del binario
 135 [19:45:30] <rmayorga>   Architecture: any
 136 [19:45:38] <rmayorga>   es importante, por que puede ser any o all
 137 [19:46:01] <rmayorga>   o contener valores de architecturas especificas,, cuando se usa any se esta diciendo que el paqute es dependiente de arquitectura
 138 [19:46:23] <rmayorga>   y que compila en cualquier arquitectura, cuando se usa all es para decir que el paquete no depende de arquitectura
 139 [19:46:31] <rmayorga>   luego:  Depends: ${shlibs:Depends}, ${misc:Depends}
 140 [19:47:00] <rmayorga>   donde estan esas dos variables, shlibs:Depends la usa debhelper, quien determina las dependencias de runtime para el paquete
 141 [19:47:09] <rmayorga>   y sustituye ahí con esa información
 142 [19:47:18] <rmayorga>   y al final
 143 [19:47:20] <rmayorga>   Description: <insert up to 60 chars description>
 144 [19:47:20] <rmayorga>    <insert long description, indented with spaces>
 145 [19:47:32] <rmayorga>   que es la descripción que vemos en apt-get/aptitude/synaptic
 146 [19:47:47] <rmayorga>   ese era el segundo archivo importante
 147 [19:47:53] <rmayorga>   alguna duda hasta aca ?
 148 [19:48:31] <rmayorga>   ok, los últimos dos archivos, un poco rapido
 149 [19:49:09] <rmayorga>   debian/copyright debería de contener toda la información del copyright del paquete
 150 [19:49:13] <rmayorga>   las licencias, autores, etc
 151 [19:49:37] <rmayorga>   es importante, pues si debian/copyright no es claro, el paquete nunca podra entrar a Debian
 152 [19:50:03] <rmayorga>   luego debian/changelog, donde se describen los cambios en el tiempo del paquete
 153 [19:50:10] <rmayorga>   cada revisión para debian y cada versión nueva
 154 [19:50:37] <rmayorga>   lo último, debian/compat que debería de decir solo «7»
 155 [19:50:43] <rmayorga>   que es la versión de debhelper que estan usando
 156 [19:50:54] <z-itou16>   la duda de los dep ya me la aclaro, gracias :)
 157 [19:51:24] <rmayorga>   ok, digamos que con eso esta todo mas o menos bien
 158 [19:51:29] <rmayorga>   podriamos probar construir
 159 [19:51:40] <rmayorga>   desde el source del paquete(fuera de debian/)
 160 [19:51:46] <rmayorga>   dpkg-buildpackage -uc -us
 161 [19:52:28] <rmayorga>   si todo funciona, deberíamos de tener varios archivos
 162 [19:52:30] <rmayorga>   gmysqlcc-0.3.0                  gmysqlcc_0.3.0-1_amd64.deb  gmysqlcc_0.3.0-1.dsc        gmysqlcc-0.3.0.tar.gz
 163 [19:52:33] <rmayorga>   gmysqlcc_0.3.0-1_amd64.changes  gmysqlcc_0.3.0-1.diff.gz    gmysqlcc_0.3.0.orig.tar.gz
 164 [19:52:47] <rmayorga>   que son los que mencionaba en el inicio, .orig.tar.gz, .diff.gz y .dsc
 165 [19:53:42] <rmayorga>   los pasos para la construcción son los de debian/rules, claro, este paquete no funciona mas que para efectos practicos de entender un poco
 166 [19:54:01] <rmayorga>   parfa hacer un paquete que vaya bien con Debian se necesita ver cada detalle de la politica, y aplicarla
 167 [19:54:24] <rmayorga>   o sea, esto no podría nunca llegar a debian, por que simplemente funciona sin necesidad de cumplir todas las politicas de calidad, etc
 168 [19:54:47] <rmayorga>   alguna duda al respecto ?
 169 [19:54:54] <rmayorga>   no quiero hacer muy largo para no seguir aburriendo :)
 170 [19:55:27] <rmayorga>   pero cualquier duda especifica después si les interesa el tema, y cualquier cosa en que yo pueda ayudar me pueden escribir con gusto
 171 [19:56:05] <rmayorga>   aclaro, que no se casi nada de los procesos  de desarrollo/politicas/etc en ubuntu, por lo que mi ayuda es explicita para Debian :)
 172 [19:56:34] <z-itou16>   yo solo tuve un problemita al momento de buildpackage
 173 [19:56:48] <z-itou16>   configure: error: Sorry, can't found MySQL client library
 174 [19:56:54] <z-itou16>   no tengo mysql
 175 [19:56:55] <z-itou16>   ahaha
 176 [19:56:58] <z-itou16>   pero no importa
 177 [19:57:19] <rmayorga>   jeje, te falto apt-get build-dep gmysqlcc
 178 [19:57:30] <z-itou16>   haha noob time :)
 179 [19:57:32] <rmayorga>   eso te iba a instalar todas las dependencias declaradas en Build-Depends
 180 [19:57:44] <z-itou16>   hehe si lo he usado para deluge
 181 [19:57:45] <z-itou16>   hehe
 182 [19:57:49] <z-itou16>   una pregunta rmayorga
 183 [19:57:58] <rmayorga>   cuando se hace por primera ves el paquete esto lo fijas a mano
 184 [19:57:59] <rmayorga>   dime
 185 [19:58:17] <z-itou16>   ok, creo que lo .deb para mi son super super buenos
 186 [19:58:22] <z-itou16>   corrigeme si estoy incorrecto
 187 [19:58:40] <z-itou16>   tengo rato que no uso el pkg installer de debian
 188 [19:58:41] <z-itou16>   pero
 189 [19:58:44] <z-itou16>   si en todo caso
 190 [19:58:45] <z-itou16>   digamos
 191 [19:58:49] <z-itou16>   bajo
 192 [19:59:08] <z-itou16>   un .deb pero yo no tengo los dependies para instalar correctamente el .deb
 193 [19:59:18] <z-itou16>   el me baja los dependies?
 194 [19:59:20] <rmayorga>   te va a devolver un error de dependencias
 195 [19:59:28] <rmayorga>   no, si lo haces con dpkg -i foo.deb
 196 [19:59:47] <rmayorga>   simplemente te va a decir que no se completo el proceso por falta de dependencias, pero si luego ejecutas apt-get install -f
 197 [20:00:10] <rmayorga>   va a bajar las dependencias(si estan disponibles)  y terminar de completar la instalación/configuración del paquete
 198 [20:00:33] <z-itou16>   excellente
 199 [20:00:59] <z-itou16>   y donde dentro del build .deb especifico los dep que necesita el usuario final
 200 [20:01:11] <rmayorga>   en debian/control en Depends
 201 [20:01:27] <rmayorga>   tenes actualmente: Depends: ${shlibs:Depends}, ${misc:Depends}
 202 [20:01:55] <rmayorga>   la variable shlibs:Depends la sustituye en el target binary-arch la llamda dh_shlibs
 203 [20:02:03] <z-itou16>   aja, crei que esos eran para el momento del build pero tambien es para en tal caso los usuarios no los tengan
 204 [20:02:13] <z-itou16>   ahi se define?
 205 [20:02:32] <rmayorga>   yu perdon, era dh_shlibdeps
 206 [20:02:45] <rmayorga>   no, para build son Build-Depends
 207 [20:02:56] <rmayorga>   Depends es el campo para las dependencias de runtime, las podes poner manuales
 208 [20:03:03] <rmayorga>   y ser especificas en versiones
 209 [20:03:13] <rmayorga>   creo que ya nos pasamos de tiempo  :)
 210 [20:03:20] <z-itou16>   waoo
 211 [20:03:28] <z-itou16>   gracias rmayorga
 212 [20:03:31] <alucardni>  rmayorga, pues si, se acabó el tiempo
 213 [20:03:31] <rmayorga>   yo paso siempre en freenode con este nick, no en este canal, pero si en varios
 214 [20:03:32] <z-itou16>   estuve genial genial
 215 [20:03:44] <alucardni>  muchas gracias por acompañarlos rmayorga 
 216 [20:03:45] <rmayorga>   y mi correo es rmayorga@debian.org
 217 [20:03:55] <rmayorga>   cualquier cosa estoy por ahí :)
 218 [20:04:04] <rmayorga>   no, gracias por dejarme participar :)
 219 [20:04:38] <jdardon>    gracias rmayorga

UbuntuOpenWeek_ES/openweekKarmicLog/DebianPackaging (last edited 2009-11-04 02:55:15 by pc161137)