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?
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
).
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
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