tl;dr版本:
CMake (>= 2.8)是否可以从某些文件生成压缩文件并将打包的压缩文件放在特定的位置?
更长版本:
我有一个CMakeLists.txt,它将我的项目构建成一个.exe文件,这个exe文件将从一个zip文件中读取数据。压缩文件中要打包的内容在我的git存储库中,以便也可以进行编辑。但是,程序需要压缩文件中的这些数据。因此,如果CMake脚本能够获取数据,将其放入一个zip文件,并将其放在exe旁边,那就太好了。我已经听说过CPack,但是我没有找到任何简单的例子,也不确定这是否是完成任务的正确工具。
这个是可能的吗?如果是,怎么做?
发布于 2011-08-13 17:12:42
因为3.2Version3.2CMake具有生成内置的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")作为早期CMake版本的解决方案,您可以使用作为标准Java安装一部分的罐子命令。
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)中生成。
发布于 2018-10-29 18:40:44
说出真正的答案从来都不晚:
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()使用类似
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!)作为源文件或将其作为目标添加:
add_custom_target("project-data" ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/native_data.zip")安装将不会有很大的不同,通常:
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/native_data.zip" DESTINATION ${DATADIR} RENAME "data000.zip") # Install our zip (as data000.zip)发布于 2011-08-31 06:56:24
我想您已经安装了一个压缩工具(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建议,类似于sakra的回答
https://stackoverflow.com/questions/7050997
复制相似问题