viernes, 16 de diciembre de 2016

Actualizando MinGW

El toolchain que incluía hasta hace 2 días el instalador de ZinjaI para Windows estaba muy desactualizado. En el momento en que lo armé, la versión más reciente de gcc disponible era la 4.8. Actualmente ya está por liberarse la 6.3, aunque las 5.x son las consideradas más estables. Hace rato que quería actualizar lo que uso en ZinjaI, pero en Windows, cada actualización implicaba muchísimos dolores de cabeza.


Para empezar, cuando cambia el número grande de la versión, suele cambiar la ABI (la interfaz binaria de las cosas que genera). Esto implica que no puedo mezclar partes compiladas con distintas versiones. Entonces, actualizar el compilador implica recompilar todo, en particular cada complemento. Porque si actualizo gcc pero no los complementos, dejo a muchos usuarios en una situación en la que tienen que elegir entre no poder compilar sus proyectos previos y no poder actualizar ZinjaI. Lo primero es malo para ellos, lo segundo, para mi.

Pero la mayoría de los complementos estaban armados "a mano". Armar implica descargar la versión adecuada, compilarla, agregarle las plantillas y demás cosas de ZinjaI, y empaquetarla en formato complemento. Compilarla es lo más difícil porque en Windows no hay una regla única: a veces hay un makefiles, otras se usa cmake, otras las autotools (y entonces msys), otros nada y hay que arreglárselas, etc. Encima, estos pasos hay que hacerlos en un sistema Windows y, para rematar, como no todos usan el mismo port de gcc usualmente se requieren parches varios.

Lo que hice fue automatizar todos estos pasos mediante scripts de bash que bajan los fuentes, los extraen, los parchean, los compilan usando wine, separan los archivos que me interesan, agregan los templates de zinjai y la documentación, y empaquetan el complemento, todo en uno y automáticamente. Armar cada script me llevó mucho tiempo, pero cuando vuelva a cambiar algo, rehacer los complementos va a requerir casi cero trabajo. Tan poco trabajo, que en principio podría tratar de tomar estos mismos script como base para generar un toolchain y complementos de 64bits, usando MinGW64 en lugar de MinGW, algo que vengo prometiendo hace rato (la parte importante a re-resolver es la de los parches).


Y para cerrar, queda el tema de decidir qué hago en ZinjaI para evitar mezclar archivos de distintas versiones de gcc. Si mando los archivos del nuevo encima del viejo, queda una mezcla que trae problemas. Además, si piso el mignw pero no los complementos (cosa que va a pasar cuando el usuario no lea o le de fiaca actualizar los complementos) van a empezar a aparecer errores de lo más esotéricos culpa de los cambios en las ABIs, que van a ser muy difíciles de diagnosticar. Más aún, si algún usuario se tomó el trabajo de compilarse por su cuenta alguna otra biblioteca adicional para la cual yo no proveo complemento, al pisarle el mingw con uno nuevo lo dejo sin chances de volver a compilar contra la biblioteca vieja.

Para evitar todo esto y no repetir errores, ahora instalo MinGW en una carpeta diferente para cada versión. Ya no será "MinGW" genérico, sino "mingw32-gcc5". Así no se mezclarán los complementos, y podrán convivir las dos versiones, permitiendo elegir una u otra simplemente cambiando el toolchain por defecto.


En conclusión, ya tengo un mingw actualizado, puede convivir con el viejo, y tengo además un sistema para que ante el próximo cambio solo tenga que lanzar un par de scripts y esperar a que el compilador y los complementos se cocinen solos. Mejor aún, todo desde un horno Linux gracias a wine y otras magias. Ya pueden entonces empezar descargar las actualizaciones.

No hay comentarios:

Publicar un comentario