Cómo usar glib-compile-resources con CMake
A medida que crece cualquier proyecto GTK, las aplicaciones GTK tienden a incluirse con gresources para separar el código y el diseño de la interfaz de usuario. Esto es muy útil porque los diseñadores de UI / UX no necesitan saber código para ... diseñar bien y, en última instancia, contribuir con sus habilidades y esfuerzo al proyecto.
¡No solo los diseñadores, sino también los programadores se benefician mucho! Porque el código se vuelve muy "lógico o de resolución de problemas" en lugar de mantener la interfaz de usuario y el código lógico juntos en un solo archivo.
Sin embargo, para compilar nuestro GResource necesitamos una glib-compile-resourcesherramienta de utilidad. El comando suele ser así:
glib-compile-resources --generate-source --target=<output-file> <input-file>
Pero, ¿cómo creo un script de compilación que compile nuestros archivos gresource y lo vincule con nuestro proyecto de destino? Todavía soy un novato en el aprendizaje de CMake y he llegado lo suficientemente lejos como para saber qué es un objetivo, cómo establecer una variable, cómo vincular un objetivo y también cómo extraer los paquetes GTK necesarios para vincular. Pero no tengo ni idea de cómo proceder para resolver esto :(
Respuestas
Una solución a esto es usar add_custom_command()para compilar sus recursos gresources. Pero primero aquí hay un desglose de lo que necesita para su script de CMake:
- Extraiga glib-compile-resources como programa ejecutable -
find_program() - Defina cómo compilar su gresource -
add_custom_command() - Luego defina su objetivo personalizado -
add_custom_target() - Dígale a CMake que el recurso es un archivo generado -
set_source_files_properties() - Finalmente, agregue su destino personalizado al destino de su proyecto como una dependencia:
add_dependencies()
Aquí hay una secuencia de comandos de CMake de muestra:
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)
Breve explicacion
add_custom_command ()
OUTPUT- Este es su archivo de recursos generadoWORKING_DIRECTORY- Dónde se encuentran sus archivos XML y gladeVERBATIM- Se asegura de que nuestroCOMMANDrecibaARGSsin cambiosMAIN_DEPENDENCY- para glib-compile-resources <input-file>DEPENDS- Su (s) archivo (s) de glade. Si alguno de los archivos cambia, se activa la compilación de destino :)
add_custom_target ()
dummy-resource- Ese es tu nombre de objetivo personalizadoDEPENDS- La salida que necesita su objetivo personalizado para activar su comando personalizado
set_source_files_properties ()
Cuando genera por primera vez sus archivos de compilación con el cmakecomando, su archivo de recursos aún no se genera. Por lo tanto, CMake se encontrará con un error porque no sabe dónde está su archivo de recursos o de dónde viene. Necesitamos decirle a CMake "No falle, nuestro archivo de recursos se genera más tarde"
Usar en --generate-dependencieslugar de codificar
Ahora puede notar que estamos duplicando nuestro esfuerzo, es decir, cuando agregamos nuevos archivos de glade o eliminamos los existentes (o cualquier otro recurso como iconos, sonidos, archivos css, etc.) tenemos que editar nuestros archivos de script XML y CMake. glib-compile-resourcesya proporcionan generación de dependencias para que podamos usar eso en nuestro script CMake y hacerlo inteligente.
El truco consiste en cambiar su archivo .xml a .xml.in como archivo de configuración. Entonces, cuando ese archivo de configuración cambia, llama a la herramienta glib con --generate-dependencies, obtiene nuevos valores de salida de dependencia y envía eso a add_custom_command(... DEPENDS). Ahora tenemos un CMake inteligente :)
Si desea abordar este método, la siguiente publicación sería realmente útil:
Use la lista como dependencias en add_custom_command
Buena suerte :)