Acostumbrado a utilizar log4cxx como librería de registro desde C++ en Red Hat intenté hacer lo mismo en Kubuntu 10.10 64bits. Existe un paquete binario que permite la instalación de la librería en su versión de 64 bits, pero no en 32 bits, que es en la arquitectura para la que quería compilar.
Actualización: ahora, con Debian Wheezy (versión testing pero congelada en el momento de escribir esto) no sé si realmente utilizaré el entorno de desarrollo de 32bits, pero de todas formas introduzco las diferencias en el procedimiento.
Lo primero que pensé fue en compilar la versión de 32 bits, pero la compilación de los fuentes de Apache Runtime (dependencia de log4cxx) fallaba y no encontraba mucha ayuda en Internet sobre el problema, por lo que decidí buscar una solución que me solucionara este problema y el de otras posibles librerías que quisiera utilizar más adelante y que pudieran dar el mismo problema.
La solución universal parecía consistir en instalar un entorno de 32 bits y ejecutar las aplicaciones de desarrollo directamente en ese entorno mediante una jaula chroot. A continuación se explica como conseguir este entorno e instalar eclipse y la librería log4cxx en sus versiones de 32 bits.
El procedimiento se obtuvo desde 32-Bit Chroot How-To, sustituyendo únicamente hoary por maverick, la versión de Kubuntu que utilizo. Con los 5 pasos indicados en ese artículo se consigue un sistema de 32 bits ejecutable en una jaula chroot y con synaptic instalado para poder seguir instalando las aplicaciones que se necesiten.
A continuación instalé en el sistema de 32 bits Eclipse (desde Eclipse luego instalo el paquete de desarrollo para C++), libcanberra-gtk-module, build-essential, liblog4cxx-dev y, para que se viera de forma agradable gtk2-engines-qtcurve.
Eso es suficiente para compilar y editar desde el entorno de 32 bits, pudiendo disponer de librerías precompiladas para 32bits como log4cxx.
Procedimiento completo:
Paso 1:
sudo apt-get install dchroot debootstrap
sudo mkdir /chroot/
sudo gedit /etc/dchroot.conf
Añadir la siguiente línea a /etc/dchroot.conf:
maverick /chroot
Instalar el sistema base:
sudo debootstrap --arch i386 maverick /chroot/ http://archive.ubuntu.com/ubuntu
y, opcionalmente, configurar la localización del sistema enjaulado, desde su propia jaula:
sudo chroot /chroot/ dpkg-reconfigure locales locale-gen es_ES.UTF-8
Actualización: Para el caso de Debian Wheezy el contenido de /etc/dchroot.conf es ignorado, ya que dchroot se ha convertido en un simple envoltorio de schroot, mantenido únicamente por comptabilidad, por tanto la siguiente línea habrá que introducirla en /etc/schroot/schroot.conf:
[wheezy32]
description=Debian Wheezy (testing) 32 bits
directory=/chroot
users=mi_usuario
groups=mi_grupo
root-groups=root
En /etc/schroot/schroot.conf se pueden definir múltiples entornos de jaula, cada uno con un nombre. Aquí se le ha dado el nombre wheezy32. Con schroot -l se pueden ver los entornos de jaula disponibles y con schroot –chroot <nombre_jaula> entrar en un intèrprete de comandos dentro de una de ellas. Si no se especifica un nombre de jaula intentará entrar en la que se llame default, devolviendo un error en caso de que no exista.
Para iniciar el comando debootstrap, se entra en el entorno de jaula deseado y se ejecuta la orden correspondiente:
schroot --chroot wheezy32 debootstrap --arch i386 wheezy /chroot/ http://ftp.debian.org/debian
Paso 2:
Añadir las siguientes líneas al fichero /chroot/etc/apt/sources.list
(desde el punto de vista del sistema anfitrión):
deb http://archive.ubuntu.com/ubuntu maverick main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu maverick-security main restricted universe multiverse
Para Debian Wheezy:
deb http://ftp.pt.debian.org/debian wheezy main contrib non-free deb http://ftp.debian.org/debian/ wheezy-updates main contrib non-free deb http://security.debian.org/ wheezy/updates main contrib non-free
Paso 3:
Desde el entorno chroot (chroot /chroot
) actualizar el sistema:
apt-get update ; apt-get upgrade
Paso 4:
En otra sesión de terminal, o saliendo de nuevo de chroot, ejecutar lo siguiente:
sudo cp /etc/passwd /etc/shadow /etc/group /etc/sudoers /etc/hosts /chroot/etc/
Editar el fichero /etc/fstab
(del sistema real, sí, no del entorno chroot) y añadir las siguientes líneas:
/home /chroot/home none bind 0 0
/tmp /chroot/tmp none bind 0 0
/dev /chroot/dev none bind 0 0
/proc /chroot/proc proc defaults 0 0
/media/cdrom0 /chroot/media/cdrom0 none bind 0 0
/usr/share/fonts /chroot/usr/share/fonts none bind 0 0
A continuación ejecutar las siguientes órdenes:
sudo mkdir /chroot/media/cdrom0
sudo mkdir /chroot/usr/share/fonts
sudo mount -a
Crear un fichero /usr/local/bin/do_dchroot
con el siguiente contenido:
#!/bin/sh
/usr/bin/dchroot -d "`echo $0 | sed 's|^.*/||'` $*"
En el caso de Wheezy,el fichero sería, por ejemplo para una jaula llamada wheezy32, /usr/local/bin/do_schroot_wheezy32, y su contenido el siguiente:
#!/bin/sh /usr/bin/schroot --chroot wheezy32 --preserve-environment "`echo $0 | sed 's|^.*/||'`" $*
No olvidar darle permisos de ejecución:
sudo chmod 755 /usr/local/bin/do_dchroot
o
chmod 755 /usr/local/bin/do_schroot_wheezy32
Paso 5:
Ejecutar las siguientes órdenes para crear un enlace para poder ejecutar synaptic en el entorno chroot directamente desde el entorno anfitrión local.
dchroot -d
sudo apt-get install synaptic
sudo ln -s /usr/sbin/synaptic /usr/sbin/synaptic32
exit
sudo ln -s /usr/local/bin/do_dchroot /usr/local/bin/synaptic32
sudo synaptic32
Para Wheezy sustituir siempre la llamada a dchroot por la siguiente llamada a schroot:
schroot --chroot wheeezy32 --preserve-environment
Paso 6:
Por último se instala eclipse y algunos paquetes adicionales y se crea el correspondiente enlace (liblog4cxx10-dev no es necesario para Eclipse, pero yo utilizo dicha librería para el log de los programas que desarrollo en C++):
dchroot -d
sudo apt-get install eclipse build-essential libcanberra-gtk-module liblog4cxx10-dev gtk2-engines-qtcurve
sudo ln -s /usr/bin/eclipse /usr/bin/eclipse32
exit
sudo ln -s /usr/local/bin/do_dchroot /usr/local/bin/eclipse32
eclipse32
Si ya se había utilizado Eclipse en el entorno de 64 bits, a menos que se utilice un directorio home distinto en las versiones de 32 y 64 bits (no inluyendo o modificando la línea de /etc/fstab que monta /home en /chroot/home), será necesario eliminar el directorio ~/.eclipse y el .metadata de nuestro espacio de trabajo. Además hay que dejar de utilizar el Eclipse de 64bits si no se quiere corromper la configuración que se almacenará en estos directorios.
Actualización:
Aunque eclipse compilaba correctamente y parecía funcionar sin problemas, al ejecutar el código dentro de eclipse se producía un error indicando «cannot create pty», es decir, no puede crear la terminal virtual para la salida del programa a ejecutar.
No he dado con una solución permanente, sólo con una que ejecutada una vez es válida hasta que se vuelva a reiniciar el sistema, ésta consiste en montar el dispositivo manejador de terminales dentro del entorno chroot:
sudo mount pts /dev/pts -t devpts
Esto se obtuvo de http://forum.dsmg600.info/viewtopic.php?pid=29501#p29501 y http://xtor.warp.es/?p=49
¿Conoce alguien una solución permanente?