summaryrefslogtreecommitdiffstats
path: root/cmake/GObjectIntrospectionMacros.cmake
blob: 277bb9bb8cdcfdbb445b068c70557c29fb21545f (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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# Copyright (C) 2010, Pino Toscano, <pino@kde.org>
#           (C) 2017, Alexander Adolf <alexander.adolf@condition-alpha.com>
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying LICENSE.md.
#
# Sample use:
#
# include (FindGObjectIntrospection)   # this performs a pkg_check_modules()
# if(INTROSPECTION_FOUND)
#   include (GObjectIntrospectionMacros)
#   set (GIR_NAME "${PROJECT_NAME}-${PROJECT_VERSION}.gir")
#   set (${GIR_NAME}_NAMESPACE      ${PROJECT_NAME})
#   set (${GIR_NAME}_VERSION        ${PROJECT_VERSION})
#   set (${GIR_NAME}_INCLUDEPKGS    GObject-2.0)   # add more as needed
#   set (${GIR_NAME}_PROGRAM        ${CMAKE_CURRENT_BINARY_DIR}/gir_main)
#   set (${GIR_NAME}_FILES
#     #
#     # your source files here
#     #
#     )
#   list ( APPEND INTROSPECTION_GIRS ${GIR_NAME} )
#   set (INTROSPECTION_SCANNER_ARGS --warn-all)
#   gir_add_introspections (INTROSPECTION_GIRS)
#   #
#   # define your gir_main target here
#   #
#   # must build gir_main first in order to be able to infer typelibs
#   add_dependencies ( gir-typelibs gir_main )
# endif()
#
#

# add_custom_target(gir-girs)
add_custom_target(gir-typelibs)
# add_dependencies(gir-typelibs gir-girs)

set(_gir_specific_var_suffixes
  CFLAGS
  EXPORT_PACKAGES
  INCLUDEPKGS
  INCLUDES
  LIBS
  NAMESPACE
  PACKAGES
  PROGRAM
  VERSION
  )

macro(_gir_prefix_list_elements _outvar _listvar _prefix)
  set(${_outvar})
  foreach(_item IN LISTS ${_listvar})
    list(APPEND ${_outvar} ${_prefix}${_item})
  endforeach()
endmacro(_gir_prefix_list_elements)

macro(_gir_mangle_as_variable_name _name)
  # Transform a string to something which can be referenced through a variable
  # without automake/make complaining, eg Gtk-2.0.gir -> Gtk_2_0_gir
  string(REPLACE "-" "_" ${_name} "${${_name}}")
  string(REPLACE "." "_" ${_name} "${${_name}}")
endmacro(_gir_mangle_as_variable_name)

macro(_gir_add_introspections girs_list)
  # set(_gir_girs)
  # set(_gir_typelibs)

  foreach(_gir IN LISTS ${girs_list})

    set(_gir_name ${_gir})
    _gir_mangle_as_variable_name(_gir_name)

    # Namespace and Version is either fetched from the gir filename
    # or the _NAMESPACE/_VERSION variable combo
    set(_gir_namespace "${${_gir_name}_NAMESPACE}")
    if (_gir_namespace STREQUAL "")
      string(REGEX REPLACE "([^-]+)-.*" "\\1" _gir_namespace "${_gir}")
    endif ()
    set(_gir_version "${${_gir_name}_VERSION}")
    if (_gir_version STREQUAL "")
      string(REGEX REPLACE ".*-([^-]+).gir" "\\1" _gir_version "${_gir}")
    endif ()

    # _PROGRAM is an optional variable which needs it's own --program argument
    set(_gir_program "${${_gir_name}_PROGRAM}")
    if (NOT _gir_program STREQUAL "")
      set(_gir_program "--program=${_gir_program}")
    endif ()

    # Variables which provide lists of things
    _gir_prefix_list_elements(_gir_libraries ${_gir_name}_LIBS "--library=")
    _gir_prefix_list_elements(_gir_packages ${_gir_name}_PACKAGES "--pkg=")
    _gir_prefix_list_elements(_gir_includepkgs ${_gir_name}_INCLUDEPKGS "--include=")
    _gir_prefix_list_elements(_gir_includes ${_gir_name}_INCLUDES "-I")
    _gir_prefix_list_elements(_gir_export_packages ${_gir_name}_EXPORT_PACKAGES "--pkg-export=")

    # FIXME: reuse the LIBTOOL variable from automake if it's set
    set(_gir_libtool "--no-libtool")

    add_custom_command(
      COMMAND ${INTROSPECTION_SCANNER}
              ${INTROSPECTION_SCANNER_ARGS}
              --namespace=${_gir_namespace}
              --nsversion=${_gir_version}
    	      --add-include-path=${CMAKE_CURRENT_BINARY_DIR}
              --output ${CMAKE_CURRENT_BINARY_DIR}/${_gir}
              ${_gir_libtool}
              ${_gir_program}
              ${_gir_libraries}
              ${_gir_packages}
              ${_gir_includepkgs}
              ${_gir_includes}
              ${_gir_export_packages}
              ${${_gir_name}_SCANNERFLAGS}
              ${${_gir_name}_CFLAGS}
              ${${_gir_name}_FILES}
      DEPENDS ${${_gir_name}_FILES}
              ${${_gir_name}_LIBS}
	      ${${_gir_name}_PROGRAM}
      OUTPUT  ${_gir}
      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
      VERBATIM
      )
    add_custom_target(${_gir_name}_gir DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_gir})
    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_gir} DESTINATION share/gir-1.0)

    string(REPLACE ".gir" ".typelib" _typelib "${_gir}")
    add_custom_command(
      COMMAND ${INTROSPECTION_COMPILER}
              ${INTROSPECTION_COMPILER_ARGS}
              --includedir=.
              ${CMAKE_CURRENT_BINARY_DIR}/${_gir}
              -o ${CMAKE_CURRENT_BINARY_DIR}/${_typelib}
      DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_gir}
      OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/${_typelib}
      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
      )
    add_custom_target(${_gir_name}_typelib DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_typelib})
    add_dependencies(${_gir_name}_typelib ${_gir_name}_gir)
    add_dependencies(gir-typelibs ${_gir_name}_typelib)
    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_typelib} DESTINATION lib${LIB_SUFFIX}/girepository-1.0)

  endforeach()
endmacro(_gir_add_introspections)

macro(gir_add_introspections introspection_girs)
  foreach(gir IN LISTS ${introspection_girs})
    set(_name ${gir})
    _gir_mangle_as_variable_name(_name)
    _gir_prefix_list_elements(${_name}_FILES ${gir}_FILES "${CMAKE_CURRENT_SOURCE_DIR}/")
    foreach(_gir_var_suffix IN LISTS _gir_specific_var_suffixes)
      set(${_name}_${_gir_var_suffix} ${${gir}_${_gir_var_suffix}})
    endforeach()
  endforeach()
  _gir_add_introspections(${introspection_girs})
endmacro(gir_add_introspections)