首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CMake压缩文件?

使用CMake压缩文件?
EN

Stack Overflow用户
提问于 2011-08-13 14:22:57
回答 6查看 21.9K关注 0票数 28

tl;dr版本:

CMake (>= 2.8)是否可以从某些文件生成压缩文件并将打包的压缩文件放在特定的位置?

更长版本:

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

这个是可能的吗?如果是,怎么做?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-13 17:12:42

因为3.2Version3.2CMake具有生成内置的zip文件的功能。CMake 命令行模式子命令tar支持创建zip和7zip档案。

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

代码语言:javascript
复制
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安装一部分的罐子命令。

代码语言:javascript
复制
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 (CMAKE_CURRENT_BINARY_DIR)中生成。

票数 32
EN

Stack Overflow用户

发布于 2018-10-29 18:40:44

说出真正的答案从来都不晚:

代码语言:javascript
复制
function(create_zip output_file input_files working_dir)
    add_custom_command(
        COMMAND ${CMAKE_COMMAND} -E tar "cf" "${output_file}" --format=zip -- ${input_files}
        WORKING_DIRECTORY "${working_dir}"
        OUTPUT  "${output_file}"
        DEPENDS ${input_files}
        COMMENT "Zipping to ${output_file}."
    )
endfunction()

使用类似

代码语言:javascript
复制
file(GLOB ZIP_FILES "${CMAKE_CURRENT_SOURCE_DIR}/zip/*")
create_zip("${CMAKE_CURRENT_BINARY_DIR}/native_data.zip" "${ZIP_FILES}" "${CMAKE_CURRENT_SOURCE_DIR}/zip")

这将将zip/子目录中的所有文件打包到native_data.zip (构建目录中)。然后要么包含您的存档(路径将在不同的CMakeLists.txt!)作为源文件或将其作为目标添加:

代码语言:javascript
复制
add_custom_target("project-data" ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/native_data.zip")

安装将不会有很大的不同,通常:

代码语言:javascript
复制
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/native_data.zip" DESTINATION ${DATADIR} RENAME "data000.zip") # Install our zip (as data000.zip)
票数 11
EN

Stack Overflow用户

发布于 2011-08-31 06:56:24

我想您已经安装了一个压缩工具(WinZip或7z等)。您可以编写一个find_zip工具脚本,它将搜索WinZip或7Z等.

用于WinZip的代码片段:

代码语言:javascript
复制
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的片段:

代码语言:javascript
复制
  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)

看一下文件

代码语言:javascript
复制
<cmake-install-dir>\share\cmake-2.8\Modules\CPackZIP.cmake

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

在那之后,我向execute_process建议,类似于sakra的回答

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7050997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档