1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
# SPDX-FileCopyrightText: 2025 Felix Morgner <felix.morgner@gmail.com>
# 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}/$<CONFIG>/${_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=$<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}.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()
|