Compilando erlang en OpenSuse
A veces las cosas en las rolling releases se rompen un poco. Me ha
pasado con el paquete de erlang
desde que lo estoy usando. Con el
agravante de ser un paquete poco utilizado por el público y, parece
ser, algo falto de mantenimiento.
El caso es que hace un tiempo ya me pasó al ir a lanzar el debugger
que me apareció un misterioso mensaje de error en el que decía, algo
así como que no se podían encontrar los drivers wx... hmmm, si está
todos instalado, como antes, pensé. Después de eso, estuve un tiempo
soportando dicho error cuando intentaba lanzar cualquiera de las
aplicaciones gráficas que vienen con erlang
. Tras una actualización
de OpenSuse Tumbleweed, las cosas se arreglaron y achaqué los fallos
a algún problema con los paquetes y no le presté más atención. Seguí
trabando con erlang
con normalidad hasta que volvió a romperse por
el mismo sitio. Vaya, ¡tengo que depurar el error del raytracer!
Comencé a investigar qué pasaba, miré en los issues de OpenSuse,
no encontré ninguno que se refiriera a lo que me estaba pasando a mí.
Pero sí encontré un problema parecido en otras distribuciones. Un
hilo del que tirar, pensé. Después de haberlo mirado bien, parece ser
que la conclusión era que la librería wx_erlang
estaba compilada con
un compilador1 diferente al que estaba destinada. ¿Y si tengo
instalados paquetes de dos versiones distintas? Lo comprobé y no: mis
paquetes eran todos para la misma versión y del mismo proveedor...
¿Cómo puedo probarlo? Pues compilando mi librería wx_erlang
... a
ver, que la busco. Vaya, está junto a todo el código de erlang
.
Tenía tres opciones: separarlo, bajar todo el código o me esperarme a
que se arregle con la siguiente actualización.
Nah, me bajo todo, compilo erlang
; que ya le tengo ganas y además
me da para un artículo del blog. Y aquí me tenéis escribiendo un
artículo que demuestra lo friki que puedo llegar a ser.
Pues eso: ¡manos a la obra!.
Compilando
Para compilar código fuente, necesitamos el código fuente2. En la
página web de erlang
nos sugieren descargar o bien un fichero
.zip
(o .tar.gz
, según nuestro sistema operativo), o bien
descargarlo de su repositorio en github
. Yo opté por esta última.
Supongo que bajar el código en un paquete zip
o tar.gz
debe ser
similar a la hora de compilar. En todo caso, no está de más que le
echéis un ojo a los clásicos README
e INSTALL
por si acaso.
git clone https://github.com/erlang/otp.git
Supongo que si te estás leyendo esto es porque piensas ahorrarte la árida lectura de la documentación que viene junto con el código, pero ya te digo que sólo podrás hacerlo si todo va bien. Es decir, si sigues estos pasos, que son el resumen de los que yo he hecho, después de limpiar y depurar algunos errores que me encontré. Por ejemplo, cosas tan básicas como las herramientas que necesitas para compilar:
Las dependencias para la compilación son:
- GNU
make
. autoconf
para generar elMakefile
.- Un compilador de
C
: bien el GNU C Compilergcc
o el compilador para LLVM,clang
. Perl 5
- GNU
m4
: Si se activa el soporte para código nativoHiPE
. Se puede desactivarHiPE
utilizando el flag--disable-hipe
al configurar la compilación. ncurses
,termcap
, otermlib
: Se necesitan las cabeceras y las librerías que se conocen generalmente comoncurses-devel
. Se puede eliminar esta dependencia utilizando el flag--without-termcap
al configurar la compilación, pero eso desactivará las facilidades de edición de línea en elshell
deerlang
.sed
: El Stream Editor para que los scripts puedan modificar texto básico.wxWidgets
: también el paquetedev
, las cabeceras de desarrollo que proporcionan la herramientawx-config
. Esto es necesario para compilar las herramientas gráficas, como elobserver
o eldebugger
.
Si lo tienes instalado ya para los siguientes pasos, mejor. Yo tuve
que realizar varias veces el configure
porque también soy un
cagaprisas y no me leí bien las dependencias3. Una vez
satisfechas las necesidades previas vamos al tajo.
Otro escollo que saltar: Establecer el directorio base. Resulta que
los scripts intentan encontrar dónde está el código fuente a través
de la variable ERL_TOP
. También viene en la documentación, pero me
di cuenta después de haber recibido algún que otro error incompresible
intentando compilar. Así que recapitulamos: Hemos bajado el código con
git
y vamos a compilar.
cd opt export ERL_TOP=`pwd`
Primero entramos en el directorio donde se ha descargado el código y establecemos una variable de entorno para no tener sobresaltos cuando el proceso necesita buscar el código en algún sitio.
Hasta aquí no hay mucho más que contar, todavía no deberías haber
encontrado ningún problema. Ahora al iniciar la compilación es cuando
nuestro sistema puede presentar algún problema para completar el
proceso. El primero es que... ¡No hay makefile
!. A ver,
tranquilidad, había que hacer lo del configure
... a no, que no hay
ningún fichero configure
tampoco, hay que generarlo:
./otp_build autoconf ./cofigure --help
La segunda línea de ese bloque de código es absolutamente
discrecional, yo la aconsejo para que veáis todas las opciones con que
se puede compilar erlang
, con todas sus librerías y herramientas o
sólo la máquina virtual o HiPE
o etc. La primera línea es la
importante y la que nos genera el fichero configure
para continuar
el proceso.
./configure --prefix=~/opt
En mi caso, puesto que es una compilación para mí sólo me tengo creado
un directorio local, dentro de mi home
donde voy metiendo esos
paquetes que me voy compilando para mí. Dentro de ese directorio
~/opt
están sus correspondientes directorios bin
, share
, lib
,
etc. Además, en mi .bashrc
ya tengo añadido el path
a ~/opt/bin/
y por tanto no tengo que hacer nada más. Es posible que tú lo quieras
meter en /local
o en /usr/local
, que cada uno tenemos nuestras
cadaunadas.
En todo caso, si todas las dependencias están bien y ese paso no arroja ningún error irresoluble nos queda compilar:
make make install
Si sólo quieres generar los ejecutables, ya has terminado. Si, como es
mi caso, estás montándote tu sistema de desarrollo para erlang
,
seguro que querrás también tener la documentación. Hacerlo es tan
sencillo como:
make docs make install-docs
Mira en la documentación, porque así tal cual los genera todos por
cuatriplicado: html
, man
, pdf
y xml
. Lo mismo los quieres para
consultar con erlang man [lib]
, que nos mostrará la documentación de
manual. O sólo te interesa tener la documentación para consultar en
html
mientras programas, o imprimirte los pdf
para tener la
documentación en papel4.
Y si todo ha ido bien, ya tienes tu sistema perfectamente preparado
para trabajar con erlang
.
Configurar Emacs
Entiendo que a estas alturas ya tienes instalado el paquete
erlang.el
. Ya escribí un artículo en el blog de cómo
configurarlo. Sólo quiero recordaros que deberíais cambiar el
directorio donde está instalado erlang
en la configuración en
vuestro init.el
;; Configurar el sitio de erlang (require 'erlang-start) (setq erlang-root-dir "~/opt/lib64/erlang") (require 'erlang-flymake)
Conclusiones
Un sistema erlang
funcionando plenamente, compilado específicamente
para la máquina donde corre... ¿He notado diferencias? Pues sí y no.
Por ejemplo haciendo pruebas en el raytracer, los tiempos de
render se han mantenido muy parejos. Tanto que no puedo decir que
haya ningún tipo de mejora significativa.
Sin embargo, el tiempo de respuesta del sistema es mucho más rápido, o
al menos, esa sensación tengo cuando lanzo el shell o cuando dentro
de él levanto la aplicación observer
, cuya respuesta subjetiva
ahora es inmediata.
Comparando uso de memoria y procesador de ambos sistemas, tampoco percibo una diferencia significativa. Con lo cual, la única diferencia que he podido observar es la rapidez con la que se ejecuta la máquina virtual. Quizá en un sistema de producción sí se podría encontrar algunas diferencias más.
De todas formas, y después de haberme molestado en compilarlo, lo seguiré utilizando.
Comentarios