jueves, 3 de febrero de 2011

News: ¿Que es eso del [CMAKE]?

 
image

Muchos habréis podido comprobar la existencia de varios cientos de commits haciendo referencia a la “palabra” CMake e incluso conocéis la existencia de un branch llamado “cmake-bringup”.
El objetivo de ese branch no es otro que abandonar nuestro actual jefe Rbuild y adoptar CMake como nuevo jefe durante la compilación.
Si quieres saber que es “Rbuild”, “Cmake”,o las ventajas de uno frente al otro…solo tienes que seguir leyendo… ;)
 

 



 

¿Qué es CMAKE?

 

 

CMake se utiliza para controlar el proceso de compilación de ReactOS usando ficheros de configuración sencillos e independientes de la plataforma. Al ser independientes de la plataforma se elimina la necesidad de tener varios conjuntos de ficheros para cada plataforma y el mantenimiento es por lo tanto mucho más sencillo.

Pero no solo eso, Cmake genera makefiles nativos y espacios de trabajo que pueden usarse en el entorno de desarrollo deseado. Existen generadores makefile para Unix, Borland make, Watcom make, MinGW, MSYS y Microsoft NMake. Además es posible generar ficheros de proyecto para Code::Blocks, Eclipse CDT, Microsoft Visual Studio de la 6 a la 10 incluyendo versiones de 64 bits y KDevelop.


image

STOP, que me embalo…
 
 



Tenemos que ver a Cmake como un jefe de producción. Cmake se encarga de ir dirigiendo la creación de las piezas que terminarán  ensamblandose al final.¿Y quien las crea?¿quien las compila?Alguno de los compiladores antes mencionados.Normalmente solo se elige un compilador para hacer este trabajo, por ejemplo en ReactOS usamos MinGW. Compilar con varios al mismo tiempo es innecesario y además un caos.Solo tiene sentido usar varios compiladores si usamos distintos tipos de lenguajes en el código fuente, pero no es el caso de ReactOS pues todo está escrito en C/C++.

La relación entre el anterior jefe  (Rbuild) y el trabajador (Mingw, Msys,MSVC..) era de odio-odio. Si queríamos que rbuild trabajara con Mingw teníamos que crear unos ficheros específicos, si queríamos que trabajara con MSVC teníamos que crear otros distintos, y así sucesivamente. A esto es lo que se le llama ser “dependiente de plataforma”.Hablamos de más de 1000 ficheros específicos.Una pasada.

Pero Cmake es mucho más flexible,y si creamos unos ficheros con sintaxis Cmake pueden funcionar con cualquier compilador del mercado(bueno, realmente con los que se han mencionado antes).
 
  




Rbuild—> CMake

 

 


image El problema es que actualmente la sintaxis de los ficheros en ReactOS es rbuild, por lo que estamos cambiando todos los ficheros de rbuild por ficheros con sintaxis Cmake. Es un trabajo titánico, pero nos permitirá poder compilar con cualquier herramienta.

Flexibilidad para el usuario a la hora de compilar, y para nosotros un buen testeo de comportamiento frente a diversos compiladores.





Este trabajo titánico se ha realizado en un branch aparte ya que mezclar ambas sintaxis no es nada recomendable.
La buena noticia: El trabajo titánico ha (casi) finalizado. Ya somos capaces de compilar revisiones con Cmake como jefe.
 
  



Los nuevos Builders

 

En las últimas semanas hemos añadido nuevos “Buildbots” ( robots de construcción) que nos permiten construir la misma revisión de ReactOS con distintas herramientas. Esto se debe precisamente a la flexibilidad de CMake.

Antes teníamos los siguientes “Buildbots”:


  • Trunk_x86_GCCLin Debug :Crea las versiones Debug de ReactOS usando como jefe “rbuild” y usando “Gcc” en Linux
  • Trunk_x86_GCCLin Release:Crea las versiones Release de ReactOS usando como jefe “rbuild” y usando“Gcc” en Linux


        NOTA1: Los dos últimos nunca han producido una ISO completa pues el port x64 y ARM aún no han finalizado.
        NOTA2: Gcc es el compilador integrado en el entorno de compilación MinGW.
          

        A éstos se le añaden ahora dos más:
          Ambos usan como jefe a “CMake”,pero uno compila con GCC y otro con Microsoft Visual C.Ambos en Windows.
           

          Actualmente el primero de ellos ya está produciendo ISOs mientras que el segundo aún tiene fallos al compilar. Esto es debido a las exigencias de los compiladores. MSVC es muy exigente y se “queja absolutamente por todo”.
           

          Como muestra un botón:

        • CMake_x86_GCCWin Debug: 197 Warnings

        • CMake_x86_MSVCWin Debug: 8353 Warnings.Casi nada. Lo curioso es que es exactamente el mismo código ;)
           
           
            



          Los nuevos testeos

           


          image Pero esto no es todo,además estamos testeando todas estas ISOs.
          Antes en reactos.org/testman solo aparecían los tests realizados a las ISOS creadas por  Trunk_x86_GCCLin Debug , pero ahora también aparecen los tests de las nuevas ISOs compiladas por CMake_x86_GCCWin Debug .

          Esto explica porqué en Testman aparecen dos testeos de la misma revisión, uno es el testeo de la revisión creada por Trunk_x86_GCCLin Debug y el otro corresponde al testeo de esa misma revisión pero que ha sido compilada por  CMake_x86_GCCWin Debug.

          El objetivo es comparar si existe alguna diferencia entre ambas ISOs al utilizar distintos jefes para conseguir la ISO final. Si la compilación es correcta, entonces ambas ISOs deberían mostrar el mismo comportamiento durante el testeo.

          En un futuro también compararemos las ISOS de CMake_x86_MSVCWin Debug con las ISOS de los dos buildbots antes mencionados. Y como Cmake no pone límites podemos crear buildbots con otras herramientas de compilación y crear así decenas de “buildbots” con sus correspondientes Tests.
          ¿No es una gozada? Bye.bye Rbuild. :)
        • 3 comentarios:

          1. entonces van a desaparecer los archivos rbuild?, no me queda muy claro, saludos.

            ResponderEliminar
          2. @Manuel

            Si quieres compilar usando las herramientas CMAKE no necesitas los rbuild para nada(son ignorados), mientras que si quieres compilar usando los RBUILD los ficheros cmake son ignorados.
            En principio no tiene sentido mantener los ficheros "rbuild" si vamos a cambiar a CMAKE, pero es posible que los dejemos por si necesitamos hacer alguna comprobación o testeo comparativo de compilación.

            ResponderEliminar