J'essaye 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 celui-ci)
Tout ce dont j'ai besoin est de transférer un fichier non-projet (une sorte de fichier de ressources) dans un répertoire binaire à chaque fois que j'exécute mon 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:
Via
file(COPY ...
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/input.txt
Cela a l'air bien mais cela ne fonctionne qu'une seule fois et ne recopie pas le fichier après la prochaine exécution.
Via
add_custom_command
OUTPUT
versionadd_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)
TARGET
versionadd_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?
configure_file
ne fonctionnera pas avec les sous-répertoires, même si vous utilisez GLOB pour créer une liste de fichiers.les deux options sont valides et ciblent deux étapes différentes de votre build:
file(COPY ...
copie le fichier à l'étape de configuration et uniquement à cette étape. Lorsque vous reconstruisez votre projet sans avoir changé 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 construction.La bonne version pour votre tâche serait:
vous pouvez choisir entre
PRE_BUILD
,PRE_LINK
,POST_BUILD
mieux que vous est lu la documentation de add_custom_commandun exemple d'utilisation de la première version peut être trouvé ici: Utilisez CMake add_custom_command pour générer une source pour une autre cible
la source
CMAKE_CURRENT_SOURCE_DIR
si letest/input.txt
fichier est relatif auCMakeLists.txt
fichier actuel . Si c'est relatif à la racineCMakeLists.txt
, utilisezCMAKE_SOURCE_DIR
.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, le
DESTINATION
devrait être un répertoire, pas un nom de fichier. En supposant que vous fermiez la parenthèse, le fichier se retrouverait dans un dossier appeléinput.txt
.Pour que cela fonctionne, changez-le simplement en
la source
Je suggérerais
TARGET_FILE_DIR
si vous voulez que le fichier soit copié dans le même dossier que votre fichier .exe.Dans VS, ce script cmake copiera input.txt dans le même fichier que votre exe final, quel que soit son débogage ou sa version.
la source
C'est ce que j'ai utilisé pour copier certains fichiers de ressources: les fichiers de copie sont une cible vide pour ignorer les erreurs
la source
add_dependencies(MainTarget copy-files)
pour le faire fonctionner automatiquement lorsque je construis MainTargetadd_dependencies(MainTarget copy-files)
leCMakeLists.txt
fichier racine signifie qu'il peut être utilisé tout au long du projet.si vous souhaitez copier le dossier du répertoire groseille vers le dossier binaire (dossier de construction)
alors le syntexe est:
la source
Le fichier configure_file suggéré est probablement la solution la plus simple. Cependant, il ne réexécutera pas la commande de copie si vous avez supprimé manuellement le fichier du répertoire de construction. Pour gérer également ce cas, ce qui suit fonctionne pour moi:
la source