CMake#
CMake es una herramienta software para la compilación multiplataforma. Esto es, para Linux puede generar ficheros Makefile, para Windows puede generar proyectos de Visual Studio, etc. Enlace la documentación oficial aquí.
Reconocerás que un proyecto utiliza CMake por un fichero que se llama CMakeLists.txt
. Si estás en la raíz del proyecto y ves este fichero, la buena práctica para compilar el proyecto en una terminal (estilo bash) es:
mkdir -p build && cd build && cmake .. && make
La explicación de esta línea es (donde &&
lanza un comando sólo si el anterior se ha realizado con éxito):
mkdir -p build # Crea una carpeta build, -p para no dar error si ya existe
cmake .. # Genera un Makefile con las opciones por defecto
make # Make sigue las directrices del Makefile para invocar compilador, etc
Podemos modificar las opciones con la opción -D
:
cmake .. -DOPTION1=ON -DOPTION2=/mi/ruta # Asigna ON a OPTION1, y /mi/ruta a OPTION2
ccmake ..
(modo ncurses
de Linux) o gráficas cmake-gui
(por defecto en Windows).
Generar un CMakeLists.txt#
Cuando creas un proyecto, querrás que proporcione las bondades multi-plataforma de CMake. ¿Cómo hacerlo? A continuación, un ejemplo extremadamente minimalista de CMakeLists.txt
. Incluye una única directiva para compilar main.cpp
y generar el binario ejecutable de nombre ejecutable
.
add_executable(ejecutable main.cpp)
A continuación, un ejemplo algo menos minimalista. Nótese que se utiliza#
para incluir comentarios.
cmake_minimum_required(VERSION 2.8) # Versión mínima que exigimos de CMake, que va ampliando sus capacidades
add_executable(ejecutable main.cpp other.cpp) # Compilar main.cpp y other.cpp, enlazarlos, y llamar ejecutable al binario generado
En general, para una carpeta con uno o varios .cpp
, aquí un ejemplo de CMakeLists.txt
algo más extenso:
cmake_minimum_required(VERSION 2.8) # Versión mínima que exigimos de CMake, que va ampliando sus capacidades
project(ejecutable) # Dar nombre al proyecto
aux_source_directory(. SRC_LIST) # Parecido a GLOB, no excesivamente recomendado
add_executable(${PROJECT_NAME} ${SRC_LIST}) # Compilar *, enlazarlos, y llamar como el proyecto (en este caso, ejecutable) al binario generado
Para un proyecto que dependa de una librería llamada EJEMPLO
:
cmake_minimum_required(VERSION 2.8) # Versión mínima que exigimos de CMake, que va ampliando sus capacidades
project(ejecutable) # Dar nombre al proyecto
find_package(EJEMPLO REQUIRED) # Nombre de la librería, buscará un módulo de CMake (que define las variables utilizadas a continuación) con este nombre. REQUIRED indica que lo exigimos.
include_directories(${EJEMPLO_INCLUDE_DIRS}) # Indicamos variables que indican rutas de cabeceras de librerias
aux_source_directory(. SRC_LIST) # Parecido a GLOB, no excesivamente recomendado
link_directories(${EJEMPLO_LIBRARY_DIRS}) # Indicamos variables que indican rutas de librerias (en desuso)
add_executable(${PROJECT_NAME} ${SRC_LIST}) # Compilar *, enlazarlos, y llamar como el proyecto (en este caso, ejecutable) al binario generado
target_link_libraries(${PROJECT_NAME} ${EJEMPLO_LIBRARIES}) # Añadimos nombres de librerías (actualmente se recomiendan rutas completas, que vuelve el anterior obsoleto)
Nótese que los nombres de las variables no están estandarizados. Una guía más extensa acerca de cómo encontrar librerías puede encontrarse aquí.