diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2025-05-22 17:45:44 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2025-05-22 18:06:31 +0200 |
| commit | 8038808f1968b663e351a66023fabe0ed1b019f1 (patch) | |
| tree | 9dc0c8cd07171cca9dd2ca748f5526f8598aa1fe /cmake | |
| parent | 404b0f7844d8493869f98f91a7aa6427ca64f872 (diff) | |
| download | turns-8038808f1968b663e351a66023fabe0ed1b019f1.tar.xz turns-8038808f1968b663e351a66023fabe0ed1b019f1.zip | |
lib: enable gir generation
Diffstat (limited to 'cmake')
| -rw-r--r-- | cmake/Modules/GlibIntrospection.cmake | 82 |
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 |
