From 8038808f1968b663e351a66023fabe0ed1b019f1 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 22 May 2025 17:45:44 +0200 Subject: lib: enable gir generation --- cmake/Modules/GlibIntrospection.cmake | 82 +++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 cmake/Modules/GlibIntrospection.cmake (limited to 'cmake') diff --git a/cmake/Modules/GlibIntrospection.cmake b/cmake/Modules/GlibIntrospection.cmake new file mode 100644 index 0000000..c6b0752 --- /dev/null +++ b/cmake/Modules/GlibIntrospection.cmake @@ -0,0 +1,82 @@ +include_guard() + +find_program(G_IR_SCANNER_BIN + NAMES "g-ir-scanner" + REQUIRED +) + +function(target_glib_generate_gir TARGET) + if(NOT BUILD_SHARED_LIBS) + message(STATUS "GlibIntrospection: skipping GIR generation for static library target '${TARGET}'") + return() + endif() + + set(SINGLE_VALUE_ARGS + "NAMESPACE" + "OUTPUT" + "VERSION" + ) + set(MULTI_VALUE_ARGS + "DEPENDENCIES" + "SOURCES" + ) + cmake_parse_arguments( + PARSE_ARGV 1 + "" + "${OPTIONS}" + "${SINGLE_VALUE_ARGS}" + "${MULTI_VALUE_ARGS}" + ) + + if(NOT TARGET "${TARGET}") + message(FATAL_ERROR "GlibIntrospection: Target '${TARGET}' does not exist") + endif() + + if(NOT _NAMESPACE) + set(_NAMESPACE "${PROJECT_NAME}") + message(WARNING "GlibIntrospection: defaulting to namespace ${_NAMESPACE}") + endif() + + if(NOT _OUTPUT_DIR) + get_target_property(_OUTPUT_DIR "${TARGET}" BINARY_DIR) + endif() + + if(NOT _VERSION) + set(_VERSION "${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}") + message(WARNING "GlibIntrospection: defaulting to version ${_VERSION}") + endif() + + if(NOT _DEPENDENCIES) + message(FATAL_ERROR "GlibIntrospection: no dependencies specified") + endif() + + if(NOT _SOURCES) + get_target_property(SOURCES "${TARGET}" SOURCES) + get_target_property(HEADERS "${TARGET}" HEADER_SET) + set(_SOURCES ${HEADERS} ${SOURCES}) + endif() + + get_target_property(TARGET_OUTPUT_NAME "${TARGET}" OUTPUT_NAME) + set(_OUTPUT_FILE "${_OUTPUT_DIR}/$/${TARGET_OUTPUT_NAME}.gir") + + add_custom_command(TARGET "${TARGET}" + POST_BUILD + BYPRODUCTS "${_OUTPUT_FILE}" + COMMENT "Generating GIR file for ${TARGET}" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + COMMAND "${G_IR_SCANNER_BIN}" + ARGS + "--warn-all" + "--namespace=${_NAMESPACE}" + "--nsversion=${_VERSION}" + "--library=$" + "--library-path=$" + "$,PREPEND,-I>" + "$,PREPEND,--pkg=>" + "$" + "--output=${_OUTPUT_FILE}" + ${_SOURCES} + COMMAND_EXPAND_LISTS + ) + +endfunction() \ No newline at end of file -- cgit v1.2.3