# SPDX-FileCopyrightText: 2025 Felix Morgner # SPDX-License-Identifier: LGPL-2.1-only find_program(GLIB_COMPILE_RESOURCES NAMES "glib-compile-resources" REQUIRED ) function(target_add_glib_resources TARGET) set(SINGLE_VALUE_ARGS "NAME" "PREFIX" "WORKING_DIRECTORY") set(MULTI_VALUE_ARGS "CSS_FILES" "XML_FILES") cmake_parse_arguments( PARSE_ARGV 1 "" "${OPTIONS}" "${SINGLE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ) # Sanity Checks if(NOT TARGET "${TARGET}") message(FATAL_ERROR "Target '${TARGET}' does not exist") endif() if(NOT _NAME) set(_NAME "${TARGET}") endif() if(NOT _PREFIX) message(FATAL_ERROR "Glib resource prefix not defined") endif() if(NOT _WORKING_DIRECTORY) set(_WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") endif() # File Names set(GLIB_RESOURCE_C_FILE "${CMAKE_CURRENT_BINARY_DIR}/${_NAME}.gresource.c") set(GLIB_RESOURCE_MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/${_NAME}.gresource.xml") # Manifest File foreach(XML_FILE IN LISTS _XML_FILES) string(APPEND GLIB_RESOURCE_FILES " ${XML_FILE}\n") endforeach() foreach(CSS_FILE IN LISTS _CSS_FILES) string(APPEND GLIB_RESOURCE_FILES " ${CSS_FILE}\n") endforeach() string(STRIP "${GLIB_RESOURCE_FILES}" GLIB_RESOURCE_FILES) set(GLIB_RESOURCE_PREFIX "${_PREFIX}") configure_file("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/GlibCompileResources.in" "${GLIB_RESOURCE_MANIFEST}" ) # Source Generation foreach(FILE IN LISTS _CSS_FILES _XML_FILES) list(APPEND _DEPS "${_WORKING_DIRECTORY}/${FILE}") endforeach() add_custom_command(OUTPUT "${GLIB_RESOURCE_C_FILE}" WORKING_DIRECTORY "${_WORKING_DIRECTORY}" COMMAND "${GLIB_COMPILE_RESOURCES}" ARGS "--target=${GLIB_RESOURCE_C_FILE}" "--generate-source" "--internal" "${GLIB_RESOURCE_MANIFEST}" VERBATIM MAIN_DEPENDENCY "${GLIB_RESOURCE_MANIFEST}" DEPENDS ${_DEPS} ) # Target Inclusion target_sources("${TARGET}" PRIVATE "${GLIB_RESOURCE_C_FILE}" ) endfunction()