# SPDX-FileCopyrightText: 2025 Felix Morgner # SPDX-License-Identifier: LGPL-2.1-only include_guard() find_program(G_IR_SCANNER_BIN NAMES "g-ir-scanner" REQUIRED ) find_program(G_IR_COMPILER_BIN NAMES "g-ir-compiler" 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}/$/${_NAMESPACE}-${_VERSION}") add_custom_command(TARGET "${TARGET}" POST_BUILD BYPRODUCTS "${_OUTPUT_FILE}.gir" "${_OUTPUT_FILE}.typelib" COMMENT "Generating GIR file for ${TARGET}" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMAND "${G_IR_SCANNER_BIN}" ARGS "--quiet" "--warn-all" "--namespace=${_NAMESPACE}" "--nsversion=${_VERSION}" "--library=$" "--library-path=$" "$,PREPEND,-I>" "$,PREPEND,--pkg=>" "$" "--output=${_OUTPUT_FILE}.gir" ${_SOURCES} COMMAND "${G_IR_COMPILER_BIN}" "--output=${_OUTPUT_FILE}.typelib" "${_OUTPUT_FILE}.gir" COMMAND_EXPAND_LISTS VERBATIM ) install(FILES "${_OUTPUT_FILE}.gir" DESTINATION "${CMAKE_INSTALL_LIBDIR}/gir-1.0" ) install(FILES "${_OUTPUT_FILE}.typelib" DESTINATION "${CMAKE_INSTALL_LIBDIR}/girepository-1.0" ) endfunction()