ZeroC-IceE para el Chumby
Veamos una forma de compilar ZeroC-IceE para usarlo en el Chumby.
Esta receta se parecerá mucho a su análoga de Ice en la fonera: Ice-E en OpenWRT. La diferencia estriba en que la plataforma destino, en vez de ser MIPS es ARM. Realmente, esta vez creo que va a ser más sencillo :-p
Ingredientes (para todos los Chumbys :-))
- Tener la toolchain afilada y lista para usar. Puedes seguir mi anterior receta (Entorno de desarrollo para el Chumby), o no. Para esta receta, asumiré que así es.
- Las fuentes de ZeroC-IceE
Primero los translators
Como sabrás, para poder usar IceE, es necesario disponer de los translators, que crean los stubs a partir de las interfaces Slice que vayamos a usar. Puesto que son generadores de código, y por tanto, se ejecutan en la máquina que usamos para desarrollar, no se deben compilar para ARM. Así pues, los instalamos como si de cualquier otra cosa se tratara:
<b>CHROOT@Chumby</b>:~# apt-get update
<b>CHROOT@Chumby</b>:~# apt-get install icee-translators
Esto sería lo ideal, pero si solo tienes los sources de SID, a día de hoy (28/07/08) te va dar un errorcito tal que así:
Los siguientes paquetes tienen dependencias incumplidas:
icee-translators:
Depende: slice2cppe pero no va a instalarse
Depende: slice2javae pero no va a instalarse
Tranquilidad, no te asustes. Se soluciona colocando los repos de Lenny (que sí tienen lo que hay que tener…):
<b>CHROOT@Chumby</b>:~# cat /etc/apt/sources.list
deb http://ftp.es.debian.org/debian sid main contrib non-free
deb-src http://ftp.es.debian.org/debian sid main contrib non-free
<b>CHROOT@Chumby</b>:~# echo "deb http://ftp.es.debian.org/debian/ lenny main contrib non-free" >> /etc/apt/sources.list
<b>CHROOT@Chumby</b>:~# apt-get update
<b>CHROOT@Chumby</b>:~# apt-get install icee-translators
...
Con esto debería bastarte. Si aún así sigues teniendo problemas, siempre te queda la opción de bajarte las fuentes de la Web de ZeroC-IceE. De nuevo, a día de hoy es posible que cuando vayas a compilar los translators, te encuentres con el siguiente problema:
c++ -c -I.. -I../../include -DICE_API_EXPORTS -ftemplate-depth-128 -Wall -D_REENTRANT -fPIC -g BasicStream.cpp
In file included from ../../include/IceE/Proxy.h:25,
from ../../include/IceE/BuiltinSequences.h:22,
from ../../include/IceE/Properties.h:16,
from BasicStream.cpp:11:
../../include/IceE/Outgoing.h:54: error: ISO C++ forbids declaration of ‘auto_ptr’ with no type
../../include/IceE/Outgoing.h:54: error: invalid use of ‘::’
../../include/IceE/Outgoing.h:54: error: expected ‘;’ before ‘<’ token
../../include/IceE/Outgoing.h:92: error: ISO C++ forbids declaration of ‘auto_ptr’ with no type
../../include/IceE/Outgoing.h:92: error: invalid use of ‘::’
../../include/IceE/Outgoing.h:92: error: expected ‘;’ before ‘<’ token
Que se soluciona de una forma un tanto… en fin, se soluciona añadiendo las siguientes lineas en los siguientes ficheros:
En include/IceUtil/Config.h:
//
// Some include files we need almost everywhere.
//
#include <string.h> /* <------ Esta linea */
#include <limits.h> /* <------ Esta linea */
#include <cassert>
...
En include/Slice/DoNetNames.h:
#ifndef DOTNETNAMES_H
#define DOTNETNAMES_H
#include <string.h> /* <------ Esta linea */
#include <string>
namespace Slice
{
...
Esta es la manera que se me ha ocurrido a mi, seguro que encuentras una mucho mejor. Si así es, te agradecería que me lo comentaras. Si necesitas algún paquete más para compilar los translators, sabes que usando apt-get build-dep icee-translators se instalan, ¿verdad? :-p
Compilar IceE
Ahora toca la parte más jugosa :-). Creo (y si no llevo razón, por favor, quitadmela) que IceE no esta empaquetado para ARM, o por lo menos, no esta en los repos oficiales. Por ello, lo primero es descargarse las fuentes. Lo puedes hacer desde la web de ZeroC-IceE o usando el repositorio de Debian, tú eliges.
Nota: si no te has descargado antes las fuentes de ningún paquete y estas en el chroot de mi anterior receta, necesitas instalarte el paquete dpkg-dev.
<b>CHROOT@Chumby</b>:ice# apt-get source zeroc-icee
...
Ahora es buen momento para configurar la instalación. Entra en el directorio de Ice. En el fichero config/Make.rules tienes algunos parámetros con los que jugar. Aquí dependerá de tus necesidades en concreto. Yo, personalmente, he dejado las siguientes variables así:
prefix = /usr/icee
OPTIMIZE_SPEED = yes
STATICLIBS = yes
Tendrás que modificar tus variables de entorno para que el compilador busque en las rutas correspondientes a esta instalación (es decir, en /usr/icee/lib y /usr/icee/include) lo que necesite (o crear enlaces simbólicos…). Como estamos en una jaula, no importa ensuciarnos las manos ;-)
Antes de compilar, un pequeño pero importante detalle: ¡tenemos que especificar que compilador usar! Para ello, basta con:
<b>CHROOT@Chumby</b>:zeroc-icee-1.2.0# export CXX=arm-linux-g++
<b>CHROOT@Chumby</b>:zeroc-icee-1.2.0# export AR=arm-linux-ar
Y listo. Ya puedes hacer el esperado make
<b>CHROOT@Chumby</b>:zeroc-icee-1.2.0# make
<b>CHROOT@Chumby</b>:zeroc-icee-1.2.0# make install
...
Probando… un, dos…
Si tarda mucho la compilación, haztelo mirar, eso no es normal :-p Cuando haya terminado, seguro que estarás deseoso de probar el invento, ¿no? Pues lo vamos a hacer usando el típico Hello World
Para la ocasión, he empaquetado un pequeño ejemplo, que crea el servidor usando el compilador cruzado, y el cliente con el compilador para x86. De esta forma, puedes probar el ejemplo desde tu equipo y cerciorarte de que no te miento.
Para probarlo haz lo siguiente:
FIXME: esta parte esta sin terminar. para ir abriendo boca, mírate los demos en IceE-1.2.0/demo/IceE/ :-)