Esta receta explica cómo utilizar, fundamentalmente, el comando INSTALL de CMake para crear objetivos de instalación.

El comando INSTALL

CMake proporciona el comando INSTALL que facilita en gran medida seleccionar los componentes de nuestro proyecto que queremos instalar y dónde. En esta receta nos vamos a centrar en un uso básico del comando. Para algo más avanzado nada mejor que la documentación.

Ejemplo

Supongamos que queremos instalar un binario y dos versiones de una misma librería: una estática y otra dinámica. El código CMake para este caso podría ser el siguiente:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})

# Librerías
ADD_LIBRARY(dummy_shared SHARED dummy.cpp)
SET_PROPERTY(TARGET dummy_shared PROPERTY SOVERSION 1.0)
ADD_LIBRARY(dummy_static STATIC dummy.cpp)
SET_TARGET_PROPERTIES(dummy_shared dummy_static PROPERTIES OUTPUT_NAME dummy)

# Ejecutable
ADD_EXECUTABLE(hello hello.cpp)
Inicialmente, podrías añadir un comando por cada uno de los componentes que queremos instalar indicando el directorio destino. Sin embargo, como es habitual necesitar instalar varios objetivos, el comando INSTALL proporciona una forma más compacta:
# ... el código anterior aquí

SET_TARGET_PROPERTIES(dummy_shared
      PROPERTIES    PUBLIC_HEADER  "${CMAKE_CURRENT_SOURCE_DIR}/dummy.h"

INSTALL(TARGETS hello dummy_static dummy_shared
RUNTIME          DESTINATION    bin
ARCHIVE          DESTINATION    lib/static
LIBRARY          DESTINATION    lib
PUBLIC_HEADER    DESTINATION    include)
En primer lugar, se asocia a la librería dinámica las cabeceras que serán necesarias instalar posteriormente como "cabeceras públicas" utilizando el comando SET_TARGET_PROPERTIES. Es posible asociar distintos archivos a objetivos para, posteriormente, usarlos en el comando INSTALL. De hecho, lo apropiado sería crear un FRAMEWORK... pero quizás es demasiado para este ejemplo. Consulta el manual para obtener más información que, además, explica cómo utilizar INSTALL de otras formas. La forma en que se ha usado INSTALL es la más compacta. Básicamente, viene a decir lo siguiente (por defecto, CMAKE_INSTALL_PREFIX=/usr/local):
  • Al objetivo hello se le debe tratar como un ejecutable (RUNTIME) y debe instalarse en el directorio ${CMAKE_INSTALL_PREFIX}/bin.
  • Al objetivo dummy_static se le debe tratar como una librería estática (ARCHIVE) y debe instalarse en el directorio ${CMAKE_INSTALL_PREFIX}/lib/static.
  • Al objetivo dummy_shared se le debe tratar como una librería dinámica (LIBRARY) y debe instalarse en el directorio ${CMAKE_INSTALL_PREFIX}/lib.
  • Finalmente, las cabeceras públicas (PUBLIC_HEADER) configuradas a lo largo del programa deben instalarse en ${CMAKE_INSTALL_PREFIX}/include.
Y con ello, ya disponemos de un objetivo install en el Makefile generado que nos permitirá instalar el software.

¿Cómo personalizar mi instalación?

Supón que tienes un directorio en tu home llamado ~/usr y que las variables de entorno pertinentes las tienes configuradas a ese path. Estaría muy bien que pudieras hacer que CMAKE_INSTALL_PREFIX tuviera un valor concreto para instalar el software en ese lugar. Para ello, simplemente ejecuta lo siguiente:
$ cmake -DCMAKE_INSTALL_PREFIX=~/usr ..
Sin embargo, es posible que hayas instalado otras cosas en ese ruta (cabeceras de código, por ejemplo) y las uses en tu proyecto. Obviamente, CMake no puede buscar en todo el disco duro en busca de la cabecera problemática. Por ello, es recomendable que cuando cambies el directorio de instalación también cambies lo siguiente:
$ cmake -DCMAKE_INSTALL_PREFIX=~/usr -DCMAKE_PREFIX_PATH=~/usr ..
De esta forma, los módulos que buscan cabeceras y librerías añadirán ese path a su ruta de búsqueda (además de las rutas del sistema).

Referencias



blog comments powered by Disqus