Notxor tiene un blog

Defenestrando la vida

Compilando erlang en OpenSuse

2020-12-12

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 el Makefile.
  • Un compilador de C: bien el GNU C Compiler gcc o el compilador para LLVM, clang.
  • Perl 5
  • GNU m4: Si se activa el soporte para código nativo HiPE. Se puede desactivar HiPE utilizando el flag --disable-hipe al configurar la compilación.
  • ncurses, termcap, o termlib: Se necesitan las cabeceras y las librerías que se conocen generalmente como ncurses-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 el shell de erlang.
  • sed: El Stream Editor para que los scripts puedan modificar texto básico.
  • wxWidgets: también el paquete dev, las cabeceras de desarrollo que proporcionan la herramienta wx-config. Esto es necesario para compilar las herramientas gráficas, como el observer o el debugger.

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.

Nota al pie de página:

1

Entiendo que se referían a erlc.

2

¿Véis lo inteligente que puedo llegar a ser? He llegado yo solo a esa conclusión y todo.

3

Vale, lo confieso, no me las leí... me hubiera ahorrado bastante tiempo.

4

Compra una carretilla de papel, si es el caso.

Categoría: erlang opensuse

Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, he decidido no proporcionar dicha opción en el Blog. Si alguien quiere comentar algo, me puede encontrar en Mastodon y en Diaspora con el nick de Notxor.

También se ha abierto un grupo en Telegram, para usuarios de esa red.

Disculpen las molestias.