Ice en la fonera: Ice-E en OpenWRT
Esto va sobre Ice-E, que es simplemente Ice para dispositivos empotrados. Veamos como configurar el entorno de desarrollo necesario para compilar aplicaciones con Ice-E que funcionen en OpenWRT, concretamente en un MIPS: el de la fonera.
Ingredientes
- Una fonera (o cualquier hardware donde se pueda instalar OpenWRT y derivados)
- Las fuentes de OpenWRT (kamikaze por estas fechas)
- Las fuentes de Ice-E (que ahora va por la versión 1.2.0)
- Las dependencias de los anteriores
- Un rato libre (de rigor :-p )
Preparando el terreno
Seguro que ya has encontrado la utilidad de tener Ice en un cacharrito pequeño que tiene un atheros… así que yo no te voy a dar muchas pistas :-p. Sea cual sea ese cacharrito, debe tener OpenWRT o derivados (como lo que trae la fonera).
Lo primero que tienes que hacer es conseguir el toolchain para hacer una compilacion cruzada (cross compilation que dice algunos). En este caso, descárgate las fuentes del OpenWRT, que están disponibles en downloads.openwrt.org. Elige el micro que tengas, en el caso que nos ocupa es atheros:
lab@bart:fonera$ pwd /home/lab/fonera lab@bart:fonera$ wget -c http://downloads.openwrt.org/snapshots/atheros-2.6/OpenWrt-SDK-atheros-2.6-for-Linux-i686.tar.bz2
Paciencia, son unos 42 MiB.
También necesitas las fuentes de ZeroC Ice-E, que están en la web de ZeroC Ice:
lab@bart:fonera$ wget -c http://www.zeroc.com/download/IceE/1.2/IceE-1.2.0.tar.gz
Cuano escribí esto, hacía una semana escasa que salió la versión 1.2.0 y será esa la que usemos. Existen dos variantes, una para C++ y otra para Java. Usamos la de C++. Además necesitamos las herramientas de traducción (ya sabes, slice2XXX), que también tienes que bajarte (a menos que estén empaquetadas ya… que seguro que Paco ya lo ha hecho :-)):
lab@bart:fonera$ wget -c http://www.zeroc.com/download/IceE/1.2/IceE-trans-1.2.0.tar.gz
Bien, una vez aquí, podemos desempaquetarlo todo:
lab@bart:fonera$ ls IceE-1.2.0.tar.gz IceE-trans-1.2.0.tar.gz OpenWrt-SDK-atheros-2.6-for-Linux-i686.tar.bz2 lab@bart:fonera$ tar zxf IceE-1.2.0.tar.gz lab@bart:fonera$ tar zxf IceE-trans-1.2.0.tar.gz lab@bart:fonera$ tar jxf OpenWrt-SDK-atheros-2.6-for-Linux-i686.tar.bz2 lab@bart:fonera$ ls IceE-1.2.0 IceE-trans-1.2.0 OpenWrt-SDK-atheros-2.6-for-Linux-i686 IceE-1.2.0.tar.gz IceE-trans-1.2.0.tar.gz OpenWrt-SDK-atheros-2.6-for-Linux-i686.tar.bz2 lab@bart:fonera$
Compilando
Ahora toca configurar y compilar. Primero necesitas la toolchain del OpenWRT, que está disponible en el buildroot que te acabas de bajar. Ya te viene precompilado, pero tienes que comprobar que es la misma versión que la del kernel del chisme final (aunque esto no suele ser crítico). Si no es así, tienes que compilar e instalar el nuevo kernel. En la página sobre la fonera de OpenWRT encontrarás información sobre cómo hacer esto. También te puedes bajar el kernel compilado junto con el SDK, así te ahorras un paso.
De cualquier modo, en la carpeta staging_dir_mips tienes todas las herramientas necesarias para compilar Ice-E (y casi cualquier cosa en ANSI C/C++). Así que añade al principio del PATH la carpeta bin. Además, siguiendo las directivas de README correspondiente, tienes que establecer el compilador que usarás: mips-linux-c++
lab@bart:staging_dir_mips$ pwd /home/lab/fonera/OpenWrt-SDK-atheros-2.6-for-Linux-i686/staging_dir_mips lab@bart:staging_dir_mips$ export PATH=`pwd`/bin:$PATH lab@bart:staging_dir_mips$ export CXX=mips-linux-c++
Ya que estamos aquí, un breve apunte. Si tu dispositivo tiene poco espacio disponible, como es el caso de la fonera, te interesa que todo esto ocupe lo menos posible. Para ello, puedes hacer un par de cosas. La primera es enlazar tus programas de forma estática, por lo que necesitas hacer las librerías de IceE aptas para ello. Con esto consigues que el binario final sea autosuficiente, sin más cosas de las que necesita. Esto tiene ventajas y desventajas: por un lado aumenta el rendimiento y optimiza el espacio, pero si tienes muchos binarios que tiran de la misma librería, quizá no te convenga. Si decides hacer IceE para enlazado estático, necesitas a AR:
lab@bart:staging_dir_mips$ export AR=mips-linux-ar
En esta carpeta has terminado. Es hora de compilar IceE-trans. Evidentemente, slice2cppe lo vas a usar en la máquina de desarrollo, por lo que debes compilarlo con las herramientas habituales. Abre un nuevo terminal y vete a donde descomprimiste IceE-trans. Puedes ejecutar make sin miedo… e irte a tomar algo :-p
¿Ya? Bien, pues ahora instálalo con el consabido make install como root. Te creará una carpeta en /opt/ llamada IceE-1.2.0 con los binarios necesarios. Esto también lo necesitarás en el PATH, así que en el otro terminal (en el que empezaste), añádelo:
lab@bart:IceE-trans-1.2.0$ ls /opt/IceE-1.2.0/bin/ icecpp slice2cppe slice2javae lab@bart:IceE-trans-1.2.0$ export PATH=/opt/IceE-1.2.0/bin/:$PATH lab@bart:IceE-trans-1.2.0$
¿Listo para compilar IceE? Vale, pues vete a la carpeta donde se extrajo. Antes de compilar, tienes que editar las reglas del make, para reducir el tamaño de las librerías y hacerlas estáticas (si quieres). Si no cambias nada, sólo las librerías te ocuparán unos 20 MiB, porque se añaden los símbolos para depuración. Yo en mi caso, las hice estáticas y además com optimización de tamaño (sin símbolos) y me ocupan sobre los 3 MiB.
Edita el fichero Make.rules que está dentro de config. Está muy bien documentado, por lo que no creo que tengas muchos problemas. Descomenta las líneas siguientes:
OPTIMIZE_SIZE = yes STATICLIBS = yes
Ahora, ya puedes compilar:
lab@bart:IceE-1.2.0$ pwd /home/lab/fonera/IceE-1.2.0 lab@bart:IceE-1.2.0$ make ...
Tardará un rato en terminar. Cuando lo haya hecho, habrá compilado las librerías estáticas y unos tests. Si observas, las librerías ocupan sobre 6.7 MiB, pero cuando enlaces sólo se llevará tu programa lo que necesite. Si las haces dinámicas, el tamaño total será alrededor de 3.2 MiB, pero las necesitarás enteras. Si haces un servidor sencillo, estático te ocupará alrededor de 1.7 MiB, dinámico será de 300 KiB + 3.2 MiB de la lib. La elección es tuya. :-p
Después de este rollete, habrá terminado ya la compilación, ¿no? Pues entonces tira esa cafetera… es broooma :-)
Probando
Buno, supongamos que es mañana por la tarde y has terminado de compilar (sin lamentar daños). ¡Pues ya lo tienes! En los demos, hay un hola mundo sencillo que puedes probar. Métete en la fonera y envíate el fichero: IceE-1.2.0/demo/IceE/minimal/server
(NOTA: cambia los nombres…)
lab@bart:minimal$ nc -l -p 5555 -q 0 < server & lab@bart:minimal$ ssh root@fonera ... root@fonera:~# nc bart 5555 > server root@fonera:~#
Si lo ejecutas, verás que te dice que faltan cosas. Me temo que no toda la compilación ha sido estática. Bueno, no pasa nada. Lo más probable es que te falte la librería de hilos y la de std c++. Sean las que sean, si te lo ha enlazado, deben estar en el buildroot, en OpenWrt-SDK-atheros-2.6-for-Linux-i686/staging_dir_mips/lib. Cópialas en la fonera, en /lib y haz los enlaces correspondientes…
¿Ya? Bueno, pues cuando ejecutes el server y no te falten librerías, lo que te faltará es un fichero de configuración: el config, cópialo en la fonera o hazte uno y lanza de nuevo. Si se queda esperando, es posible que lo hayas conseguido :-p ¡Enhorabuena! Ahora puedes probarlo con el cliente (TIP: el proxy esta en el config :-p)
Y ya está. Ahora sólo te queda buscarle usos, que te aseguro que tiene muchos…