2011-08-13 48 views
16

tl; dr版本: CMake(> = 2.8)是否可以从某些文件生成zip文件并将打包的zip文件放在特定位置?使用CMake的zip文件?

更长的版本: 我有一个CMakeLists.txt构建我的项目到一个.exe文件。这个exe文件将从zip文件中读取数据。现在,要将压缩包中的内容放在我的git存储库中,以便它可以进行编辑。但该程序需要一个zip文件中的这些数据。因此,如果cmake脚本可以将数据放入一个zip文件并将其放在exe文件旁边,那就太好了。我已经听说过CPack,但我没有找到简单的例子,我不确定这是否是我的任务的正确工具。

这可能吗?如果是,如何?

回答

21

从版本3.2开始,CMake具有生成内置zip文件的功能。 CMake command-line mode子命令tar支持创建zip和7zip存档。

例如,如果当前的CMake源目录中包含的文件testfile.txt和目录testdir,您可以使用下面的CMake的命令创建包含两个项目一个zip文件:

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") 

作为一个变通办法对于早期的CMake版本,可以使用作为标准Java JRE安装一部分的jar命令。

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 
) 

该zip文件将在当前的CMake二进制DIR(01​​)来生成。

+0

此方法似乎创建一个空的zip文件。但是,似乎我能够通过指定“files-from = files.txt”选项来创建填充归档。似乎在目录和目录中的文件失败 – Begui

+0

啊,只是想通了......我会在下面解释我做了什么来实现它的工作 – Begui

6

我假设你已经安装了一个压缩工具(WinZip或7z等)。你可以写一个find_zip工具脚本会为WinZip的,或7Z等搜索...

片段为WinZip的:

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

片段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) 

取看看文件

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

它显示了CPack如何搜索Zip_Executable并准备一些“有用的”默认标志秒。

在那之后,我会建议execute_process,类似沙克拉的回答

0

基本上我所做的就是创建自定义的目标

add_custom_target(STAGE_FILES) 

有了这个目标我的文件和目录复制到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 
) 

重要行

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

在我的

to_zip.txt

我指定所有我想在我的zip包括

data/ 
video/ 
... 

我现在可以执行命令

make STAGE_FILES 
文件

这将复制和压缩我需要的一切