2011-08-13 25 views
16

tl; dr versión: ¿es posible con CMake (> = 2.8) generar archivos zip de algunos archivos y poner el archivo zip empaquetado en una ubicación específica?archivos zip usando CMake?

versión más larga: Tengo un CMakeLists.txt que crea mi proyecto en un archivo .exe. Y este archivo exe leerá datos de un archivo zip. Ahora es para que el contenido que se va a empaquetar en el archivo zip esté en mi repositorio de git para que pueda ser editado también. Pero el programa necesita esta información en un archivo zip. Por lo tanto, sería bueno si el script cmake pudiera tomar los datos, ponerlos en un archivo zip y colocarlos junto al exe. Ya escuché sobre CPack, pero no encontré ejemplos fáciles y no estoy seguro de si esta es la herramienta adecuada para mi tarea.

¿Esto es posible? Si es así: ¿cómo?

Respuesta

21

Desde la versión 3.2 CMake tiene la funcionalidad para generar un archivo zip integrado. El subcomando command-line mode de CMake tar es compatible con la creación de archivos zip y 7zip.

Por ejemplo, si el directorio de origen CMake actual contiene el archivo testfile.txt y el directorio testdir, puede utilizar los siguientes comandos de CMake para crear un archivo zip que contiene dos elementos:

add_custom_target(create_zip COMMAND 
    ${CMAKE_COMMAND} -E tar "cfv" "archive.zip" --format=zip 
     "${CMAKE_CURRENT_SOURCE_DIR}/testfile.txt" 
     "${CMAKE_CURRENT_SOURCE_DIR}/testdir") 

Como solución temporal para versiones anteriores de CMake, puede usar el comando jar que es parte de una instalación Java JRE estándar.

find_package(Java) 

execute_process(
    COMMAND 
     "${Java_JAR_EXECUTABLE}" "cfM" "archive.zip" 
     "-C" "${CMAKE_CURRENT_SOURCE_DIR}" "testfile.txt" 
     "-C" "${CMAKE_CURRENT_SOURCE_DIR}" "testdir" 
    RESULT_VARIABLE _result 
) 

El archivo zip se generarán en el directorio binario CMake actual (CMAKE_CURRENT_BINARY_DIR).

+0

Este método parece crear un archivo zip vacío. Sin embargo, parece que puedo crear un archivo poblado especificando la opción "files-from = files.txt". Parece fallar con los directorios y archivos dentro de los directorios – Begui

+0

Ahh, acabo de entenderlo ... Explicaré a continuación lo que hice para que esto funcione – Begui

6

Supongo que ya tiene instalada una herramienta zip (WinZip o 7z, etc.). Se puede escribir un guión find_zip-herramienta que buscar WinZip o 7Z, etc ...

de fragmentos de WinZip:

FIND_PROGRAM(ZIP_EXECUTABLE wzzip PATHS "$ENV{ProgramFiles}/WinZip") 
IF(ZIP_EXECUTABLE) 
    SET(ZIP_COMMAND "\"${ZIP_EXECUTABLE}\" -P \"<ARCHIVE>\" @<FILELIST>") 
ENDIF(ZIP_EXECUTABLE) 

Fragmento para el 7-zip:

FIND_PROGRAM(ZIP_EXECUTABLE 7z PATHS "$ENV{ProgramFiles}/7-Zip") 
    IF(ZIP_EXECUTABLE) 
    SET(ZIP_COMMAND "\"${ZIP_EXECUTABLE}\" a -tzip \"<ARCHIVE>\" @<FILELIST>") 
    ENDIF(ZIP_EXECUTABLE) 

Take un vistazo al archivo

<cmake-install-dir>\share\cmake-2.8\Modules\CPackZIP.cmake 

que muestra cómo CPack busca una Zip_Executable y prepara algunos bandera por defecto "útil" s.

Después de eso, sugeriría a execute_process, similar a la respuesta de Sakra

0

Básicamente lo que hice fue crear la costumbre apuntar

add_custom_target(STAGE_FILES) 

Con este objetivo copio los archivos y directorios a la CMAKE_CURRENT_BINARY_DIR

add_custom_command( 
    TARGET STAGE_FILES 
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/assets/video ${CMAKE_CURRENT_BINARY_DIR}/video 
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/assets/data ${CMAKE_CURRENT_BINARY_DIR}/data 
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/assets/strings_en.csv ${CMAKE_CURRENT_BINARY_DIR}/ 
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/assets/strings_rules_en.csv ${CMAKE_CURRENT_BINARY_DIR}/ 
    COMMAND ${CMAKE_COMMAND} -E tar "cfv" "data.zip" --format=zip --files-from=${CMAKE_SOURCE_DIR}/assets/to_zip.txt 
    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_BINARY_DIR}/data 
    COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/data.zip ${CMAKE_CURRENT_BINARY_DIR}/data 
) 

La importante línea

COMMAND ${CMAKE_COMMAND} -E tar "cfv" "data.zip" --format=zip --files-from=${CMAKE_SOURCE_DIR}/assets/to_zip.txt 

dentro de mi

to_zip.txt

especifico todos los archivos que desea incluir en mi postal

data/ 
video/ 
... 

ahora puedo ejecutar el comando

make STAGE_FILES 

que copiará y comprimirá todo lo que necesito

Cuestiones relacionadas