¿Cómo hacer un ebuild?

foobar@hierroycuero.org
Última versión: Tue Oct 4 20:53:58 2005


  1. ¿Por qué, para qué?
  2. Disclaimer estándar
  3. ¿Qué necesitamos?
  4. Manos a la obra
  5. Probando el ebuild
  6. Para terminar


1. ¿Por qué, para qué?

Después de unos meses usando gentoo, hace poco tuve que instalar un paquete que no se encontraba en portage. En concreto, teniendo madre, mujer, suegra e hijas, me veo en la desesperada necesidad de recordar todos sus cumpleaños, así que decidí instalar una dockapp: wmbday.

El problema de las instalaciones típicas de linux (./configure, make, make install), fuera del gestor de paquetes propio de cada distribución, es que pasado el tiempo es una pesadilla tratar de eliminar todos los ficheros del programa, con lo que a la larga tenemos el disco duro lleno de basura inútil.

Animado por mi bisoñez, pregunté en la lista de usuarios de gentoo en español si había alguna guía rápida para crear un ebuild, contestándome que no, y que el proceso de crear un ebuild pasa por mirar en B.G.O si hay intención de crear el ebuild, y si no es así, solicitarlo.

Como yo sólo quiero instalar el programa, me decidí a tirar por el camino del medio, y crearme mi propio ebuild, y de paso hacer esta guía para ayudar, en lo posible, a algún otro usuario que se viera en mi misma situación.

2. Disclaimer estándar

"A mí me ha funcionado". ;)

No, en serio, hay pocas probabilidades de romper el sistema. Otra cosa es que alguien decida hacerse un ebuild de por ejemplo la libc6. En ese caso, me lavo las manos. Luego no me vengan llorando.

3. ¿Qué necesitamos?

Un editor de texto y tener a mano las páginas del manual de ebuild (1 y 5), el ebuild howto (parte del Gentoo developer handbook). Si se usa vim (cosa que recomiendo), la mitad del trabajo la tenemos hecha, ya que nos creará el esqueleto de los ficheros necesarios automáticamente.

4. Manos a la obra

4.1. Preparación

Lo primero que haremos será bajarnos el fichero tar.gz (o tar.bz2), compilarlo y comprobar que el programa funciona. Así que:

  foobar@bastardo ~/tmp $ wget http://buzzinhornetz.ath.cx/wmbday/files/wmbday-0.3.tar.gz
  foobar@bastardo ~/tmp $ tar xvfz wmbday-0.3.tar.gz
  foobar@bastardo ~/tmp $ cd wmbday-0.3/
  foobar@bastardo ~/tmp/wmbday-0.3 $ less INSTALL
  foobar@bastardo ~/tmp/wmbday-0.3 $ ./configure
  foobar@bastardo ~/tmp/wmbday-0.3 $ make
  foobar@bastardo ~/tmp/wmbday-0.3 $ su -c "make install"

Si todo ha ido bien, ejecutaremos el programa, y una vez seguros de que funciona, borraremos lo instalado. `make install -n` nos listará todos los ficheros instalados con sus rutas.

En /usr/portage se encuentran todos los ebuilds, clasificados por categorías, en nuestro caso, /usr/portage/x11-plugins. Pero como este ebuild no es oficial, y no queremos romper nada, lo que haremos será crearnos un árbol alternativo para portage. Para ello, creamos (si no existe ya) el directorio /usr/local/portage/x11-plugins, y en él el directorio wmbday.

Además, debemos editar el fichero /etc/make.conf, añadiendo esta línea `PORTDIR_OVERLAY="/usr/local/portage/"`. Una cosa a tener en cuenta es que, si más adelante se crea un ebuild oficial del programa, el nuestro tendrá preeminencia sobre él, es decir que siempre se instalará el nuestro.

El siguiente paso será la creación de los tres ficheros principales del ebuild, ChangeLog, metadata.xml y el ebuild propiamente dicho.

4.2. ChangeLog

En /usr/portage/skel.Changelog encontramos un patrón para crear el fichero, y una explicación de su formato. Como la intención de nuestro ebuild es ser un paquete estrictamente local, no vamos a ser muy pejigueros. Seguiremos sus indicaciones (las modificaciones más recientes, arriba), pero sin darle muchas vueltas.

En nuestro caso, el fichero queda así.

4.3. metadata.xml

Según el handbook del desarrollador, la función de este fichero es proporcionar información extra sobre el ebuild. Al igual que con el ChangeLog, tenemos un patrón en /usr/portage/skel.metadata.xml. Como ya he dicho antes, con vim, todo resulta más sencillo. Si no lo hemos hecho ya, este es un buen momento para instalar el paquete gentoo-syntax. Cuando editemos por primera vez el fichero, automáticamente se nos creará el esqueleto, y sólo tendremos que rellenar los campos, a saber:

herd
Por lo que he leido en el ebuild howto, viene a ser una agrupación de mantenedores (toma palabro), que se encargan de un grupo de aplicaciones, en el caso concreto de nuestro programa, sería "desktop-dock", pero como ya hemos dicho, éste es un paquete de consumo interno, así que lo dejaremos en "no-herd".
maintainer
Nosotros. Hay tres etiquetas, una obligatoria , <email> y dos opcionales, <name> y <description>. Como somos muy modestos, ponemos nuestro correo y a otra cosa.
longdescription
Eso, una descripción más larga del programa. No sé que hará el resto de la gentooza, pero yo he fusilado palabra por palabra lo que dice la web del programa (incluido el error tipográfico :P).

El fichero queda de esta guisa.

4.4. El ebuild

Aquí viene la diversión. Una vez más, vim nos creará un esqueleto del fichero, pero aparte de completar, y comentar lo que no nos interesa, tendremos que añadir algo más de chicha.

Básicamente, el ebuild es un script que le dice a emerge de dónde bajar los fuentes, que hacer con ellos (lo del ./configure, make) y dónde instalar (make install). En /usr/lib/portage/bin hay una serie de scripts que hacen la vida mucho más fácil al desarrollador. Y a nosotros, meros mortales. Si se tienen unos conocimientos básicos sobre bash-scripting, no está de más echarles un ojo. Más adelante veremos para qué nos sirven.

Hay unas reglas para dar nombre al ebuild, que se explican en el ebuild.howto, básicamente, nombre del programa - versión . ebuild, así que nuestro ebuild se llamará wmbday-0.3.ebuild.

Las tres primeras líneas las dejamos tal cual. Las siguientes son variables que tenemos que definir:

DESCRIPTION
Una breve descripción del programa, en una línea.
HOMEPAGE
URL de la homepage del programa
SRC_URI
El enlace a los fuentes empaquetados (tar.gz, tar.bz2, etc). Con una peculiaridad, sustituiremos el nombre y número de versión del programa con la variable ${P}, así wmbday-3.0.tar.gz se queda en ${P}.tar.gz.
LICENSE
La licencia con la que se libera el programa.
SLOT
Si queremos tener varias versiones distintas el programa, lo indicamos aquí. Como no es el caso, lo dejamos en 0.
KEYWORDS
Esta variable tiene dos funciones, indicar para que arquitecturas es válido el ebuild e indicar si es estable o no. Personalmente, yo lo he puesto como ~x86, y para hacer el emerge, he tenido que añadir `x11-plugins/wmbday ~x86` al fichero /etc/portage/package.keywords.
IUSE
El programa necesita las X para funcionar, así que eso he puesto.
DEPEND
Aquí tampoco le he dado demasiadas vueltas, virtual/x11.
RDEPEND
Siguiendo las indicaciones del howto, no he especificado ninguna. Aunque creo que la forma correcta de hacerlo es `RDEPEND=""`.

Ahora la cosa se complica un poco. Vamos a definir unas funciones que desempaqueten, configuren y compilen el programa. La primera de ellas es src_unpack(). Como estamos en gentoo, y queremos usar las CFLAGS que tenemos definidas en el fichero /etc/make.conf, debemos parchear el Makefile que viene con el programa original. Mi manejo de diff y patch es nulo, así que he tenido que ir mirando varios ebuilds para hacerme una idea de como hacerlo.

Bien, volvemos al directorio donde descomprimimos los fuentes la primera vez, y creamos un directorio con el nombre wmbday-3.0-modified. En él copiamos el fichero Makefile, y lo editamos, añadiendo ${CFLAGS} en las líneas pertinentes.

Salimos del directorio, y tecleamos:

  diff -urN wmbday-0.3/Makefile wmbday-0.3-modified/Makefile > wmbday-0.3-makefile.patch

editamos el parche, y añadimos esta línea al principio de todo:

  diff -urN wmbday-0.3/Makefile wmbday-0.3-modified/Makefile

Una vez hecho esto, volvemos a /usr/local/portage/x11-plugins/wmbday y creamos el directorio files. Allí copiamos el parche

  src_unpack()
  {
      unpack ${A}
      cd ${S}
      epatch ${FILESDIR}/${P}-makefile.patch
      econf || die "econf failed"
  }

La primera línea desempaqueta el fichero wmbday-3.0.tar.gz. La variable ${A} corresponde al nombre del fichero que aparece en la variable SRC_URI, sin la ruta.

La siguiente línea se mueve dentro del directorio creado, la tercera es una función que para poder ser utilizada, necesita de la línea

inherit eutils

y finalmente, la cuarta es otra función que sustituye al ./configure. Para que el proceso se detenga si hay algún fallo, usamos die.

Bien, una vez desempaquetado, parcheado y configurado, pasamos a la siguiente función, src_compile(). emake es uno de esos scripts en bash de los que he hablado antes. Viene a ser lo mismo que hacer make en el proceso original.

Lo que sería make install, aquí se realiza en la función src_install(). dobin instala el binario en /usr/bin, dodoc instala los ficheros que le indiquemos en /usr/share/doc/${PF}. Esta variable es el nombre del programa + la versión. Y doman instala el manual en /usr/share/man/manX, siendo X el sufijo que se indique en el fichero.

Este paquete en concreto necesita que el usuario cree un directorio y edite un fichero para poder funcionar, así que utilizamos la función pkg_postinst() para, una vez instalado el programa, comunicarle al usuario lo que tiene que hacer antes de poder utilizarlo. Y para ello, usamos einfo.

4.5. El fichero digest

Éste es el último paso en la creación del ebuild. El fichero digest contiene la suma md5 del fichero de la variable SRC_URI. Osea, wmbday-3.0.tar.gz. Para crearlo, hacemos:

  bastardo wmbday # ebuild wmbday-0.3.ebuild digest

5. Probando el ebuild

Es el momento de hacer emerge wmbday y ver que todo funciona:

  
  bastardo ~ # emerge -v wmbday
  Calculating dependencies ...done!
  >>> emerge (1 of 1) x11-plugins/wmbday-0.3 to /
  >>> Downloading http://ftp.heanet.ie/pub/gentoo/distfiles/wmbday-0.3.tar.gz
  --20:23:31--  http://ftp.heanet.ie/pub/gentoo/distfiles/wmbday-0.3.tar.gz
             => `/usr/portage/distfiles/wmbday-0.3.tar.gz'
  Resolviendo ftp.heanet.ie... 193.1.193.64
  Conectando con ftp.heanet.ie[193.1.193.64]:80... conectado.
  Petición HTTP enviada, esperando respuesta... 404 Not Found
  20:23:39 ERROR 404: Not Found.
  
  >>> Downloading http://linuv.uv.es/mirror/gentoo/distfiles/wmbday-0.3.tar.gz
  --20:23:39--  http://linuv.uv.es/mirror/gentoo/distfiles/wmbday-0.3.tar.gz
             => `/usr/portage/distfiles/wmbday-0.3.tar.gz'
  Resolviendo linuv.uv.es... 147.156.17.151
  Conectando con linuv.uv.es[147.156.17.151]:80... conectado.
  Petición HTTP enviada, esperando respuesta... 404 Not Found
  20:23:46 ERROR 404: Not Found.
  
  >>> Downloading http://buzzinhornetz.ath.cx/wmbday/files/wmbday-0.3.tar.gz
  --20:23:46--  http://buzzinhornetz.ath.cx/wmbday/files/wmbday-0.3.tar.gz
             => `/usr/portage/distfiles/wmbday-0.3.tar.gz'
  Resolviendo buzzinhornetz.ath.cx... 213.239.193.51
  Conectando con buzzinhornetz.ath.cx[213.239.193.51]:80... conectado.
  Petición HTTP enviada, esperando respuesta... 200 OK
  Longitud: 18,835 [application/x-tar]
  
  100%[==========================================================>] 18,835        15.45K/s
  
  20:23:54 (15.42 KB/s) - `/usr/portage/distfiles/wmbday-0.3.tar.gz' saved [18,835/18,835]
  
  >>> md5 files   ;-) wmbday-0.3.ebuild
  >>> md5 files   ;-) files/digest-wmbday-0.3
  >>> md5 files   ;-) files/wmbday-0.3-makefile.patch
  >>> md5 src_uri ;-) wmbday-0.3.tar.gz
  >>> Unpacking source...
  >>> Unpacking wmbday-0.3.tar.gz to /var/tmp/portage/wmbday-0.3/work
   * Applying wmbday-0.3-makefile.patch ...                                                       [ ok ]
  ./configure --prefix=/usr --host=i686-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --build=i686-pc-linux-gnu
  [+] simple wmbday configuration script by cache
  
  Checking system... found Linux
  Checking for xmessage... /usr/bin/xmessage
  
  [+] All done, now go on with 'make'
  >>> Source unpacked.
  gcc date.c ring.c main.c -o wmbday -O2 -march=athlon-xp -pipe -fomit-frame-pointer -m3dnow -mmmx -msse -msse2 -mfpmath=sse -Wall -L/usr/X11R6/lib -lX11 -lXext -lXpm -I/usr/X11R6/include
  >>> Test phase [not enabled]: x11-plugins/wmbday-0.3
  
  >>> Install wmbday-0.3 into /var/tmp/portage/wmbday-0.3/image/ category x11-plugins
  man:
  prepallstrip:
  strip: i686-pc-linux-gnu-strip --strip-unneeded
  strip: i686-pc-linux-gnu-strip --strip-unneeded
     usr/bin/wmbday
  >>> Completed installing wmbday-0.3 into /var/tmp/portage/wmbday-0.3/image/
  
  >>> Merging x11-plugins/wmbday-0.3 to /
  --- /usr/
  --- /usr/bin/
  >>> /usr/bin/wmbday
  --- /usr/share/
  --- /usr/share/doc/
  >>> /usr/share/doc/wmbday-0.3/
  >>> /usr/share/doc/wmbday-0.3/ChangeLog.gz
  >>> /usr/share/doc/wmbday-0.3/INSTALL.gz
  >>> /usr/share/doc/wmbday-0.3/data.sample.simple.gz
  >>> /usr/share/doc/wmbday-0.3/data.sample.vcard.gz
  --- /usr/share/man/
  --- /usr/share/man/man1/
  >>> /usr/share/man/man1/wmbday.1.gz
   * Before you can use wmbday you must create
   * the directory ~/.wmbday/ and edit the file
   * data and fill it with your friend's
   * birthdays. There is a sample in /usr/share/doc/wmbday-3.0
   * Also you can use a vcard-adress-book, creating
   * a symbolic link to it.
  >>> Regenerating /etc/ld.so.cache...
  >>> x11-plugins/wmbday-0.3 merged.
  >>> Recording x11-plugins/wmbday in "world" favorites file...
  
  >>> clean: No packages selected for removal.
  
  >>> Auto-cleaning packages ...
  
  >>> No outdated packages were found on your system.
  
  
   * GNU info directory index is up-to-date.

Ahora podemos ir a chafardear con los colegas, y dejar caer en la conversación algo como "Pues no es tan complicado eso de crear un ebuild, oye".

6. Para terminar

Hacer un ebuild de un programa sencillo, como es wmbday, tiene poca complicación, como ya hemos visto. La documentación es bastante clara, y mirar otros ebuilds en /usr/portage es de gran ayuda. Supongo que esta guía horrorizará a más de un mantenedor oficial, pero, sinceramente, creo que puede ser útil para el usuario normal.

Para mí, la parte más complicada ha sido la de hacer el parche para el Makefile, pero mirando los ejemplos de otros ebuilds, he salido adelante.

Nada más, correcciones, comentarios y demás a <<foobar (a) hierroycuero org>>.