jueves, 1 de noviembre de 2012

Compilar la versión del repositorio en GNU/Linux

Para los inquietos e impacientes que quieren probar lo último de lo último, para los curiosos y corajudos que quieren ver y meter mano en los oscuros rincones del código fuente, para los que están en trabados por un bug que necesitan resuelto para ayer, para los que están aburridos, y para cualquiera que quiera colaborar o simplemente meter la nariz tras bambalinas; para todos ellos están los repositorios git. git es el sistema de control de versiones que utilizo en mis proyectos. Estos repositorios contienen el código fuente tal cual está ahora en mi PC, siempre actualizado con los últimos cambios y retoques, mucho antes de que estos aparezcan bonitamente empaquetados en una nueva versión oficial en la sección descargas. Yo lo utilizo como si fuese centralizado (aunque uno de los puntos fuertes de git es su gestión distribuida), y la versión que hay en los servidores de sourceforge es la que considero máster. Cada cambio que hago en mi PC va a parar casi inmediatamente allí.

Pero muchos usuarios no han usado nunca un software de control de versiones, o no están familiarizados con el proceso de compilación mediante makefiles y la configuración del entorno. Por ello, voy a explicar desde cero en un par de posts como preparar todo y compilar ZinjaI o PSeInt (los pasos son los mismos) desde los fuentes de estos repositorios, tanto en GNU/Linux (en este artículo) como en Microsoft Windows (en el próximo). Así, cuando comente en el blog que tengo alguna funcionalidad nueva en desarrollo, ya saben donde tienen que ir a buscarla si no quieren esperar, o si quieren ayudarme a testearla.

Para compilar ZinjaI o PSeInt en GNU/Linux actualmente se requieren mínimo tres cosas: el compilador g++, la biblioteca wxWidgets en versión 2.8 ANSI, y los fuentes del proyecto. Veamos cómo obtener cada cosa en GNU/Linux. Hay pasos que pueden variar de una distribución a otra, así que voy a tomar por ejemplo un Ubuntu 12.04, en las demás los pasos serán muy similares, y un usuario medio podrá adaptarlos fácilmente.

Vamos a trabajar desde una consola/terminal, así que abran una buscando entre sus aplicaciones konsole, terminal, xterm, lxterminal, xfce-terminal, gnome-terminal, cualquier cosa que termine en terminal probablemente sirva. Una vez allí (en la pantalla generalmente negra de la terminal/consola, que normalmente dirá algo como "usuario@ubuntu:~$" y se quedará esperando a que escribamos), empezamos a tirar comandos.


Lo primero entonces es asegurarse de tener instalado el compilador. Pueden probar escrbir "g++" y dar enter. Si la respuesta es algo como "g++: no input files" o "g++: error fatal: no hay ficheros de entrada" es porque el compilador ya está instalado. En caso contrario hay que instalarlo. En un sistema basado en Debian, como Ubuntu, los comandos serían "sudo apt-get update" (este a veces no es necesario) y "sudo apt-get install g++" (digan que Si cuando pregunte si desean continuar). También vamos a necesitar la herramienta "git" que es la que se encarga de obtener los últimos fuentes de ZinjaI o PSeInt desde el repositorio, así que ejecutamos "sudo apt-get install git" si no la teníamos.


Lo siguiente es instalar la versión 2.8.algo ANSI de wxWidgets. Normalmente, con apt-get (o el gestor de paquetes que sea), obtenemos la versión unicode. En Ubuntu por ejemplo, el paquete disponible es libwxgtk2.8-dev, que no aclara, pero es unicode. Notar que siempre que necesitemos una biblioteca para compilar algo hay que elegir el paquete que termina en dev o devel. En este caso entonces no hay un paquete adecuado, así que vamos a tener que instalar la biblioteca de otra forma: compilándola desde sus propios fuentes. No se alarmen, no es tan difícil.

Para poder compilar wxWidgets en GNU/Linux necesitamos la versión de desarrollo de GTK. Para obtenerla ejecutamos "sudo apt-get install gtk+-2.0-dev". El siguiente paso será descargar los fuentes de wxWidgets, entonces vamos a wxwidgets.org, sección "Downloads", "Current Stable Release: 2.8.12" y descargamos de esa lista el que dice wxGTK. Esperamos un rato y tendremos nuestros fuentes en un archivo .tar.bz2 o .tar.gz. Supongamos que estamos en el home, y que el navegador descargó el archivo en la carpeta "Descargas", el comando para extraerlo (si es que no lo hacen desde algún archivador gráfico) sería "tar -xzvf Downloads/wxGTK-2.8.12.tar.gz". Si por algún motivo les toca un archivo que termina en .bz2 en lugar de .gz, cambian "-xzvf" por "-xjvf". Cuando apreten enter va a crear una carpeta llamada wxGTK-2.8.12. Entramos en ella con el comando "cd wxGTK-2.8.12" y allí empieza lo divertido.


Primero hay que ejecutar "./configure --enable-ansi --disable-unicode". Este script verifica que el sistema tenga todo lo necesario y configura algunas cosas de la biblioteca (algunas dependen del sistema, otras de los argumentos como el --quiero-ansi-y-no-unicode que le estamos pasando). Si todo va bien, despues de ver unos cuantos renglones de "checking alguna cosa...." veremos algunos de "creating ...." y finalmente un resumen de la configuración. El siguiente paso es compilar. Para eso ejecutamos simplemente "make", o si tenemos una PC con, por ejemplo 4 núcleos, vale hacer "make -j 4" para que haga de a 4 pasos por vez. Esto va a llevar unos minutos, pero si no hay errores todo lo que resta es hacer que los archivos compilados se copien a las carpetas del sistema, lo cual se logra con el comando "sudo make install". Esto va a copiar unas cuantas cosas en /usr/local (si lo querían en otro lado habia que aclarar en el configure agregando "--prefix=/otro/lado"). Falta un paso más en relación a wxWidgets, que es compilar un componente adicional que no se instala por defecto. Para ello entramos a la carpeta de sus fuentes (que sí vienen incluidos) con "cd contrib/src/stc" y ejecutamos otra vez "make && sudo make install".


Ahora esta todo listo para bajar y compilar la versión más fresca posible de ZinjaI o PSeInt. Voy a tomar ZinjaI como ejemplo, pero los pasos serían similares. Lo primero es obtener los fuentes desde el repositorio git, lo cual se logra con el comando "git clone" más una dirección. Al final de las secciones de descargas se los sitios web de ZinjaI y PSeInt aparecen estos comando. Para ZinjaI sería "git clone git clone git://git.code.sf.net/p/zinjai/code zinjai-code". Esto crea una carpeta zinjai-code con los fuentes. Entramos en ella con "cd zinjai-code" y compilamos con "make linux". Si no aparece ningún error raro (podría ser que el código más reciente de ZinjaI tenga algo sin terminar que traiga problemas, por eso es versión de desarrollo), zinjai y todos sus componentes se compila y podemos luego ejecutarlo con "./zinjai". Si fuera el caso de PSeInt, los ejecutables se guardarían en una carpeta bin, por lo que habría que entrar en ella ("cd bin") antes de ejecutarlo ("./wxPSeInt").

Resumiendo entonces los pasos:
1) preparar el sistema 
   sudo apt-get update
   sudo apt-get install g++
   sudo apt-get install git
   sudo apt-get install gtk+-2.0-dev
   sudo apt-get install freeglut3-dev (solo para PSeInt)
2) compilar wxWidgets (descargar fuentes versión 2.8 desde wxwidgets.org)
   tar -xzvf Downloads/wxGTK-2.8.12.tar.gz
   cd wxGTK-2.8.12
   ./configure --enable-ansi --disable-unicode
   make && sudo make install
   cd contrib/src/stc
   make && sudo make install
3) obtener los fuentes de ZinjaI/PSeInt y compilarlos
   cd
   git clone git://git.code.sf.net/p/zinjai/code zinjai-code
   cd zinjai-code
   make linux
x) la próxima vez que quiera actualizar
   cd zinjai-code
   git pull
   make linux

Estoy seguro de que los pasos funcionan y son suficientes porque los probé en una máquina virtual con un Ubuntu 12.04 recién instalado. En el caso de PSeInt es muy probable que el "make linux" final de un error cuando compila el graficador de diagramas de flujo viejo (psdraw), quejandose por "jpeglib.h" o algo de eso, pero solo voy a decir al respecto que si llegó a ese punto pueden ejecutar wxPSeInt igual y lo unico que no funcionará será guardar en un archivo  jpg/png el diagrama (pero sí podrán verlo y editarlo en pantalla), y que en el futuro pienso deshacerme de ese módulo y unificar todo en el nuevo (psdraw2) que sí debería compilarse completo con estas instrucciones.  En el futuro además, algunas cosas podrían cambiar, por el lado de wxWidgets o por el lado de Ubuntu. Por ejemplo, en las próximas versiones de wxWidgets, el componente adicional se compilará agregando "--enable-stc" al comando del configure, por lo que los últimos pasos ("cd contrib/src/stc" y "make && sudo make install") no serán necesarios. Pero este es el único cambio importante que se me ocurre. Si hay algo nuevo muy raro, editaré el post agregando la aclaración.

Espero que les sirva, ya sea para probar las versiones de desarrollo o para aprender un poquito sobre cómo bajar y compilar software desde sus fuentes. Si algo falla o no esta claro no dejen de preguntar en los comentarios. En el próximo post contaré cómo hacerlo en Microsoft Windows.

21 comentarios:

  1. En la ultima versión del código en el repositorio faltan los archivos export_html.h/.cpp y export_javascript.h/.cpp

    Saludos

    ResponderEliminar
  2. ¿Por qué no portar estos programas a la versión Unicode de wxgtk?

    ResponderEliminar
    Respuestas
    1. Trabajar con la versión unicode en wx2.8 implica hacer conversiones de strings por todos lados y adornar todas las constantes. En algún momento lo intenté, pero luego lo dejé porque sabía que ya no iba a ser necesario en la versión 3.0, entonces ¿para complicarme con algo que va a durar poco? Ya estoy empezando a migrar a la 3.0 donde esta diferencia (unicode vs ansi builds) ya no existe y las conversiones son más transparentes.

      Eliminar
    2. ¿Cuándo estará disponible la versión de PseInt que se compile con wx 3.0 y superiores? y ¿En qué se puede ayudar a hacer dicha transición más rápida?.
      Considero que PseInt es un gran programa, pero a veces pienso que no debería estar sujeto al tiempo "libre" de una sola persona, además debería tener un bugtracker y debería estar en multiples idiomas, con el fin de atraer más personas interesadas.
      En mi humilde opinión PseInt debería ser desarrollada por muchas personas y que fuera usted quien se encargue de supervisar / aprobar las modificaciones, esto simplemente con el fin de hacer más rápido el desarrollo y mejoramiento de tan útil programa.
      De antemano agradezco su esfuerzo y dedicación durante estos años en PseInt.


      Gracias

      Eliminar
    3. La versión 3.0 llegará en algún momento, pero mientras no explote las nuevas funcionalidades de wx (y de scintilla, que es lo que más me interesa), no es una prioridad hacer la migración. Igual algo estuve probando wx3 y de a poco cuando hago cambios voy a aprovechando para dejar las cosas listas para esta nueva versión.

      En relación a la participación de otras personas. Muchos han participado con comentarios, ejemplos, opiniones, pero la mayoría no aporta directamente al código. Además, también hay que compatibilizar la visión que uno tiene del software y su futuro. Sin embargo sí hay un caso de un usuario que ha copiado los fuentes y ha implementado efectivamente varios cambios, muchos de los cuales me parecen muy interesantes y voy a tratar de analizarlos e ir aplicandolos en las próximas versiones.

      Se que dista mucho de lo ideal, pero por ahora esta es mas o menos mi forma de llevar el proyecto. Si un día el grupo programadores se hace numeroso tendrá que cambiar. Hay etapas en las que le puedo dedicar mucho tiempo, y otras en las que no tanto. Ahora por ejemplo tengo varias respuestas atrasadas en el foro, pero es solo que por razones personales le tengo que dedicar un poco menos de tiempo en este momento, pero en cuanto pueda me volveré a poner al día.

      Respecto al bug-tracker, es un item pendiente que podría serme muy muy útil si se usa correctamente, pero ello le generaría una complicación extra al usuario medio a la hora de reportar un bug. Preferí un foro si se quiere anónimo para que sea lo más fácil posible reportar o sugerir cualquier cosa, pero esto también trae muchos reportes mal hechos. Ambas soluciones son armas de doble filo, tendré que experimentar un poco más al respecto.

      Eliminar
  3. OK, no lo sabía, muchas gracias!! Excelente trabajo!!

    ResponderEliminar
  4. Respuestas
    1. En la nueva versión de wx el control para scintilla ya no está en contrib, sino que se habilita desde el configure (con algo como --enable-stc o similar). Pero el código fuente de ZinjaI aún no está completamente adaptado a esta nueva versión (está en proceso de), por lo que debe compilarse con wx 2.8 en lugar de 3.0 que es seguramente la que estás utilizando.

      Eliminar
  5. Cordial Saludo,

    Quiero agradecer su trabajo en PSeInt.
    Realicé cada uno de los pasos aquí descritos para compilar PSeInt en xubuntu 14.04 i386, aunque el programa se compila, la opción dibujar diagrama de flujo no funciona, las demás funciones trabajan bien.
    Previamente con Debian se obtuvo el mismo resultado, entonces decidí realizar la prueba con Ubuntu, la cual es la distribución con que se realizó la guía.
    La versión de PSeInt es 2040311.

    La salida de la terminal está disponible.

    Gracias.

    ResponderEliminar
    Respuestas
    1. Probablemte sea porque wx se compiló sin soporte para OpenGL (cuando escribí el post no lo requería porque usaba GLUT, ahora sí). Al ./configure hay que agregarle el argumento "--with-opengl", y verificar que los "checking for ***GL***" digan "yes" al ejecutarlo, porque en algunas versiones de ubuntu el script fallaba (no recuerdo la solución ahora, pero se debe encontrar fácil con google).

      Eliminar
  6. donde esta la carpeta contrib?

    ResponderEliminar
    Respuestas
    1. En los fuentes de wx...Si no la tenes, puede ser que estés tratando de usar wx 3. ZinjaI todavía requiere wx 2.8.12.

      Eliminar
  7. Que herramientas utilizar para compilar PSeInt e utilizarlo como apk en android

    ResponderEliminar
    Respuestas
    1. http://cucarachasracing.blogspot.com.ar/2015/08/preguntas-frecuentes-sobre-pseint.html

      Eliminar
  8. Hola. Soy Mauricio, estoy intentando instalar tu programa pseint en unas Odroid que estan en las aulas de mi facultad. Un profe quiere utilizar tu programa para enseñarle a programar a los chicos. El tema es que las Odroids son ARM. Asì que estoy siguiendo tu procedimiento para compilar el código en estas plaquitas pero cuando llego al "make linux" no compila. Salen errores como este:
    /tmp/ccr2GPNl.s:433: Error: bad instruction `int3'
    que buscando en Google parecen ser errores de compilaciòn cruzada. Como que estoy queriendo compilar un programa para x86 sobre una placa ARM. Estoy seguro que vos la tenés mas clara que yo en esto, así que cualquier orientación que me puedas dar te lo agradezco muchísimo.
    Saludos, Atte Mauricio

    ResponderEliminar
    Respuestas
    1. No tenía idea de qué eran las odroid.. ¿Qué sistema operativo usan?
      Respecto al problema, el "int3" lo uso solo en modo debug, a modo de assert, podes cambiar eso por asm("") sin perder nada.

      Eliminar
  9. Tenes algun tutorial como este, pero para compilar en Mac OS X?

    ResponderEliminar
    Respuestas
    1. No. La versión para Mac la compilo desde GNU/Linux porque no dispongo de ninguna compu con ese sistema. La última vez que probé era muy similar a la de GNU/Linux (la forma de compilar wx era igual, y la compilación de ZinjaI hasta podía usar los mismos makefiles creo), pero eso fue hace varios años.

      Eliminar
  10. Saludos buen día, comentarte que estoy queriendo compilar pseint para Raspberry PI con una versión linux preparada para los procesadores ARM, pero cuando intento la compilación aparece lo siguiente y se detiene, me puede 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. En esta pagina puedes encontrar la respuesta : http://cucarachasracing.blogspot.com/2012/11/compilar-la-version-del-repositorio-en.html

      Eliminar