Comment utiliser glib-compile-resources avec CMake
Au fur et à mesure que tout projet GTK se développe, les applications GTK ont tendance à être regroupées avec des ressources pour séparer le code et la conception de l'interface utilisateur. Ceci est très utile car les concepteurs UI / UX n'ont pas besoin de connaître le code pour ... bien concevoir et finalement apporter leurs compétences et leurs efforts au projet.
Non seulement les concepteurs mais aussi les programmeurs en bénéficient beaucoup! Parce que le code devient fortement «logique ou résolution de problèmes» au lieu de conserver à la fois l'interface utilisateur et le code logique dans un seul fichier.
Cependant, pour compiler notre GResource, nous avons besoin d' glib-compile-resourcesun outil utilitaire. La commande va généralement comme ceci:
glib-compile-resources --generate-source --target=<output-file> <input-file>
Mais comment créer un script de construction qui compile nos fichiers gresource et le lie à notre projet cible? Je suis encore un débutant en apprentissage de CMake et je suis assez loin pour savoir ce qu'est une cible, comment définir une variable, comment lier une cible et aussi comment extraire les packages GTK requis pour la liaison. Mais je ne sais pas comment procéder pour résoudre ce problème :(
Réponses
Une solution à cela consiste à utiliser add_custom_command()pour compiler vos gresources. Mais d'abord, voici une ventilation de ce dont vous avez besoin pour votre script CMake:
- Extrayez glib-compile-resources comme programme exécutable -
find_program() - Définissez comment compiler votre gresource -
add_custom_command() - Puis définissez votre cible personnalisée -
add_custom_target() - Dites à CMake que la ressource est un fichier généré -
set_source_files_properties() - Enfin, ajoutez votre cible personnalisée à la cible de votre projet en tant que dépendance -
add_dependencies()
Voici un exemple de script CMake:
cmake_minimum_required(VERSION 3.15)
project(dummy)
# Step 1:
find_program(GLIB_COMPILE_RESOURCES NAMES glib-compile-resources REQUIRED)
set(GRESOURCE_C test.gresource.c)
set(GRESOURCE_XML test.gresource.xml)
# Step 2:
add_custom_command(
OUTPUT ${GRESOURCE_C} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMAND ${GLIB_COMPILE_RESOURCES} ARGS --target=${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C} ${GRESOURCE_XML}
VERBATIM
MAIN_DEPENDENCY ${GRESOURCE_XML} DEPENDS for.glade bar.glade ) # Step 3: add_custom_target( dummy-resource DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C} ) # Step 4: add_executable(${PROJECT_NAME} dummy.c ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C})
set_source_files_properties(
${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}
PROPERTIES GENERATED TRUE
)
# Step 5:
add_dependencies(${PROJECT_NAME} dummy-resource)
Brève explication
add_custom_command ()
OUTPUT- Ceci est votre fichier de ressources généréWORKING_DIRECTORY- Où se trouvent vos fichiers XML et gladeVERBATIM- S'assure que notreCOMMANDreçoitARGSinchangéMAIN_DEPENDENCY- pour glib-compile-resources <input-file>DEPENDS- Votre (vos) fichier (s) Glade. Si l'un des fichiers change, votre build cible est déclenchée :)
add_custom_target ()
dummy-resource- C'est votre nom de cible personnaliséDEPENDS- La sortie dont votre cible personnalisée a besoin pour déclencher votre commande personnalisée
set_source_files_properties ()
Lorsque vous générez pour la première fois vos fichiers de construction à l'aide de la cmakecommande, votre fichier de ressources n'est pas encore généré. CMake rencontrera donc une erreur car il ne sait pas où se trouve votre fichier de ressources ni d'où il vient. Nous devons dire à CMake "N'échouez pas, notre fichier de ressources est généré plus tard"
Utiliser --generate-dependenciesau lieu du codage en dur
Maintenant, vous remarquerez peut-être que nous dupliquons nos efforts, c'est-à-dire que lorsque nous ajoutons de nouveaux fichiers Glade ou supprimons des fichiers existants (ou toute autre ressource telle que des icônes, des sons, des fichiers css, etc.), nous devons modifier nos fichiers de script XML et CMake. glib-compile-resourcesfournissent déjà la génération de dépendances afin que nous puissions l'utiliser dans notre script CMake et le rendre intelligent.
L'astuce consiste à changer votre fichier .xml en .xml.in en tant que fichier de configuration. Ainsi, lorsque ce fichier de configuration change, vous appelez l'outil glib avec --generate-dependencies, obtenez de nouvelles valeurs de sortie de dépendance et envoyez-les à add_custom_command(... DEPENDS). Maintenant, nous avons un CMake intelligent :)
Si vous souhaitez aborder cette méthode, l'article ci-dessous serait vraiment utile:
Utiliser la liste comme dépendances sur add_custom_command
Bonne chance :)