Página principal
Portables
wxwidgets
LINUX
Como
suelo programar con wxwidgets alguna vez, me he
encontrado que debido a las múltiples distribuciones y entornos
de 32bits o 64bits, el poder compilar un programa y poderlo
ejecutar en diferentes entornos, se hace bastante difícil.
Para salvar este problema podemos
hacer uso de las aplicaciones portables, que en teoría
funcionarán en todas las distribuciones.
En un artículo anterior había realizado un portable para gambas
porta.html , este artículo es una
continuación.
Para este artículo he tomado como ejemplo mi anterior montaje de
detección pulso max30.html , en la
versión con wxwidgets.
En la compilación normal el fichero binario ocupa 190Kbytes , un
tamaño bastante reducido.
El problema es que está compilado en Debian9 y en 32bits. Este
binario no se puede ejecutar en entornos de 64bits, además de no
poderse ejecutar en versiones donde no esté instaladas las
librerías wxwidgets v3.
Lo normal es que el usuario no se preocupe en qué entorno se
esté ejecutando el binario, lo lo primero que percibe es
frustración al no funcionar.
Existe un método para crear un entorno donde se encuentren todas
las librerías que necesite la aplicación, utilizar el programa cde.
Antes de nada he retocado el Makefile de compilación de nuestro
binario.
La versión wxwidgets
v3 utiliza librerías que nuestro programa no
utiliza, pero que de serie la incluye en la compilación.
Cambiar la línea donde aparece CONFIWX y cambiarlo
según lo siguiente:
#CONFIWX = `wx-config
--cppflags --libs`
CONFIWX =
-I/usr/lib/i386-linux-gnu/wx/include/gtk2-unicode-3.0
-I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL
-D__WXGTK__ -L/usr/lib/i386-linux-gnu -pthread
-lwx_gtk2u_xrc-3.0 -lwx_gtk2u_qa-3.0
-lwx_gtk2u_adv-3.0 -lwx_gtk2u_core-3.0 -lwx_baseu_xml-3.0
-lwx_baseu_net-3.0 -lwx_baseu-3.0
De esta forma el binario será del mismo tamaño, pero quitaremos
las librerías no necesarias -lwx_gtk2u_webview-3.0
-lwx_gtk2u_html-3.0 , y reduciremos en
100Megas el entorno necesario.
cde
El verdadero protagonista de este artículo es cde_2011-08-15_32bit
,
http://www.pgbovine.net/cde.html
este pequeño programa de 900 Kbytes crea un directorio donde
recrea todo el entorno de librerías y demás programas que
utiliza el programa que queremos que sea portable.
Colocamos el programa cde_2011-08-15_32bit en el
directorio /home/arduino/bin/pulsowxALL3 junto
con el programa binario, en este caso programaLinux.
Entramos en una consola y tecleamos:
cd /home/arduino/bin/pulsowxALL3
./cde_2011-08-15_32bit
/home/arduino/bin/pulsowxALL3/programaLinux
Después de ejecutar el programa y cerrarlo, veremos que
nos ha creado un directorio llamado cde-package , lo
cambiamos de nombre con la orden: mv
cde-package wxpulso
En el directorio wxpulso se habrá creado un
entorno donde se encuentra todas las librerías y ficheros que ha
necesitado el programa.
El tamaño del directorio es de 50M , aunque parezca mucho,
si no hubiéramos retocado el Makefile el tamaño sería de 130M.
Podemos ejecutar el fichero wxpulso/cde-root/home/arduino/bin/pulsowxALL3/programaLinux.cde
en cualquier entorno y distribución,
funcionando perfectamente.
Aquí podríamos terminar el artículo,
pero se puede mejorar aún mas.
makeself
Si no se necesita acceder a ningún fichero después de ejecutar
el programa (se destruye el entorno al terminar de ejecutar el
programa) se puede compactar y distribuirlo en un fichero.
Para esto utilizaremos el programa makeself
, que compacta un ejecutable con su entorno.
Creamos un fichero llamado programa en el directorio wxpulso
con lo siguiente:
#!/bin/sh
cd cde-root/home/arduino/bin/pulsowxALL3
./programaLinux.cde
Damos
permiso de ejecución con chmod
ugo+x programa
Ahora podemos probar el programa ejecutando el fichero programa.
Las opciones que se deben usar para utilizar el
programa makeself es:
makeself
directorio nombrePrograma_a_crear "ETIQUETA" ejecutable
En nuestro, estando en el directorio pulsowxALL3 caso
sería:
makeself wxpulso pulsowx.run "PULSOWX"
./programa
Si todo fue bien nos habrá creado un fichero ejecutable llamado
pulsowx.run con un tamaño de 20M.
El fichero pulsowx.run al ejecutarse se auto-descomprime en el
directorio /tmp del sistema , donde ejecutara el fichero
programa.
Podemos comprimir el fichero algo mas con la orden:
makeself --bzip2
wxpulso pulsowx.run "PULSOWX" ./programa
18M
o
makeself --xz
wxpulso pulsowx.run "PULSOWX" ./programa
14,5M
Pero debemos entender que debemos tener el descompresor
instalado en el sistema.
Lo normal es que no se utilice todas las funciones de la
biblioteca wxwidgets 3.x
en nuestro programa, por lo cual podemos compilarlo con la versión
de wxwidgets 2.8 ,
bastante mas liviana.
Para este caso he creado una máquina virtual con VBOX
instalando Debian7 , la cual lleva de serie la versión
de wxwidgets 2.8 .
Después de realizar todos los procesos
anteriores, podemos conseguir un fichero
ejecutable de 9M.
Este fichero ejecutable se puede utilizar en
cualquier entorno (32bit o 64bits) y
cualquier distribución.
Lo que habíamos intentado lo hemos
conseguido, distribuir programas en linux
que se pueden ejecutar en cualquier entorno.
Si nuestro programa no accede a ningún
fichero local, podemos comprimir con makeself.
Si nuestro programa tiene que acceder a
ficheros locales nos tenemos que quedar en
el paso donde creamos un entorno con cde.
Como curiosidad, también recree con cde
un entorno de compilación para wxwidgets 2.8 .
En este entorno lo puedo
compilar y ejecutar en cualquier
distribución, sin necesidad de
utilizar VBOX.
Programa compilado en
Debian7 32bits y ejecutado
en openSuse 64bits.
Librerías wxwidgets
2.8
PROGRAMA
Debemos entender que no siempre
funciona, además el programa cde
puede crear directorios con
ficheros que nunca se usan.
Conviene mirar en el directorio
que crea cde, ficheros
que no se usan para eliminarlos,
y hacer mas pequeño el entorno.
Si examinamos la consola que se
abre junto con el programa,
veremos bastantes errores de
bibliotecas que no encuentra,
pero el programa funciona.
Saludos.
Juan Galaz
Bibliografía:
porta.html