des fichiers zip utilisant CMake?

tl;dr version: est-il possible avec CMake (>= 2.8) de générer des fichiers zip à partir de certains fichiers et de placer le fichier zip emballé dans un endroit spécifique?

version plus longue: J'ai un CMakeLists.txt qui construisent mon projet à A.EXE. Et ce fichier exe Lira les données d'un fichier zip. Maintenant c'est pour que le contenu à emballer dans le fichier zip soit dans mon dépôt git pour qu'il puisse être édité aussi. Mais le programme a besoin de ces données dans un fichier zip. De sorte qu'il ce serait bien si le script cmake pouvait prendre les données, les mettre dans un fichier zip et les placer à côté de l'exe. J'ai déjà entendu parler de CPack, mais je n'ai pas trouvé d'exemples faciles et je ne suis pas sûr que ce soit le bon outil pour ma tâche.

Est-ce possible? Si oui: comment?

18
demandé sur blubberbernd 2011-08-13 18:22:57

3 réponses

depuis la version 3.2 CMake a la fonctionnalité de générer un fichier zip intégré. The CMake mode ligne de commande sous-commande tar supporte à la fois la création d'archives zip et 7zip.

par exemple, si le répertoire source CMake contient le fichier testfile.txt et le répertoire testdir, vous pouvez utiliser les commandes CMake suivantes pour créer un fichier zip contenant les deux éléments:

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

comme solution de rechange pour les versions antérieures de CMake, vous pouvez utiliser jar commande qui fait partie d'une installation Java JRE standard.

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
)

le fichier zip sera généré dans le dir binaire CMake actuel (CMAKE_CURRENT_BINARY_DIR).

22
répondu sakra 2016-07-21 14:49:26

je suppose que vous avez déjà installé un zip-tool (WinZip ou 7z,etc.). Vous pouvez écrire un script find_zip-tool qui recherchera WinZip, ou 7Z, etc...

Extrait de code pour WinZip:

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

Extrait de code pour 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)

jetez un oeil au fichier

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

il montre comment CPack recherche un Zip_Executable et prépare quelques options par défaut "utiles".

après cela, je suggérerais à execute_process, similaire à la réponse de sakra

6
répondu André 2011-08-31 06:56:24

essentiellement ce que j'ai fait était de créer une cible personnalisée

add_custom_target(STAGE_FILES)

avec cette cible je copie les fichiers et les répertoires vers le 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
)

il est important de la ligne

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

à l'intérieur de mon

to_zip.txt

je spécifie tous les fichiers que je veux inclure dans mon zip

data/
video/
...

je peux maintenant exécuter la commande

make STAGE_FILES

qui va copier et zip ce dont j'ai besoin

0
répondu Begui 2018-01-11 01:14:48