summaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2025-05-12 13:10:48 +0200
committerFelix Morgner <felix.morgner@gmail.com>2025-05-12 13:10:48 +0200
commit45ef4948db670224c7cc727507f84924bd826002 (patch)
tree45ab5e37a3cb062f4276e8b1456cb5397e58eddc /cmake
parentcf6951bbfe99bf494f22c1b1d02fb6a8f45e73a9 (diff)
downloadturns-45ef4948db670224c7cc727507f84924bd826002.tar.xz
turns-45ef4948db670224c7cc727507f84924bd826002.zip
core: begin c-style API
Diffstat (limited to 'cmake')
-rw-r--r--cmake/Modules/GlibMkenums.cmake84
1 files changed, 84 insertions, 0 deletions
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()