zip-файлы с использованием CMake?
tl; dr версия: возможно ли с помощью CMake (>=2.8) генерировать zip-файлы из некоторых файлов и помещать упакованный zip-файл в определенное место?
версия: У меня есть CMakeLists.txt, который строит мой проект .файл EXE. И этот EXE файл будет считывать данные из файла zip. Теперь это так, что содержимое, которое будет упаковано в zip-файл, находится в моем репозитории git, чтобы его можно было редактировать. Но программе нужны эти данные в zip-файле. Так что было бы хорошо, если бы скрипт cmake мог взять данные, поместить их в zip-файл и поместить его рядом с exe. Я уже слышал о CPack, но я не нашел простых примеров и не уверен, что это даже правильный инструмент для моей задачи.
это возможно? Если да, то как?
3 ответов
начиная с версии 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 вы можете использовать the jar команда, которая является частью стандартной установки Java JRE.
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
).
Я предполагаю, что у вас уже установлен 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)
фрагмент для 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, подобный ответ Сакры
по сути, то, что я сделал, это создать пользовательскую цель
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
копировать и ZIP все, что мне нужно