J’essaie de créer un projet simple sur CLion. Il utilise CMake (je suis nouveau ici) pour générer des Makefiles pour construire un projet (ou une sorte de projet)
Tout ce dont j’ai besoin est de transférer un fichier non-projet (une sorte de fichier de ressources) dans un répertoire binary chaque fois que je lance le code.
Ce fichier contient des données de test et l’application l’ouvre pour les lire. J’ai essayé plusieurs façons de le faire:
Par file(COPY ...
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/input.txt
En regardant bien mais cela ne fonctionne qu’une fois et ne recopie pas le fichier après la prochaine exécution.
Via la commande add_custom_command
Version de OUTPUT
add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.txt ${CMAKE_CURRENT_BINARY_DIR}/input.txt)
Version TARGET
add_custom_target(foo) add_custom_command( TARGET foo COMMAND ${CMAKE_COMMAND} copy ${CMAKE_CURRENT_BINARY_DIR}/test/input.txt ${CMAKE_SOURCE_DIR})
Mais personne ne fonctionne.
Qu’est-ce que je fais mal?
Vous pouvez envisager d’utiliser configure_file avec l’option COPYONLY
:
configure_file(
Contrairement au file(COPY ...)
il crée une dépendance au niveau du fichier entre les entrées et les sorties, à savoir:
Si le fichier d’entrée est modifié, le système de génération ré-exécutera CMake pour reconfigurer le fichier et générer à nouveau le système de génération.
les deux options sont valides et ciblent deux étapes différentes de votre construction:
file(COPY ...
copie le fichier à l’étape de la configuration et uniquement à cette étape. Lorsque vous reconstruisez votre projet sans avoir modifié votre configuration cmake, cette commande ne sera pas exécutée. add_custom_command
est le choix préféré lorsque vous souhaitez copier le fichier à chaque étape de la génération. La bonne version pour votre tâche serait:
add_custom_command( TARGET foo POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/test/input.txt ${CMAKE_CURRENT_BINARY_DIR}/input.txt)
vous pouvez choisir entre PRE_BUILD
, PRE_LINK
, POST_BUILD
est mieux que vous lisez la documentation de add_custom_command
Vous trouverez ici un exemple d’utilisation de la première version: Utilisez CMake add_custom_command pour générer la source d’une autre cible
La première option que vous avez essayée ne fonctionne pas pour deux raisons.
Tout d’abord, vous avez oublié de fermer la parenthèse.
Deuxièmement, DESTINATION
devrait être un répertoire, pas un nom de fichier. En supposant que vous avez fermé la parenthèse, le fichier se retrouverait dans un dossier appelé input.txt
.
Pour que cela fonctionne, il suffit de le changer pour
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt DESTINATION ${CMAKE_CURRENT_BINARY_DIR})