2011-08-13 17 views
16

tl; dr phiên bản: là có thể với CMake (> = 2.8) để tạo tệp zip từ một số tệp và đặt tệp nén được đóng gói ở một vị trí cụ thể không?tệp zip bằng CMake?

phiên bản dài hơn: Tôi có một CMakeLists.txt xây dựng dự án của tôi thành tệp .exe. Và tệp exe này sẽ đọc dữ liệu từ tệp zip. Bây giờ nó là để các nội dung được đóng gói trong tập tin zip là trong kho git của tôi để nó có thể được chỉnh sửa, quá. Nhưng chương trình cần dữ liệu này trong một tệp zip. Vì vậy, nó sẽ là tốt nếu kịch bản cmake có thể lấy dữ liệu, đặt nó trong một tập tin zip và đặt nó bên cạnh exe. Tôi đã nghe nói về CPack, nhưng tôi đã không tìm thấy ví dụ dễ dàng và không chắc chắn nếu điều này thậm chí là công cụ thích hợp cho nhiệm vụ của tôi.

Điều này có khả thi không? Nếu có: làm thế nào?

Trả lời

21

Kể từ phiên bản 3.2 CMake có chức năng tạo tệp zip được tích hợp sẵn. Các CMake command-line mode lệnh phụ tar hỗ trợ cả việc tạo lưu trữ zip và 7zip.

Ví dụ, nếu thư mục nguồn CMake hiện chứa các tập tin testfile.txt và thư mục testdir, bạn có thể sử dụng CMake sau lệnh để tạo một file zip có chứa cả các mặt hàng:

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

Là một công việc xung quanh đối với các phiên bản CMake trước đó, bạn có thể sử dụng lệnh jar là một phần của cài đặt Java JRE chuẩn.

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 
) 

Tệp zip sẽ được tạo trong thư mục nhị phân CMake hiện tại (CMAKE_CURRENT_BINARY_DIR).

+0

Phương pháp này dường như tạo một tệp zip trống. Tuy nhiên, có vẻ như tôi có thể tạo một kho lưu trữ dân cư bằng cách chỉ định tùy chọn "files-from = files.txt". Dường như thất bại với các thư mục và tập tin trong các thư mục – Begui

+0

Ahh, chỉ cần tìm ra nó .. Tôi sẽ giải thích dưới đây những gì tôi đã làm để có được điều này để làm việc – Begui

6

Tôi giả sử bạn đã cài đặt công cụ zip (WinZip hoặc 7z, v.v.). Bạn có thể viết một kịch bản find_zip-công cụ mà sẽ tìm kiếm WinZip, hoặc 7Z, vv ...

Snippet cho WinZip:

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

Snippet cho 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) 

Đưa xem tệp

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

nó hiển thị cách CPack tìm kiếm Zip_Executable và chuẩn bị một số cờ "hữu ích" mặc định S.

Sau đó, tôi sẽ đề nghị để execute_process, tương tự như câu trả lời Sakra của

0

Về cơ bản những gì tôi đã làm là tạo các tùy chỉnh nhắm mục tiêu

add_custom_target(STAGE_FILES) 

Với mục tiêu này, tôi sao chép các tập tin và thư mục với 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 
) 

Dòng quan trọng

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

bên tôi

to_zip.txt

tôi chỉ định tất cả các file tôi muốn bao gồm trong zip của tôi

data/ 
video/ 
... 

bây giờ tôi có thể thực hiện lệnh

make STAGE_FILES 

sẽ sao chép và nén mọi thứ tôi cần