viernes, 6 de diciembre de 2019

Reduciendo las dependencias de PSeInt en GNU/Linux

Así como me vi obligado a repensar el "paquete" de PSeInt para macOS a raíz del problema de los 64bits; tuve problemas similares en GNU/Linux. Para empezar, una de las principales bibliotecas del sistema que necesito ya no aparece en todas las distribuciones. Por seguir, una nueva que agregué por el tema del renderizado de texto también trajo sus problemas.


La primer dependencia a la que me refería es GTK. Las distros no han dejado de incluir GTK; pero sí ocurre que han empezado a dejar de lado la serie 2.x, en favor de la 3.x. De forma similar a como me pasó a mi con wx; GTK  3 está desde hace rato pero no es tan trivial migrar un programa desde GTK 2. Entonces, muchos paquetes todavía dependen de GTK 2, por lo que se sigue manteniendo desde hace años e incluyendo en la mayoría de las distribuciones.

Programa muy importantes para el ecosistema del software libre, como el GIMP, aún están en proceso de migración. Por esto, en cualquier distro se puede instalar GTK 2 con cierta facilidad. Pero el hecho de que haya que instalarla es un pequeño escalón más para los usuarios principiantes, que sería mejor no tener.

En mi caso, no me importa tanto hacérselas instalar a los usuarios de ZinjaI (y de hecho de momento no tengo otra salida); pero sí a los de PSeInt, ya que esos se supone que son mucho menos experimentados. E instalar una biblioteca no es siempre tan amigable como instalar un programa. En Ubuntu 19, por ejemplo, GTK 2 no se instala con el sistema base. Desde una consola, con un "simple" (nótense las comillas) apt-get se consigue; pero no todos saben que las consolas no muerden.


Y ¿de dónde sale esta dependencia? Pues bien, wxWidgets, en GNU/Linux, es como un wrapper sobre GTK. Obviamente wx 2 funcionaba sobre GTK 2. Pero ahora que PSeInt funciona con wx 3, puedo compilar wx 3 de modo tal que funcione sobre GTK 3.

Al igual que cuando paso de un sistema a otro, si paso de un GTK a otro aparecen pequeñas asperezas que limar. Algo de eso estuve haciendo, y parece que ahora todo anda con normalidad. El detalle es que si me quedo con esta versión, en muchas distros viejas dejará de funcionar, porque no solo usa un GTK más nuevo, sino que está compilada sobre todo un sistema base más nuevo.

Entonces, para no elevar los requerimientos, lo que voy a hacer por un tiempo es incluir en el paquete para GNU/Linux (solo en el de 64bits) ambas versiones: un PSeInt con wx2 sobre GTK2, y otro con wx3 sobre GTK3. El lanzador tratará primero de lazar el nuevo, y si falla lanzará el viejo. Así, a todos debería funcionarles sin instalar nada. Si tienen un sistema no taaan viejo y GTK 3, verán los nuevos detalles de wx3. Si no, seguirá como siempre.


La otra biblioteca problemática fue glew. La agregué inicialmente para poder usar las extensiones de OpenGL, porque necesitaba cargar shaders para el antialiasing del texto en psdraw. Por suerte no soy el único que pensó que era poca cosa para justificar toda una dependencia, y buscando en google aparecen algunas alternativas. Terminé optando por una pequeña biblioteca que es parte de Papaya (un editor de imágenes que hace uso intensivo de la GPU), llamada gl_lite, que hace lo que necesito y no mucho más. Así que glew ya no será un requisito adicional.

De forma similar, ya que estaba saqué también freeglut (otra que no viene de serie). La usaba solo para algunos textos particulares, pero ahora uso el nuevo mecanismo para todo y me la evito.

Con todo esto, aproveché para también para  "refrescacar" los scripts que uso para compilar y empaquetar todo, en sus varias versiones. De rebote, ahora debería ser un poco más fácil que un usuario intente compilar PSeInt por su cuenta. Aunque esto sigue sin ser necesario para el 99% de los mismos. A esa gran mayoría, espero que la nueva versión les funciones sin problemas, sea cual sea su sistema. Hay mucho tiempo invertido para esto en las últimas semanas.

9 comentarios:

  1. PSeInt no compila en debian...
    Aparece el siguiente error:
    g++ -O2 `wx-config --cppflags --unicode=yes --version=3.0` -DFOR_WXPSEINT -DWX3 -c mxSource.cpp -o ../temp/wx_lnx3_rls/mxSource.o
    mxSource.cpp: In constructor ‘mxSource::mxSource(wxWindow*, wxString, wxString)’:
    mxSource.cpp:140:54: error: ‘wxSTC_KEYMOD_CTRL’ was not declared in this scope; did you mean ‘wxSTC_SCMOD_CTRL’?
    140 | CmdKeyAssign(c, wxSTC_KEYMOD_CTRL,0);
    | ^~~~~~~~~~~~~~~~~
    | wxSTC_SCMOD_CTRL
    mxSource.cpp:141:35: error: ‘wxSTC_KEYMOD_SHIFT’ was not declared in this scope; did you mean ‘wxSTC_SCMOD_SHIFT’?
    141 | CmdKeyAssign(c, wxSTC_KEYMOD_SHIFT ,0);
    | ^~~~~~~~~~~~~~~~~~
    | wxSTC_SCMOD_SHIFT
    mxSource.cpp:143:18: error: ‘wxSTC_KEYMOD_ALT’ was not declared in this scope; did you mean ‘wxSTC_SCMOD_ALT’?
    143 | CmdKeyAssign(c,wxSTC_KEYMOD_ALT ,0);
    | ^~~~~~~~~~~~~~~~
    | wxSTC_SCMOD_ALT
    mxSource.cpp: In member function ‘void mxSource::SetStyling(bool)’:
    mxSource.cpp:343:23: error: ‘wxSTC_ANNOTATION_INDENTED’ was not declared in this scope; did you mean ‘wxSTC_ANNOTATION_HIDDEN’?
    343 | AnnotationSetVisible(wxSTC_ANNOTATION_INDENTED);
    | ^~~~~~~~~~~~~~~~~~~~~~~~~
    | wxSTC_ANNOTATION_HIDDEN
    make[2]: *** [Makefile.common:16: ../temp/wx_lnx3_rls/mxSource.o] Error 1


    ResponderEliminar
  2. Disculpe, he tenido problemas para ejecutar PSEINT en mi Arch Linux y necesito ayuda, yo uso Wayland como servidor gráfico. El único error que reporta es:

    Error: Unable to initialize gtk, is DISPLAY set properly?

    ResponderEliminar
  3. Saludos buen día, comentarte que estoy queriendo compilar pseint para Raspberry PI con una versión linux debian buster 32bits compilada para los procesadores ARM, pero cuando intento la compilación aparece lo siguiente y se detiene, me podrias por favor orientarme al respecto de antemano muchas gracias.

    tmp/ccZWSxj0.s: Mensajes del ensamblador:
    /tmp/ccZWSxj0.s:210: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:1567: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:1750: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:1770: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:1794: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:1901: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:2152: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:2240: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:6117: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:6142: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:6161: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:6177: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:6193: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:7467: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:7566: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:7588: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:7604: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:7620: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:13074: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:13176: Error: instrucción equivocada «int3»
    /tmp/ccZWSxj0.s:13205: Error: instrucción equivocada «int3»
    make[2]: *** [Makefile.common:19: ../temp/exp_lnx_rls/new_evaluar.o] Error 1
    make[2]: se sale del directorio '/home/pi/Downloads/pseint-code/psexport'
    make[1]: *** [Makefile.lnx3:3: all] Error 2
    make[1]: se sale del directorio '/home/pi/Downloads/pseint-code'
    make: *** [Makefile:17: linux3] Error 2

    ResponderEliminar
    Respuestas
    1. Puede buscar en el código 'asm("int3")' y reemplazarlo por 'asm("nop")'. Lo uso a modo de assert (https://cucarachasracing.blogspot.com/2012/07/como-prepararse-para-enfrentar-un.html), pero solo sirve para depuración, no afecta el normal funcionamiento. Más aún, esas lineas no se compilan en modo release.

      Eliminar
    2. Gracias zaskar por responde y disculpa mi ignorancia, en cual archivo tengo que hacer esa modificación que mencionas.
      De antemano gracias

      Eliminar
    3. Ya encontré el archivo es pseint/Variant.h
      Gracias.

      Eliminar
  4. Saludos, comentarte que he logrado compilar el PseInt para la Raspberry PI 2 32bits con debina Buster, el archivo compilado lo copié dentro de la carpeta del portable que distribuyes desde la página y funciona bien, a parte he realizado un quepeño tutorial para la compilación en la raspberry que quisiera hacerte llegar, pero no sé que opines al respecto.
    Pasa un excelente día.

    ResponderEliminar
  5. buenos dias me podrias hacer el favor de facilitarme la guia de como compilarlo para raspberry pi gracias

    ResponderEliminar
  6. Sería interesante ver cómo corre en una rpi ya que es tan básico el software

    ResponderEliminar