summaryrefslogtreecommitdiff
path: root/cmake/Modules/GlibIntrospection.cmake
blob: ffec754813d7884e20caffc4af73f29cf8fbf25c (plain)
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
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()