tutorial make descarga cmake

descarga - ¿Cómo puedo instalar una jerarquía de archivos usando cmake?



cmake vs make (3)

La forma más sencilla de instalar todo desde un directorio dado es:

install(DIRECTORY mydir/ DESTINATION dir/newname)

Arrastrar ''/'' es significativo. Sin él, mydir se instalaría en newname/mydir .

Desde cmake docs:

El último componente de cada nombre de directorio se agrega al directorio de destino, pero se puede usar una barra diagonal para evitar esto porque deja el último componente vacío.

He creado una lista de archivos usando:

file(GLOB_RECURSE DEPLOY_FILES "${PROJECT_SOURCE_DIR}/install/*")

Quiero instalar todos estos archivos en / usr / myproject / pero quiero mantener el árbol de archivos en la carpeta instalada:

install/junk install/other/junk2 install/other/junk3

Si uso:

install(FILES ${DEPLOY_FILES} DESTINATION "usr/myproject")

Todos los archivos terminan en / usr / myproject como:

/usr/myproject/junk /usr/myproject/junk2 /usr/myproject/junk3

¿Cómo puedo hacer que el comando de instalación realice un seguimiento de las rutas relativas?

He resuelto el problema haciéndolo manualmente en un bucle for:

set(BASE "${PROJECT_SOURCE_DIR}/install") foreach(ITEM ${DEPLOY_FILES}) get_filename_component(ITEM_PATH ${ITEM} PATH) string(REPLACE ${BASE} "" ITEM_PATH ${ITEM_PATH}) install(FILES ${ITEM} DESTINATION "usr/myproject${ITEM_PATH}") endforeach()

... pero esto es molesto de hacer. Seguramente hay una forma más fácil?

(No puedo ver nada en los documentos de instalación aunque ...)


Si tiene una lista de archivos, simplemente puede recorrerlos y usar get_filename_component() para extraer la parte del directorio:

foreach ( file ${INCLUDE_FILES} ) get_filename_component( dir ${file} DIRECTORY ) install( FILES ${file} DESTINATION include/${dir} ) endforeach()

Hecho. ;-)


Utilizar:

INSTALL( DIRECTORY <directory> DESTINATION usr/myproject )

(Consulte aquí para obtener más información: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:install )

INSTALL( DIRECTORY .... ) conserva la estructura del directorio. Pero, si usa install como <directory> , terminaría con usr/myproject/install/.... que no es lo que quiere.

Hay dos maneras de hacer esto:

  1. Use INSTALL( FILES .... DESTINATION usr/myproject) para instalar los archivos que se encuentran directamente en install/ , luego use INSTALL( DIRECTORY .... DESTINATION usr/myproject ) y liste manualmente los directorios para instalar.

  2. Use su comando global en su publicación original, luego determine qué entradas son archivos, que son directorios, ''mueva las entradas del directorio a una lista separada y alimente las listas a INSTALL( FILES ...) e INSTALL( DIRECTORY ...) respectivamente .

    file(GLOB DEPLOY_FILES_AND_DIRS "${PROJECT_SOURCE_DIR}/install/*") foreach(ITEM ${DEPLOY_FILES_AND_DIRS}) IF( IS_DIRECTORY "${ITEM}" ) LIST( APPEND DIRS_TO_DEPLOY "${ITEM}" ) ELSE() LIST( APPEND FILES_TO_DEPLOY "${ITEM}" ) ENDIF() endforeach() INSTALL( FILES ${FILES_TO_DEPLOY} DESTINATION usr/myproject ) INSTALL( DIRECTORY ${DIRS_TO_DEPLOY} DESTINATION usr/myproject )

Nota: Dependiendo del tipo de archivos que instale, otros comandos de INSTALL( ...) podrían ser más apropiados (por ejemplo, INSTALL( TARGETS .... ) para instalar sus bibliotecas / ejecutables.