include_guard() find_program(GLIB_MKENUMS_BIN NAMES "glib-mkenums" REQUIRED ) function(target_add_glib_enums TARGET) set(SINGLE_VALUE_ARGS "HEADER_TEMPLATE" "OUTPUT_NAME" "SOURCE_TEMPLATE" ) set(MULTI_VALUE_ARGS "HEADERS") cmake_parse_arguments( PARSE_ARGV 1 "" "${OPTIONS}" "${SINGLE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ) if(NOT TARGET "${TARGET}") message(FATAL_ERROR "Target '${TARGET}' does not exist") endif() if(NOT _HEADERS) message(FATAL_ERROR "Missing enum headers") endif() if(NOT _HEADER_TEMPLATE OR NOT _SOURCE_TEMPLATE) message(FATAL_ERROR "Missing templates") endif() if(NOT _OUTPUT_NAME) message(FATAL_ERROR "Missing output name") endif() set(SOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/src/${_OUTPUT_NAME}.c") set(HEADER_FILE "${CMAKE_CURRENT_SOURCE_DIR}/src/${_OUTPUT_NAME}.h") add_custom_command(OUTPUT ${SOURCE_FILE} ${HEADER_FILE} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMAND "${GLIB_MKENUMS_BIN}" ARGS "--template=${_SOURCE_TEMPLATE}" "--output=${SOURCE_FILE}" ${_HEADERS} COMMAND "${GLIB_MKENUMS_BIN}" ARGS "--template=${_HEADER_TEMPLATE}" "--output=${HEADER_FILE}" ${_HEADERS} VERBATIM COMMENT "Generating enum sources" DEPENDS ${_HEADERS} ${_SOURCE_TEMPLATE} ${_HEADER_TEMPLATE} ) target_sources("${TARGET}" PRIVATE "${SOURCE_FILE}" ) target_sources("${TARGET}" PUBLIC FILE_SET HEADERS FILES "${HEADER_FILE}" ) target_include_directories("${TARGET}" PUBLIC "${CMAKE_CURRENT_BINARY_DIR}" ) endfunction()