Multiplataforma Real
Sábado, 1 de noviembre de 2008 por jorgeCMake es un generador de proyectos o Makefiles para diferentes plataformas. La idea es que tu código en C/C++ sea compilable en diferentes plataformas lo que normalmente suele implicar diferentes compiladores. En el mundo de C/C++ la batalla siempre está entre la cadena de herramientas gnu o los compiladores de Microsoft. Otra de sus ventajas es que permite compilar con facilidad en un directorio diferente del que contiene el código fuente. Esto es muy cómodo para realizar compilaciones cruzadas diferentes de un mismo código.
CMake permite generar makefiles para la cadena de herramientas GNU o proyectos de Visual C nativos. Pero su ventaja fundamental no es esta sino una biblioteca de scripts que permite resolver las dependencias del código que compilamos. Los que hayan entrado en este mundo en los tiempos de Ubuntu/APT y la instalación de paquetes automática quizá no sepan el terrible infierno que puede ser compilar un programa que depende de 5 librerías que a su vez depende de otras 5 que entran en conflicto entre sí.
Para crear un proyecto que compile con CMake lo único que hay que hacer es insertar un fichero de texto llamado “CMakeLists.txt” en cada directorio del proyecto que tenga archivos compilables. Supongamos que queremos hacer un ejecutable que se llama Demo que depende de una librería que se llama Hello. El código de la librería y el ejecutable residen en los directorios Demo y Hello respectivamente.
El directorio de mayor nivel contiene el siguiente código:
# El nombre del proyecto es "HELLO". Los ficheros CMakeLists en este proyecto
# se refieren al direcotrio raíz del proyecto como ${HELLO_SOURCE_DIR} y
# al directorio raiz donde se almacenan los binarios como ${HELLO_BINARY_DIR}.
cmake_minimum_required (VERSION 2.6)
project (HELLO)
# Indicamos que cmake entren en dos subdirectorios Hello y Demo
add_subdirectory (Hello)
add_subdirectory (Demo)
El directorio Hello tiene el siguiente fichero CMakeLists.txt
# Crea un librería "Hello" que incluye el fichero "hello.cpp".
add_library (Hello hello.cpp)
El directorio Demo tiene el siguiente fichero CMakeLists.txt
# Definimos los ficheros de cabecera de la cabecera de la librería.
include_directories (${HELLO_SOURCE_DIR}/Hello)
# Definimos el lugar donde se encuentra el archivo de la librería.
link_directories (${HELLO_BINARY_DIR}/Hello)
# Creamos un ejecutable llamado helloDemo que se crea con los ficheros
# "demo.cpp" y "demo_b.cpp".
add_executable (helloDemo demo.cxx demo_b.cxx)
# Enlazamos el ejecutable con la librería Hello
target_link_libraries (helloDemo Hello)
Cuando ejecutamos cmake en el directorio raíz del proyecto automáticamente se genera un makefile o un proyecto de visual C nativo que podemos compilar con las herramientas correspondientes. En el caso de que nuestro proyecto dependa de una librería podemos usar una gran cantidad de scripts predefinidos para encontrarla. Por ejemplo si nuestro proyecto depende de la librería zlib podemos incluir en nuestro CMakeLists.txt
FIND_PACKAGE(ZLIB)
Esta línea busca la librería usando los macros predefinidos para la librería si la encuentra pone a nuestra disposición las variables
# ZLIB_INCLUDE_DIR - where to find zlib.h, etc.
# ZLIB_LIBRARIES - List of libraries when using zlib.
# ZLIB_FOUND - True if zlib found.
que luego podemos usar para compilar nuestro programa. Si cmake no encuentra las dependencias nos preguntará por su situación y rellenará las variables.
Su sencillez y su interfaz amistosa comparado con otras herramientas como automake/autoconf ha hecho que gane popularidad muy rápido y ha sido adoptado por grandes proyectos open source como KDE4 o OpenScenGraph. Desde mi punto de vista es una herramienta magnífica para compilar código opensource sobre windows.




