27

tl; drバージョン:

CMake(> = 2.8)を使用して、一部のファイルからzipファイルを生成し、パックされたzipファイルを特定の場所に配置することは可能ですか?

長いバージョン:

プロジェクトを.exeファイルにビルドするCMakeLists.txtがあり、このexeファイルはzipファイルからデータを読み取ります。zipファイルにパックされるコンテンツは私のgitリポジトリにあるので、編集することもできます。ただし、プログラムにはこのデータがzipファイルで含まれている必要があります。したがって、CMakeスクリプトがデータを取得し、それをzipファイルに入れて、exeの横に配置できると便利です。CPackについてはすでに聞いたことがありますが、簡単な例は見つからず、これが私のタスクに適したツールであるかどうかもわかりません。

これは可能ですか?はいの場合、どのように?

4

6 に答える 6

32

バージョン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")

以前のバージョンのCMakeの回避策として、標準のJavaJREインストールの一部である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バイナリディレクトリ(CMAKE_CURRENT_BINARY_DIR)に生成されます。

于 2011-08-13T17:12:42.647 に答える
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()

のように使用

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)
于 2018-10-29T18:40:44.900 に答える
7

すでにzipツール(WinZipや7zなど)がインストールされていると思います。WinZipや7Zなどを検索するfind_zip-toolスクリプトを作成できます...

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を検索し、いくつかの「有用な」デフォルトフラグを準備する方法を示しています。

その後、sakraの答えと同様にexecute_processを提案します

于 2011-08-31T06:56:24.780 に答える
5

file()バージョン3.18以降、CMakeは次のコマンドを使用したzipファイルまたはアーカイブファイルの作成を直接サポートするようになりましたARCHIVE_CREATE

file(ARCHIVE_CREATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/MyData.zip
    PATHS ${CMAKE_CURRENT_SOURCE_DIR}/data
    FORMAT zip
)

zipファイルのフルパスを必ず指定してください。指定しないと、ファイルが生成されない場合があります。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
)
于 2020-07-15T13:45:39.060 に答える
3

これはCMakeでzipファイルを作成するための上位の検索結果であるため、完全を期すためのCPackソリューションを次に示します。基本的な考え方は、呼び出しを行ってinstall()から、結果のzipファイルに名前を付けることです。ビルドディレクトリに配置されますが、変更する方法があるかもしれません。make package次に、またはを使用してzipファイルを作成できますcpack

# Version 1: Subtractive
# Include everything in the project source directory.
# Put it at the top level of the zip via `DESTINATION .`
# Subtract things we don't want.
# The trailing slash after "${PROJECT_SOURCE_DIR}/" prevents
# an extra layer of directories.
install(DIRECTORY "${PROJECT_SOURCE_DIR}/"
    DESTINATION .
    PATTERN ".git*" EXCLUDE
    PATTERN ".DS_Store" EXCLUDE
    PATTERN "examples" EXCLUDE
    PATTERN "docs" EXCLUDE
    PATTERN "README.md" EXCLUDE
)

# Version 2: Additive
# Include only the list of things we specify.
# Put it at the top level of the zip via `DESTINATION .`
# install(FILES
#     ${SRCS}
#     "Notes.txt"
#     DESTINATION .
# )

# Tell CPack to create a zip file.
set(CPACK_GENERATOR "ZIP")
# Tell CPack what to name the zip file. It will append `.zip`.
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}")
# Tell CPack not to put everything inside an enclosing directory.
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF)
# Apparently this should be always on but isn't for backwards compatibility.
set(CPACK_VERBATIM_VARIABLES YES)
include(CPack)
于 2020-10-12T09:29:46.103 に答える
1

基本的に私がしたことは、カスタムターゲットを作成することでした

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

必要なものをすべてコピーして圧縮します

于 2018-01-11T01:14:48.117 に答える