2011-08-13 55 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 
文件

這將複製和壓縮我需要的一切