summaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2025-05-22 17:45:44 +0200
committerFelix Morgner <felix.morgner@gmail.com>2025-05-22 18:06:31 +0200
commit8038808f1968b663e351a66023fabe0ed1b019f1 (patch)
tree9dc0c8cd07171cca9dd2ca748f5526f8598aa1fe /cmake
parent404b0f7844d8493869f98f91a7aa6427ca64f872 (diff)
downloadturns-8038808f1968b663e351a66023fabe0ed1b019f1.tar.xz
turns-8038808f1968b663e351a66023fabe0ed1b019f1.zip
lib: enable gir generation
Diffstat (limited to 'cmake')
-rw-r--r--cmake/Modules/GlibIntrospection.cmake82
1 files changed, 82 insertions, 0 deletions
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}/$<CONFIG>/${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=$<TARGET_FILE_BASE_NAME:${TARGET}>"
+ "--library-path=$<TARGET_FILE_DIR:${TARGET}>"
+ "$<LIST:TRANSFORM,$<TARGET_PROPERTY:${TARGET},INTERFACE_INCLUDE_DIRECTORIES>,PREPEND,-I>"
+ "$<LIST:TRANSFORM,$<LIST:TRANSFORM,${_DEPENDENCIES},TOLOWER>,PREPEND,--pkg=>"
+ "$<LIST:TRANSFORM,${_DEPENDENCIES},PREPEND,--include=>"
+ "--output=${_OUTPUT_FILE}"
+ ${_SOURCES}
+ COMMAND_EXPAND_LISTS
+ )
+
+endfunction() \ No newline at end of file