Como usar glib-compile-resources com CMake
Conforme qualquer projeto GTK cresce, os aplicativos GTK tendem a ser agrupados com gresources para separar o código e o design da IU. Isso é muito útil porque designers de UI / UX não precisam saber o código para ... bem projetar e, em última análise, contribuir com suas habilidades e esforços para o projeto.
Não apenas os designers, mas também os programadores se beneficiam muito! Porque o código se torna fortemente "lógico ou solução de problemas" em vez de manter o código da IU e da lógica juntos em um único arquivo.
Porém, para compilar nosso GResource, precisamos de uma glib-compile-resourcesferramenta utilitária. O comando geralmente funciona assim:
glib-compile-resources --generate-source --target=<output-file> <input-file>
Mas como faço para criar um script de construção que compila nossos arquivos gresource e vincula-o ao nosso projeto de destino? Ainda sou um novato no aprendizado do CMake e fui longe o suficiente para saber o que é um destino, como definir uma variável, como vincular um destino e também como obter os pacotes GTK necessários para vinculação. Mas não tenho ideia de como prosseguir para resolver isso :(
Respostas
Uma solução para isso é usar add_custom_command()para compilar seus recursos. Mas primeiro, aqui está uma análise do que você precisa para o seu script CMake:
- Puxe glib-compile-resources como um programa executável -
find_program() - Defina como compilar seu gresource -
add_custom_command() - Em seguida, defina sua meta personalizada -
add_custom_target() - Diga ao CMake que o recurso é um arquivo gerado -
set_source_files_properties() - Por fim, adicione seu destino personalizado ao destino do projeto como uma dependência -
add_dependencies()
Aqui está um exemplo 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)
Breve explicação
add_custom_command ()
OUTPUT- Este é o seu arquivo de recurso geradoWORKING_DIRECTORY- Onde seus arquivos XML e glade estão localizadosVERBATIM- Certifica-se de que nossoCOMMANDrecebimentoARGSnão foi alteradoMAIN_DEPENDENCY- para glib-compile-resources <input-file>DEPENDS- Seu (s) arquivo (s) glade. Se algum arquivo for alterado, sua construção de destino será acionada :)
add_custom_target ()
dummy-resource- Esse é o seu nome de destino personalizadoDEPENDS- A saída de que seu destino personalizado precisa para acionar seu comando personalizado
set_source_files_properties ()
Quando você gera seus arquivos de construção pela primeira vez usando o cmakecomando, seu arquivo de recurso ainda não foi gerado. Portanto, o CMake incorrerá em erro porque não sabe onde está o arquivo de recurso ou de onde ele vem. Precisamos dizer ao CMake "Não falhe, nosso arquivo de recursos é gerado mais tarde"
Use em --generate-dependenciesvez de codificação permanente
Agora você pode notar que estamos duplicando nosso esforço, ou seja, quando adicionamos novos arquivos glade ou removemos os existentes (ou quaisquer outros recursos como ícones, sons, arquivos css, etc), temos que editar nossos arquivos de script XML e CMake. glib-compile-resourcesjá fornecem geração de dependências para que possamos usar isso em nosso script CMake e torná-lo inteligente.
O truque é mudar seu arquivo .xml para .xml.in como um arquivo de configuração. Portanto, quando o arquivo de configuração muda, você chama a ferramenta glib com --generate-dependencies, obtém novos valores de saída de dependência e os envia para add_custom_command(... DEPENDS). Agora temos um CMake inteligente :)
Se você quiser abordar esse método, a postagem abaixo seria realmente útil:
Use a lista como dependências em add_custom_command
Boa sorte :)