From 45ef4948db670224c7cc727507f84924bd826002 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Mon, 12 May 2025 13:10:48 +0200 Subject: core: begin c-style API --- cmake/Modules/GlibMkenums.cmake | 84 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 cmake/Modules/GlibMkenums.cmake (limited to 'cmake') diff --git a/cmake/Modules/GlibMkenums.cmake b/cmake/Modules/GlibMkenums.cmake new file mode 100644 index 0000000..b7caf10 --- /dev/null +++ b/cmake/Modules/GlibMkenums.cmake @@ -0,0 +1,84 @@ +include_guard() + +find_program(GLIB_MKENUMS_BIN + NAMES "glib-mkenums" + REQUIRED +) + +function(target_add_glib_enums TARGET) + set(SINGLE_VALUE_ARGS + "HEADER_OUTPUT_DIR" + "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 _HEADER_OUTPUT_DIR) + message(FATAL_ERROR "Missing header output dir") + 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}/include/${_HEADER_OUTPUT_DIR}/${_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() -- cgit v1.2.3