CMake: copie le fichier du répertoire source vers le répertoire binary

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:

Qu’est-ce que je fais mal?

Vous pouvez envisager d’utiliser configure_file avec l’option COPYONLY :

 configure_file(  COPYONLY) 

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:

  1. 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.
  2. 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})