Mostrando entradas con la etiqueta portables. Mostrar todas las entradas
Mostrando entradas con la etiqueta portables. Mostrar todas las entradas

miércoles, 11 de marzo de 2020

Portables - wxwidgets - LINUX


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:

/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 . Este entorno lo puedo 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


Saludos.
Juan Galaz

Bibliografía:
     porta.html

jueves, 29 de agosto de 2019

Portables Gambas

Portables Gambas

El ecosistema Linux es un tanto caótico, existen cientos de distribuciones, cada distribución varias versiones (Debian 7, Debian 8...etc), y para colmo tenemos versiones de 32 o 64 bits.
Si uno quiere crear un programa que funcione en varias distribuciones, deberá compilar este programa para las distintas distribuciones, esto puede ser un tanto laborioso y complicado.
Para salvar este problema podemos hacer uso de las aplicaciones portables, que en teoría funcionarán en todas las distribuciones.

En este artículo explico como crear aplicaciones portables de programas realizados con Gambas.
Debemos entender que Gambas ha crecido bastante, la amplitud de librerías usadas es grande, y con cada nueva versión se aumenta. Explico esto para entender el motivo de por qué utilizo una versión de Gambas que se encuentra en Debian 7.  El mismo programa Clock que viene como ejemplo en Gambas, al transformarlo a portable en Debian 9 nos ocupa 50 Megas, si lo creamos utilizando Debian 7 nos ocupa 25 Megas , la mitad.
En teoría, después de creado, se puede ejecutar en distintas distribuciones, e incluso  en 64 bits sin retocar nada.
Para terminar utilizo makeself, crea un ejecutable compacto. Se auto descomprime en el directorio tmp y se ejecuta. Este último paso no es obligatorio, pero queda muy presentable.

Como ejemplo voy ha utilizar el programa Clock que viene como ejemplo en Gambas de Debian 7.
El entorno de ejecución de Debian 7 se realiza sobre una máquina virtual con VirtualBox.

Una vez cargado y ver que funciona bien, creamos el fichero ejecutable llamado Clock.gambas.
Para comprender el entorno, he creado un usuario llamado portable, y dentro de este usuario el directorio bin, es donde guardo el ejecutable  Clock.gambas.

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 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/portable/bin  junto con  Clock.gambas.
Entramos en una consola y tecleamos:
cd /home/portable/bin
./cde_2011-08-15_32bit gbr3 Clock.gambas


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  clock

En el directorio clock creamos un fichero llamado programa con lo siguiente:

#!/bin/sh
cd cde-root/home/portable/bin
./gbr3.cde  Clock.gambas


Damos permiso de ejecución con chmod ugo+x  programa
Ahora podemos probar el programa ejecutando el fichero programa.

En alguna ocasiones gambas busca iconos y directorios en el sistema , no hacen falta, por lo que conviene mirar el directorio que genera cde, para eliminar algún que otro archivo que no hace falta y tienen un gran tamaño. Para este caso no ha hecho falta, pero para otro que hice BarCode, eliminé 25 Megas.

Para trasladarlo a otro ordenador lo comprimimos con la orden:  tar -czvf  clock.tar.gz  clock
En otro ordenador lo descomprimimos con:    tar -xzvf clock.tar.gz
Y lo podemos ejecutar con el ejecutable programa.

Entorno 32 bits

Entorno 64 bits

makeself
Esta opción de tener el ejecutable portable en un directorio esta bien, pero algunos pensarán que se vería mejor si fuese un solo fichero que se ejecutara directamente.
Para esta opción tenemos el programa makeself , está en la mayoría de las distribuciones, y sirve para hacer un fichero ejecutable auto extraíble .
Con la orden:

makeself clock  clock.run "Clock" ./programa

creamos un fichero comprimido ejecutable con en nombre clock.run.
El único inconveniente es que crea un terminal junto con el programa.
También he visto que si se intenta ejecutar el programa en un entorno de 64 bits, debes hacerlo desde consola, no he querido averiguar el motivo.


Como podéis ver, puede resultar un poco laborioso al principio, pero al ver funcionar el programa en diferentes distribuciones sin problemas de librerías, nos da muchas alegrías.
También he realizado otros dos programas portables. Uno es de Gambas, BarCode, y el otro xcalc, un clásico del entorno Xwindows.

PROGRAMAS


Espero que les haya gustado el artículo.

Saludos.
Juan Galaz