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 "GlibMkenums: Target '${TARGET}' does not exist") endif() if(NOT _HEADERS) message(FATAL_ERROR "GlibMkenums: No headers to be parsed were specified") endif() if(NOT _HEADER_TEMPLATE) message(STATUS "GlibMkenums: no header template was provided, skipping header generation") set(_SKIP_HEADER YES) endif() if(NOT _SOURCE_TEMPLATE) message(STATUS "GlibMkenums: no source template was provided, skipping header generation") set(_SKIP_SOURCE YES) endif() if(NOT _OUTPUT_NAME) message(FATAL_ERROR "GlibMkenums: No output name was specified") endif() if(_SKIP_HEADER AND _SKIP_SOURCE) message(AUTHOR_WARNING "GlibMkenums: No templates were specified, skipping all generation") return() endif() set(SOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/src/${_OUTPUT_NAME}.c") set(HEADER_FILE "${CMAKE_CURRENT_SOURCE_DIR}/src/${_OUTPUT_NAME}.h") if(NOT _SKIP_HEADER) add_custom_command(OUTPUT ${HEADER_FILE} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMAND "${GLIB_MKENUMS_BIN}" ARGS "--template=${_HEADER_TEMPLATE}" "--output=${HEADER_FILE}" ${_HEADERS} VERBATIM COMMENT "Generating enum interface header" DEPENDS ${_HEADERS} ${_HEADER_TEMPLATE} ) endif() if(NOT _SKIP_SOURCE) add_custom_command(OUTPUT ${SOURCE_FILE} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMAND "${GLIB_MKENUMS_BIN}" ARGS "--template=${_SOURCE_TEMPLATE}" "--output=${SOURCE_FILE}" ${_HEADERS} VERBATIM COMMENT "Generating enum interface source" DEPENDS ${_HEADERS} ${_SOURCE_TEMPLATE} ) endif() target_sources("${TARGET}" PRIVATE "${SOURCE_FILE}" ) if(NOT _SKIP_HEADER) target_sources("${TARGET}" PUBLIC FILE_SET HEADERS FILES "${HEADER_FILE}" ) endif() endfunction()