使用CMake的zip文件?

blu*_*rnd 21 zip cmake cpack

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

更长版本: 我有一个CMakeLists.txt,可以将我的项目构建为.exe文件.此exe文件将从zip文件中读取数据.现在,要在zip文件中打包的内容在我的git存储库中,以便它也可以编辑.但程序需要这个数据在一个zip文件中.因此,如果cmake脚本可以获取数据,将其放在zip文件中并将其放在exe旁边,那将是很好的.我已经听说过CPack,但我没有找到简单的例子,也不确定这是否适合我的任务.

这可能吗?如果是的话:怎么样?

sak*_*kra 24

从版本3.2开始,CMake具有生成内置zip文件的功能.CMake 命令行模式子命令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")
Run Code Online (Sandbox Code Playgroud)

作为早期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
)
Run Code Online (Sandbox Code Playgroud)

zip文件将在当前的CMake二进制dir(CMAKE_CURRENT_BINARY_DIR)中生成.


val*_*ica 11

显示真正的答案永远不会晚:

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()
Run Code Online (Sandbox Code Playgroud)

使用喜欢

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")
Run Code Online (Sandbox Code Playgroud)

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

add_custom_target("project-data" ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/native_data.zip")
Run Code Online (Sandbox Code Playgroud)

安装不会与平常有很大不同:

install(FILES "${CMAKE_CURRENT_BINARY_DIR}/native_data.zip" DESTINATION ${DATADIR} RENAME "data000.zip") # Install our zip (as data000.zip)
Run Code Online (Sandbox Code Playgroud)


squ*_*les 7

从版本 3.18 开始,CMake 现在直接支持使用file()以下命令创建 zip 或存档文件ARCHIVE_CREATE

file(ARCHIVE_CREATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/MyData.zip
    PATHS ${CMAKE_CURRENT_SOURCE_DIR}/data
    FORMAT zip
)
Run Code Online (Sandbox Code Playgroud)

请务必指定压缩文件名的完整OUTPUT路径,否则可能无法生成该文件。此外,该PATHS选项接受要放入 zip 文件中的文件目录,但在编写本文时不接受通配符

该命令支持多种存档格式和压缩风格。因此,您也可以使用相同的命令来创建 tarball:

file(ARCHIVE_CREATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/MyData.tar.gz
    PATHS ${CMAKE_CURRENT_SOURCE_DIR}/data
    FORMAT gnutar
    COMPRESSION GZip
)
Run Code Online (Sandbox Code Playgroud)


And*_*dré 6

我假设你已经安装了一个zip工具(WinZip或7z等).您可以编写一个find_zip-tool脚本来搜索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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

看看文件

<cmake-install-dir>\share\cmake-2.8\Modules\CPackZIP.cmake
Run Code Online (Sandbox Code Playgroud)

它显示了CPack如何搜索Zip_Executable并准备一些"有用的"默认标志.

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