add flag back in
[roojspacker] / cmake / FindGLib.cmake
1 # FindGLib.cmake
2 # <https://github.com/nemequ/gnome-cmake>
3 #
4 # CMake support for GLib/GObject/GIO.
5 #
6 # License:
7 #
8 #   Copyright (c) 2016 Evan Nemerson <evan@nemerson.com>
9 #
10 #   Permission is hereby granted, free of charge, to any person
11 #   obtaining a copy of this software and associated documentation
12 #   files (the "Software"), to deal in the Software without
13 #   restriction, including without limitation the rights to use, copy,
14 #   modify, merge, publish, distribute, sublicense, and/or sell copies
15 #   of the Software, and to permit persons to whom the Software is
16 #   furnished to do so, subject to the following conditions:
17 #
18 #   The above copyright notice and this permission notice shall be
19 #   included in all copies or substantial portions of the Software.
20 #
21 #   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 #   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 #   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 #   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25 #   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
26 #   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27 #   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28 #   DEALINGS IN THE SOFTWARE.
29
30 find_package(PkgConfig)
31
32 if(PKG_CONFIG_FOUND)
33   pkg_search_module(GLIB_PKG    glib-2.0)
34   pkg_search_module(GOBJECT_PKG gobject-2.0)
35   pkg_search_module(GIO_PKG     gio-2.0)
36 endif()
37
38 find_library(GLIB    glib-2.0    HINTS ${GLIB_PKG_LIBRARY_DIRS})
39 find_library(GOBJECT gobject-2.0 HINTS ${GOBJECT_PKG_LIBRARY_DIRS})
40 find_library(GIO     gio-2.0     HINTS ${GIO_PKG_LIBRARY_DIRS})
41
42 if(GLIB)
43   add_library(glib-2.0 SHARED IMPORTED)
44   set_property(TARGET glib-2.0 PROPERTY IMPORTED_LOCATION "${GLIB}")
45
46   find_path(GLIB_INCLUDE_DIRS "glib.h"
47     HINTS ${GLIB_PKG_INCLUDE_DIRS}
48     PATH_SUFFIXES "glib-2.0")
49
50   get_filename_component(GLIB_LIBDIR "${GLIB}" DIRECTORY)
51   find_path(GLIB_CONFIG_INCLUDE_DIR "glibconfig.h"
52     HINTS
53       ${GLIB_LIBDIR}
54       ${GLIB_PKG_INCLUDE_DIRS}
55     PATHS
56       "${CMAKE_LIBRARY_PATH}"
57     PATH_SUFFIXES
58       "glib-2.0/include"
59       "glib-2.0")
60   unset(GLIB_LIBDIR)
61
62   if(NOT GLIB_CONFIG_INCLUDE_DIR)
63     unset(GLIB_INCLUDE_DIRS)
64   else()
65     file(STRINGS "${GLIB_CONFIG_INCLUDE_DIR}/glibconfig.h" GLIB_MAJOR_VERSION REGEX "^#define GLIB_MAJOR_VERSION +([0-9]+)")
66     string(REGEX REPLACE "^#define GLIB_MAJOR_VERSION ([0-9]+)$" "\\1" GLIB_MAJOR_VERSION "${GLIB_MAJOR_VERSION}")
67     file(STRINGS "${GLIB_CONFIG_INCLUDE_DIR}/glibconfig.h" GLIB_MINOR_VERSION REGEX "^#define GLIB_MINOR_VERSION +([0-9]+)")
68     string(REGEX REPLACE "^#define GLIB_MINOR_VERSION ([0-9]+)$" "\\1" GLIB_MINOR_VERSION "${GLIB_MINOR_VERSION}")
69     file(STRINGS "${GLIB_CONFIG_INCLUDE_DIR}/glibconfig.h" GLIB_MICRO_VERSION REGEX "^#define GLIB_MICRO_VERSION +([0-9]+)")
70     string(REGEX REPLACE "^#define GLIB_MICRO_VERSION ([0-9]+)$" "\\1" GLIB_MICRO_VERSION "${GLIB_MICRO_VERSION}")
71     set(GLIB_VERSION "${GLIB_MAJOR_VERSION}.${GLIB_MINOR_VERSION}.${GLIB_MICRO_VERSION}")
72     unset(GLIB_MAJOR_VERSION)
73     unset(GLIB_MINOR_VERSION)
74     unset(GLIB_MICRO_VERSION)
75
76     list(APPEND GLIB_INCLUDE_DIRS ${GLIB_CONFIG_INCLUDE_DIR})
77   endif()
78 endif()
79
80 if(GOBJECT)
81   add_library(gobject-2.0 SHARED IMPORTED)
82   set_property(TARGET gobject-2.0 PROPERTY IMPORTED_LOCATION "${GOBJECT}")
83
84   find_path(GOBJECT_INCLUDE_DIRS "glib-object.h"
85     HINTS ${GOBJECT_PKG_INCLUDE_DIRS}
86     PATH_SUFFIXES "glib-2.0")
87   if(GOBJECT_INCLUDE_DIRS)
88     list(APPEND GOBJECT_INCLUDE_DIRS ${GLIB_INCLUDE_DIRS})
89     list(REMOVE_DUPLICATES GOBJECT_INCLUDE_DIRS)
90   endif()
91 endif()
92
93 if(GIO)
94   add_library(gio-2.0 SHARED IMPORTED)
95   set_property(TARGET gio-2.0 PROPERTY IMPORTED_LOCATION "${GIO}")
96
97   find_path(GIO_INCLUDE_DIRS "gio/gio.h"
98     HINTS ${GIO_PKG_INCLUDE_DIRS}
99     PATH_SUFFIXES "glib-2.0")
100   if(GIO_INCLUDE_DIRS)
101     list(APPEND GIO_INCLUDE_DIRS ${GOBJECT_INCLUDE_DIRS})
102     list(REMOVE_DUPLICATES GIO_INCLUDE_DIRS)
103   endif()
104 endif()
105
106 find_program(GLIB_GENMARSHAL glib-genmarshal)
107 if(GLIB_GENMARSHAL)
108   add_executable(glib-genmarshal IMPORTED)
109   set_property(TARGET glib-genmarshal PROPERTY IMPORTED_LOCATION "${GLIB_GENMARSHAL}")
110 endif()
111
112 find_program(GLIB_MKENUMS glib-mkenums)
113 if(GLIB_MKENUMS)
114   add_executable(glib-mkenums IMPORTED)
115   set_property(TARGET glib-mkenums PROPERTY IMPORTED_LOCATION "${GLIB_MKENUMS}")
116 endif()
117
118 find_program(GLIB_COMPILE_SCHEMAS glib-compile-schemas)
119 if(GLIB_COMPILE_SCHEMAS)
120   add_executable(glib-compile-schemas IMPORTED)
121   set_property(TARGET glib-compile-schemas PROPERTY IMPORTED_LOCATION "${GLIB_COMPILE_SCHEMAS}")
122 endif()
123
124 # glib_install_schemas(
125 #   [DESTINATION directory]
126 #   schemas…)
127 #
128 # Validate and install the listed schemas.
129 function(glib_install_schemas)
130   set (options)
131   set (oneValueArgs DESTINATION)
132   set (multiValueArgs)
133   cmake_parse_arguments(GSCHEMA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
134   unset (options)
135   unset (oneValueArgs)
136   unset (multiValueArgs)
137
138   foreach(schema ${GSCHEMA_UNPARSED_ARGUMENTS})
139     get_filename_component(schema_name "${schema}" NAME)
140     string(REGEX REPLACE "^(.+)\.gschema.xml$" "\\1" schema_name "${schema_name}")
141     set(schema_output "${CMAKE_CURRENT_BINARY_DIR}/${schema_name}.gschema.xml.valid")
142
143     add_custom_command(
144       OUTPUT "${schema_output}"
145       COMMAND glib-compile-schemas
146         --strict
147         --dry-run
148         --schema-file="${schema}"
149       COMMAND "${CMAKE_COMMAND}" ARGS -E touch "${schema_output}"
150       DEPENDS "${schema}"
151       WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
152       COMMENT "Validating ${schema}")
153
154     add_custom_target("gsettings-schema-${schema_name}" ALL
155       DEPENDS "${schema_output}")
156
157     if(CMAKE_INSTALL_FULL_DATADIR)
158       set(SCHEMADIR "${CMAKE_INSTALL_FULL_DATADIR}/glib-2.0/schemas")
159     else()
160       set(SCHEMADIR "${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas")
161     endif()
162     install(FILES "${schema}"
163       DESTINATION "${SCHEMADIR}")
164     install(CODE "execute_process(COMMAND \"${GLIB_COMPILE_SCHEMAS}\" \"${SCHEMADIR}\")")
165   endforeach()
166 endfunction()
167
168 find_program(GLIB_COMPILE_RESOURCES glib-compile-resources)
169 if(GLIB_COMPILE_RESOURCES)
170   add_executable(glib-compile-resources IMPORTED)
171   set_property(TARGET glib-compile-resources PROPERTY IMPORTED_LOCATION "${GLIB_COMPILE_RESOURCES}")
172 endif()
173
174 function(glib_compile_resources SPEC_FILE)
175   set (options INTERNAL)
176   set (oneValueArgs TARGET SOURCE_DIR HEADER SOURCE C_NAME)
177   set (multiValueArgs)
178   cmake_parse_arguments(GLIB_COMPILE_RESOURCES "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
179   unset (options)
180   unset (oneValueArgs)
181   unset (multiValueArgs)
182
183   if(NOT GLIB_COMPILE_RESOURCES_SOURCE_DIR)
184     set(GLIB_COMPILE_RESOURCES_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
185   endif()
186
187   set(FLAGS)
188
189   if(GLIB_COMPILE_RESOURCES_INTERNAL)
190     list(APPEND FLAGS "--internal")
191   endif()
192
193   if(GLIB_COMPILE_RESOURCES_C_NAME)
194     list(APPEND FLAGS "--c-name" "${GLIB_COMPILE_RESOURCES_C_NAME}")
195   endif()
196
197   get_filename_component(SPEC_FILE "${SPEC_FILE}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
198
199   execute_process(
200     COMMAND glib-compile-resources
201       --generate-dependencies
202       --sourcedir "${GLIB_COMPILE_RESOURCES_SOURCE_DIR}"
203       "${SPEC_FILE}"
204     OUTPUT_VARIABLE deps
205     WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
206     OUTPUT_STRIP_TRAILING_WHITESPACE)
207
208   if(GLIB_COMPILE_RESOURCES_HEADER)
209     get_filename_component(GLIB_COMPILE_RESOURCES_HEADER "${GLIB_COMPILE_RESOURCES_HEADER}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
210
211     add_custom_command(
212       OUTPUT "${GLIB_COMPILE_RESOURCES_HEADER}"
213       COMMAND glib-compile-resources
214         --sourcedir "${GLIB_COMPILE_RESOURCES_SOURCE_DIR}"
215         --generate-header
216         --target "${GLIB_COMPILE_RESOURCES_HEADER}"
217         ${FLAGS}
218         "${SPEC_FILE}"
219       DEPENDS "${SPEC_FILE}" ${deps}
220       WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
221   endif()
222
223   if(GLIB_COMPILE_RESOURCES_SOURCE)
224     get_filename_component(GLIB_COMPILE_RESOURCES_SOURCE "${GLIB_COMPILE_RESOURCES_SOURCE}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
225
226     add_custom_command(
227       OUTPUT "${GLIB_COMPILE_RESOURCES_SOURCE}"
228       COMMAND glib-compile-resources
229         --sourcedir "${GLIB_COMPILE_RESOURCES_SOURCE_DIR}"
230         --generate-source
231         --target "${GLIB_COMPILE_RESOURCES_SOURCE}"
232         ${FLAGS}
233         "${SPEC_FILE}"
234       DEPENDS "${SPEC_FILE}" ${deps}
235       WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
236   endif()
237 endfunction()
238
239 find_program(GDBUS_CODEGEN gdbus-codegen)
240 if(GDBUS_CODEGEN)
241   add_executable(gdbus-codegen IMPORTED)
242   set_property(TARGET gdbus-codegen PROPERTY IMPORTED_LOCATION "${GDBUS_CODEGEN}")
243 endif()
244
245 include(FindPackageHandleStandardArgs)
246 find_package_handle_standard_args(GLib
247     REQUIRED_VARS
248       GLIB_INCLUDE_DIRS
249       GOBJECT_INCLUDE_DIRS
250       GIO_INCLUDE_DIRS
251       GLIB_MKENUMS
252       GLIB_GENMARSHAL
253       GLIB_COMPILE_SCHEMAS
254       GLIB_COMPILE_RESOURCES
255       GDBUS_CODEGEN
256     VERSION_VAR
257       GLIB_VERSION)