Bonjour,
Je n'ai pas trouvé de section dédiés à CMake sur Developpez, donc je mets ça ici. Si quelqu'un connait une meilleure section, qu'il me le dise et je déplacerai la discussion
Je découvre CMake depuis quelques jours et je suis arrivé à un blocage pour lequel Google ne m'a pas donné de solution. Je suis donc venu faire appel à votre savoir !
Pour mon projet, je dois générer des sources à partir de ressources. J'ai des PNG, des TTF, des XLSX et des outils les convertissent en *.cpp / *.hpp. J'ai réussi à faire à ça avec CMake. Le problème vient de la manière dont je pourrai ajouter ces sources à mon exécutable. En effet, je ne connais pas à l'avance le nom de ces fichiers C++ car leurs noms sont dérivés des noms des fichiers ressources. J'ai trouvé sur le net des exemples pour générer des sources et mettre des dépendances entre targets pour regénérer les sources si besoin mais ces exemples connaissent à l'avance les noms des fichiers générés. Moi, non...
Pour simplifier les choses, j'ai fait un projet minimaliste. J'ai donc le dossier de mon projet avec ce contenu :
Le dossier build est celui d'où j'exécute cmake.λ ls CMakeLists.txt build/ f.template main.cpp
Voici mon CMakeLists.txt :
Ce code fait ce que je veux conceptuellement, je cherche donc à le généraliser pour ne pas avoir en dur les noms f.cpp et f.template.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 cmake_minimum_required(VERSION 3.7) project(experiences-project) file(GLOB cpp_files *.cpp) file(GLOB hpp_files *.hpp) include_directories(.) add_executable(experiences ${cpp_files} ${hpp_files} ${CMAKE_SOURCE_DIR}/generated/f.cpp) add_custom_command( OUTPUT ${CMAKE_SOURCE_DIR}/generated/f.cpp COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SOURCE_DIR}/generated COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/f.template ${CMAKE_SOURCE_DIR}/generated/f.cpp COMMENT "Generating source from template..." ) add_custom_target( generate_sources ALL DEPENDS ${CMAKE_SOURCE_DIR}/f.template ) add_dependencies(experiences generate_sources)
Le problème ici est que les appels file(GLOB ...) ne peuvent pas récupérer les fichiers générés car ils n'existent pas au moment de l'appel à cmake et donc aux appels à file().
J'ai essayer de faire ceci mais ce n'est pas une syntaxe valide :
Le seul contournement trouvé est changer la commande add_executable() en :add_executable(experiences ${cpp_files} ${hpp_files} ${CMAKE_SOURCE_DIR}/generated/*.cpp)
Gros hic : je me retrouve à devoir appeler cmake (création sans les sources générés), make (génération des sources), cmake (mise à jour en incluant les sources générées), make (génération de l'exécutable) pour obtenir mon exécutable.add_executable(experiences ${cpp_files} ${hpp_files})
Auriez-vous une solution ?
Merci d'avance !
Partager