== Ubuntu Open Week - Empaquetamiento en Debian - René Mayorga - Martes 3 de noviembre 2009 == {{{#!IRC [19:00:19] Para la última charla del día de hoy [19:00:38] les dejo a rmayorga, Debian Developer que nos acompaña desde El Salvador [19:00:50] rmayorga, el canal es todo tuyo :-) [19:00:55] buenas noches/días/tardes [19:01:15] primero, la idea es hacer un taller, mas que una charla, así que alguien esta dispuesto a seguir bien [19:01:35] también, no se si puedo quitar el +m y dejar abierto a que las preguntas sean publicas [19:01:59] rmayorga, es decisión tuya [19:02:13] :) [19:02:45] bueno, vamos a trabajar un paquete sencillo, quien quiuera seguir, y quien tenga dudas, totalmente bienvenido [19:02:50] si pueden ir descargando [19:02:53] http://projects.thepozer.net/versions/download/19?attachment_id=25 [19:03:09] también para ahorrar tiempo si pueden hacer desde ya un apt-get build-dep gmysqlcc [19:03:18] para que descargue todas las dependencias de construcción [19:03:29] y apt-get install dh-make [19:04:25] para iniciar, hablar un poco de .deb como tal [19:05:04] 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 [19:05:39] .ar? no sera .tar? [19:05:57] 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:05:57] jamesjedimaster: no, ar [19:06:18] http://en.wikipedia.org/wiki/Ar_(Unix) [19:06:25] jamesjedimaster: ↑↑↑↑↑ [19:06:37] ok [19:07:01] bueno, sigo :), no voy a explicar mucho sobre el formato, sino mas bien como llegar al resultado [19:07:36] independientementemente de el estilo que usemos para empaquetar existe algo básico [19:08:18] 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 [19:08:30] el .orig.tar.gz que es el tarball original de la aplicación, el que nos provee «upstream» [19:08:58] .diff.gz que es un .diff con todos los cambios introducidos por el maintainer de Debian para generar el .deb [19:09:34] 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 [19:10:00] para efectos de entender un poco, yo puedo descargar cualquier paquete con apt-get source para ver estos archivos [19:10:18] ok, no se si quien va a seguir tiene el archivo que pase a descargar [19:10:24] y logro descargar las dependencias [19:10:27] si [19:11:21] 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) [19:11:35] y lo sacamos del tar, tar -xvzf ... [19:12:32] luego entramos al directorio del paquete, donde se encuentra el source, y ejecutamos dh_make -f ../gmysqlcc-0.3.0.tar.gz [19:12:59] 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 [19:13:16] lo que va a pasar con esto, es que simplemente se creeara un directorio debian/ dentro de los sources del paquete [19:13:30] este directorio tendra los archivos necesarios para construír el paquete [19:13:50] dh_make pregunta : Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch or cdbs? [19:14:07] por lo que deberíamos de responderle con una «s» pues lo que estamos creando es un paquete binario simple [19:15:00] al terminar con esto podemos ver que se creo el directorio [19:15:31] dentro del directorio tenemos varios archivos con .EX y .ex [19:16:09] los archivos mas importantes son: [19:16:40] debian/rules, debian/control, debian/changelog, debian/compat, debian/copyright [19:16:56] si queremos podemos borrar todos los demas y dejar solo esos, para trabajar en base a esos archivos [19:17:36] quien me sigue me dice si voy muy rapido [19:17:47] yo sigo [19:17:55] ya tengo los .ex [19:18:08] borremos todos los .ex :) [19:18:10] y los .EX [19:18:15] ok [19:18:33] en medio explico un poco sobre debian/rules [19:18:49] debian/rules básicamente es un Makefile, *NO* un bash script [19:19:15] donde declaramos los «pasos» para construir el binario, lo que esto tiene que hacer [19:20:02] 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 [19:20:37] para debian/rules se pueden usar herramientas como debhelper o como cdbs, cada una tiene sus pros/contras, o usar un «plain» makefile [19:21:51] actualmente todo se redujo mucho, con lo de debhelper7 y los «tiny rules» la idea es hacer todo mas fácil y mas standard [19:22:01] por eso si vemos el archivo solo van a lograr ver un : [19:22:02] %: [19:22:03] dh $@ [19:22:23] que en el caso del clásico ./configure && make && make install debería de bastar [19:22:50] si queremos ver un poco la extructura anterior podemos bajar el paquete original en otro directorio con apt-get source gmysqlcc [19:23:41] para hacerlo interesante, voy a explicar un poco lo de los targets de debian/rules en la versión vieja [19:24:38] los targets importantes son: build, clean, install, binary-indep y binary-arch [19:25:11] build como dice, construye el paquete, puede tener dependencias, como el caso de config [19:26:08] 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 [19:26:27] install, se encarga de instalar todo en su lugar [19:26:47] y los dos últimos, binary-indep y binary-arch son los que generan el binario(.deb) [19:27:13] solamente se tiene que usar uno, dependiendo del caso del paquete [19:28:09] 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 [19:28:22] en estos targets me aseguro de armar completo el .deb [19:28:43] si tenemos el archivo debian/rules que pedí descargaramos con apt-get source podemos ver mas o menos la estructura de los targets [19:29:35] las llamadas que se hacen, como por ejemplo dh_install [19:29:42] tienen su propio manual [19:29:53] por lo que podriamos realizar un man dh_install por ejemplo [19:30:18] y el manual completo en man debhelpper [19:30:51] estas llamadas de debhelper cumplen funciones especificas y son de las herramientas que hablaba en un principio [19:31:05] ayudan a hacer todo un poco mas standard y a evitar en cierto modo errores de los maintainers [19:31:33] pues mucha gente depende de que una apliación haga la mayoría de cosas bien y no es necesario hacerlas manulmente [19:32:08] vamos a probar construir con el debian/rules que genero dh_make, sino funciona luego copiamos este de ejemplo para que funcione. [19:32:13] alguna duda hasta aqui ? [19:32:32] el rule [19:32:38] <> ¿Para que sirven los archivos .ex .EX? [19:32:44] eran ejemplos [19:33:09] por lo que los podes borrar, la mayoría tienen sus funciones reales (cuando no son ejemplos) [19:33:12] como init script [19:33:18] o maint-scripts [19:33:21] z-itou16: si ? [19:33:27] veo una diff [19:33:42] entre el tar que se descargo el link vs el apt [19:33:45] en el rule [19:33:56] el rule de source se ve para mi algo mas entendible [19:33:58] si, el debian/rules de apt-get source es mas grande [19:34:05] ahh ok [19:34:10] el que descargaste con el link no tenía debian/rules [19:34:14] lo creo dh_make [19:34:18] gracias [19:34:25] si correcto es un src [19:34:30] si disculpe [19:34:37] 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 [19:34:47] y la que creo dh_make usa debhelper versión 7 [19:35:16] a mi en lo particular, me gusta mas la versión vieja :) [19:35:32] bueno, vamos con el segúndo archivo [19:35:56] debian/control [19:36:25] el primer campo Source: es el nombre del paquete [19:36:40] del «source», podriamos tener un «source» y varios binarios [19:36:54] generados desde el mismo source [19:37:09] el caso cuando vemos algo como foo-data, foo-common, foo-dev [19:37:35] el Source en ese caso podría ser foo, los otros binarios generados apartir del source [19:37:56] siguiendo los campos, Section [19:38:30] determina la sección del archivo a la que pertenece el paquete, ejemplo: net, misc, gnome, etc [19:38:49] para el caso de la audiencia, no sabría decir cual es la analogía en Ubuntu [19:39:37] 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» [19:40:09] luego el priority, este no lo voy a explicar, pero tiene que ver con lo que es essential, optional, etc [19:40:37] luego Maintainer que es el mantenedor del paquete [19:40:50] Build-Depends y Build-Depends-Indep [19:41:07] se usa Build-Depends cuando el paquete es dependiente de arquitectura(C/C++) [19:41:25] y Build-Depends-Indep cuando el paquete no depende de arquitectura(php,perl, etc) [19:41:55] ojo, estas no son depencias para que el paquete funcione [19:42:03] sino que son las dependencias necesarias para que el paquete construya [19:42:25] ejemplo, lo que instalaron cuando estaban haciendo apt-get build-dep [19:43:13] Standards-Version contiene la versión de debian-policy con que se esta trabajando, la última 3.8.3 [19:43:37] http://www.debian.org/doc/debian-policy/ [19:43:57] el link de debian-policy, ahí estan explicados todos estos campos [19:44:04] y algunos que no estan en los paquetes de ejemplo [19:44:10] también todos los ficheros [19:44:11] etc [19:44:24] debian se toma muy en serio su politica [19:44:38] así que es algo muy importante de leer si les interesa el tema [19:44:52] ok [19:45:03] hasta ahí la definición del primer parrafo en el archivo [19:45:11] esa es la definición del source [19:45:21] luego los binarios se definen abajo, con Package [19:45:25] y el nombre del binario [19:45:30] Architecture: any [19:45:38] es importante, por que puede ser any o all [19:46:01] o contener valores de architecturas especificas,, cuando se usa any se esta diciendo que el paqute es dependiente de arquitectura [19:46:23] y que compila en cualquier arquitectura, cuando se usa all es para decir que el paquete no depende de arquitectura [19:46:31] luego: Depends: ${shlibs:Depends}, ${misc:Depends} [19:47:00] donde estan esas dos variables, shlibs:Depends la usa debhelper, quien determina las dependencias de runtime para el paquete [19:47:09] y sustituye ahí con esa información [19:47:18] y al final [19:47:20] Description: [19:47:20] [19:47:32] que es la descripción que vemos en apt-get/aptitude/synaptic [19:47:47] ese era el segundo archivo importante [19:47:53] alguna duda hasta aca ? [19:48:31] ok, los últimos dos archivos, un poco rapido [19:49:09] debian/copyright debería de contener toda la información del copyright del paquete [19:49:13] las licencias, autores, etc [19:49:37] es importante, pues si debian/copyright no es claro, el paquete nunca podra entrar a Debian [19:50:03] luego debian/changelog, donde se describen los cambios en el tiempo del paquete [19:50:10] cada revisión para debian y cada versión nueva [19:50:37] lo último, debian/compat que debería de decir solo «7» [19:50:43] que es la versión de debhelper que estan usando [19:50:54] la duda de los dep ya me la aclaro, gracias :) [19:51:24] ok, digamos que con eso esta todo mas o menos bien [19:51:29] podriamos probar construir [19:51:40] desde el source del paquete(fuera de debian/) [19:51:46] dpkg-buildpackage -uc -us [19:52:28] si todo funciona, deberíamos de tener varios archivos [19:52:30] gmysqlcc-0.3.0 gmysqlcc_0.3.0-1_amd64.deb gmysqlcc_0.3.0-1.dsc gmysqlcc-0.3.0.tar.gz [19:52:33] gmysqlcc_0.3.0-1_amd64.changes gmysqlcc_0.3.0-1.diff.gz gmysqlcc_0.3.0.orig.tar.gz [19:52:47] que son los que mencionaba en el inicio, .orig.tar.gz, .diff.gz y .dsc [19:53:42] 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 [19:54:01] parfa hacer un paquete que vaya bien con Debian se necesita ver cada detalle de la politica, y aplicarla [19:54:24] o sea, esto no podría nunca llegar a debian, por que simplemente funciona sin necesidad de cumplir todas las politicas de calidad, etc [19:54:47] alguna duda al respecto ? [19:54:54] no quiero hacer muy largo para no seguir aburriendo :) [19:55:27] pero cualquier duda especifica después si les interesa el tema, y cualquier cosa en que yo pueda ayudar me pueden escribir con gusto [19:56:05] aclaro, que no se casi nada de los procesos de desarrollo/politicas/etc en ubuntu, por lo que mi ayuda es explicita para Debian :) [19:56:34] yo solo tuve un problemita al momento de buildpackage [19:56:48] configure: error: Sorry, can't found MySQL client library [19:56:54] no tengo mysql [19:56:55] ahaha [19:56:58] pero no importa [19:57:19] jeje, te falto apt-get build-dep gmysqlcc [19:57:30] haha noob time :) [19:57:32] eso te iba a instalar todas las dependencias declaradas en Build-Depends [19:57:44] hehe si lo he usado para deluge [19:57:45] hehe [19:57:49] una pregunta rmayorga [19:57:58] cuando se hace por primera ves el paquete esto lo fijas a mano [19:57:59] dime [19:58:17] ok, creo que lo .deb para mi son super super buenos [19:58:22] corrigeme si estoy incorrecto [19:58:40] tengo rato que no uso el pkg installer de debian [19:58:41] pero [19:58:44] si en todo caso [19:58:45] digamos [19:58:49] bajo [19:59:08] un .deb pero yo no tengo los dependies para instalar correctamente el .deb [19:59:18] el me baja los dependies? [19:59:20] te va a devolver un error de dependencias [19:59:28] no, si lo haces con dpkg -i foo.deb [19:59:47] simplemente te va a decir que no se completo el proceso por falta de dependencias, pero si luego ejecutas apt-get install -f [20:00:10] va a bajar las dependencias(si estan disponibles) y terminar de completar la instalación/configuración del paquete [20:00:33] excellente [20:00:59] y donde dentro del build .deb especifico los dep que necesita el usuario final [20:01:11] en debian/control en Depends [20:01:27] tenes actualmente: Depends: ${shlibs:Depends}, ${misc:Depends} [20:01:55] la variable shlibs:Depends la sustituye en el target binary-arch la llamda dh_shlibs [20:02:03] aja, crei que esos eran para el momento del build pero tambien es para en tal caso los usuarios no los tengan [20:02:13] ahi se define? [20:02:32] yu perdon, era dh_shlibdeps [20:02:45] no, para build son Build-Depends [20:02:56] Depends es el campo para las dependencias de runtime, las podes poner manuales [20:03:03] y ser especificas en versiones [20:03:13] creo que ya nos pasamos de tiempo :) [20:03:20] waoo [20:03:28] gracias rmayorga [20:03:31] rmayorga, pues si, se acabó el tiempo [20:03:31] yo paso siempre en freenode con este nick, no en este canal, pero si en varios [20:03:32] estuve genial genial [20:03:44] muchas gracias por acompañarlos rmayorga [20:03:45] y mi correo es rmayorga@debian.org [20:03:55] cualquier cosa estoy por ahí :) [20:04:04] no, gracias por dejarme participar :) [20:04:38] gracias rmayorga }}}