jueves, 9 de abril de 2015

MinGW64 y otras variantes para ZinjaI en Windows

Se supone que ZinjaI está preparado para configurar fácilmente más de un posible compilador. En GNU/Linux, suelo alternar entre gcc y llvm-clang sin problemas. Pero en Windows, el cambio es un poquito más delicado, porque el compilador y demás herramientas afines que están como parte de ZinjaI, y no del sistema. Si bien se suponía que era posible hacerlo de todas formas, y que teóricamente el cambio debía ser simple y directo, de la teoría a la práctica suele haber un buen trecho, y por eso no le tenía plena confianza a esta funcionalidad. Pero hace unos días finalmente lo probé y verifiqué que (muy sorprendentemente) funciona justo como esperaba. Y esto es algo muy bueno, porque ya es hora de empezar a utilizar 64bits. En este post les cuento cómo configurar otro MinGW que no sea el que trae ZinjaI, tomando una versión alternativa de 64bits como ejemplo, qué tiene esto de bueno, y cuáles son por ahora las limitaciones.

Para empezar, algunas palabras sobre las dos principales motivaciones que veo para pasar a 64 bits. La primera es la posibilidad de utilizar la nueva biblioteca de threads de C++11. El proyecto MinGW (el "original", de 32bits) ofrece una compilación de gcc que soporta C++11 y C++14 en un 99%, pero no soporta particularmente el uso de threads. Creo que se debe mayormente a la dependencia necesaria de una biblioteca externa (por ejemplo pthreads) para implementarlo, algunas incompatibilidades con la biblioteca de Windows, y cuestiones aledañas de compatibilidades de licencias y no se que más que no vienen al caso. El punto es que para usar los std::threads con gcc en Windows, lo más fácil es pasarnos a MinGW64. El segundo gran motivo es el de la memoria: un programa de 32bits no puede direccionar más de 4GB de memoria. En realidad, en la práctica usualmente son solo 2GB, pero se puede llegar cerca de 4 con algunos trucos. Esto se puede ver con el simple echo de que en un puntero de 32bits no entran tantas direcciones (2^32=4GB). Hoy son comunes las PCs con 4GB o más de RAM, son comunes los sistemas operativos de 64bits, y en algunos ámbitos son comunes los programas que manejan grandes volúmenes de datos, requiriendo así muuucha RAM para trabajar.

Para seguir, algunos "peros" genéricos (independientes de ZinjaI) del cambio de compilador. Si cambiamos el compilador, en general hay que cambiar (léase recompilar) también todas las bibliotecas que usemos (como las de los complementos: wxWidgets, SFML, GLUT, etc). Además, si encima cambiamos la arquitectura (de 32 a 64 bits en este ejemplo), el formato del ejecutable también cambia y por ello muchas herramientas auxiliares deben hacerlo también. Por ejemplo, puede ser necesario cambiar el depurador por uno nuevo preparado para utilizar la nueva arquitectura.

Lista la motivación y las aclaraciones previas, pasemos concretamente a ZinjaI. En ZinjaI podemos usar cualquier compilador que ofrezca la misma interfaz que gcc. Esto es porque los argumentos que ZinjaI le pasa al compilador tienen el formato que espera gcc. En concreto, funciona cualquier versión de gcc (como las que traen MinGW y MinGW64), y ahora también con llvm-clang (aunque este último aún no es tan simple de instalar en Windows, o al menos no lo era la última vez que probé). Dicho esto, lo que sí podemos cambiar en ZinjaI es el directorio donde busca los ejecutables del compilador, y los nombres particulares de estos ejecutables. Supondremos, para continuar con el ejemplo, que tenemos una instalación válida de MinGW64 en "C:\MinGW64". Hay varias versiones (tanto por numeración como por formas de compilarse) de MinGW64. Puede obtener una (la misma que yo usé para probar) descargando y descomprimiendo este archivo. Al descomprimirlo, verán una carpeta "mingw64", que por simplicidad, supondré que moverán al raiz del disco C. Entonces, en "C:\mingw64\bin" están los ejecutables que interesan como gcc.exe, g++.exe, y hasta gdb.exe (el depurador).

El siguiente paso entonces es configurar en ZinjaI este nuevo "toolchain". Para que todo funcione como debería, asegúrense antes de utilizar la última versión de ZinjaI disponible (al menos la 20150331). Luego, en ZinjaI hay que ir a la pestaña "Programa/Proyecto" del cuadro de preferencias (menú "Archivo" -> "Preferencias..."). Allí encontraran un campo cerca del final que dice "Herramientas de compilación" y presenta varias opciones en un menú desplegable, y un botón con puntos suspensivos al final. La opción seleccionada debe ser "gcc-mingw32" (opción por defecto en Windows). Hay que hacer click en el botón de los puntos suspensivos para que se despliegue un nuevo cuadro de diálogo con las opciones de gcc-mingw32. Tomaremos esto de base, y con pequeños cambios tendremos lista la configuración de MinGW64.

Los cambios son: 1) quitar "mingw32-" de todos lados (por ejemplo, cambiar, "mingw32-gcc" por "gcc"); 2) cambiar los directorios "MinGW"  y "MinGW\bin" (por defecto son los relativos a la instalación de ZinjaI) por "C:\mingw64" y "C:\mingw64\bin" (paths absolutos de la nueva instalación de MinGW64); y 3) definir "gcc-mingw64" como nombre de archivo (el primer campo). 4) Aceptar. Al hacer click en Aceptar, este segundo cuadro se cierra, y la configuración se crea con el nuevo nombre "gcc-mingw64". En el menú desplegable seguirá seleccionada la vieja (gcc-mingw32), pero si lo despliegan verán al final que pueden elegir la nueva. Si la eligen y cierran con "Aceptar" el cuadro de preferencias, ZinjaI utilizará esta nueva configuración para todo lo que compile de ahora en más. No siempre es esto lo que se quiere, ya que recuerden que en esta nueva instalación no tenemos por ejemplo ninguna biblioteca externa o de complemento.

Entonces, podemos dejar la configuración original (gcc-mingw32) en las preferencias, y configurar luego proyectos individuales para utilizar la nueva. Es decir, cada proyecto puede elegir qué toolchain utilizar. Para esto, en cualquier proyecto, vamos a las opciones de compilación (menú "Ejecución"->"Opciones...", y en la pestaña "Secuencia" encontrarán al principio de todo el mismo combo que tenían en las preferencias generales, con la lista de toolchains, y un valor especial más, "<default>", que significaría "usar el que dicen las preferencias". Si allí eligen "gcc-mingw64", usarán ese toolchain alternativo solo para ese proyecto, y solo para ese perfil de configuración de ese proyecto. Así, pueden convivir, aún en un mismo proyecto, diferentes toolchains. En este caso, por ejemplo, podemos tener un perfil para 32bits, y otro para 64bits. Hay un solo detalle importante: luego de cambiar de toolchain, deben recompilar todo de cero; es decir, ir al menú "Ejecución" y elegir "Limpiar", pues en general no se pueden mezclar partes compiladas con diferentes compiladores.

Por último, el archivo con la configuración del toolchain que generaron, que se llamará "gcc-mingw64", estará en la subcarpeta "toolchains" de la carpeta "zinjai" que está en el home del usuario (por ejemplo, en mi PC sería "C:\users\zaskar\zinjai\toolchains"). Pueden pasar ese archivo a otros usuarios, o ponerlo en la subcarpeta "toolchains" que hay en el directorio de instalación de ZinjaI (usualmente "C:\Program Files (x86)\zinjai\toolchains") para que todos los usuarios lo vean.

En definitiva, espero que hayan entendido y comprobado lo simple que es utilizar otro MinGW en ZinjaI, y que pueden convivir varias instalaciones y configuraciones sin problemas. Habrá algunos pequeños detalles en ZinjaI que corregir, que se irán mejorando versión a versión, pero que en general no afectarán el día a día del 99% de los usuarios. Espero entonces que esto les solucione algún que otro problema, y les sirva como parche hasta el momento en que decida recompilar todo y ofrecer una versión "oficial" de ZinjaI para 64bits.

No hay comentarios:

Publicar un comentario