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.
"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.
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.
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.
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í.
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:
El fichero queda de esta guisa.
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:
`x11-plugins/wmbday ~x86` al
fichero /etc/portage/package.keywords.
`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.
É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
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".
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>>.