2 # <https://github.com/nemequ/gnome-cmake>
4 # CMake support for GLib/GObject/GIO.
8 # Copyright (c) 2016 Evan Nemerson <evan@nemerson.com>
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:
18 # The above copyright notice and this permission notice shall be
19 # included in all copies or substantial portions of the Software.
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.
30 find_package(PkgConfig)
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)
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})
43 add_library(glib-2.0 SHARED IMPORTED)
44 set_property(TARGET glib-2.0 PROPERTY IMPORTED_LOCATION "${GLIB}")
46 find_path(GLIB_INCLUDE_DIRS "glib.h"
47 HINTS ${GLIB_PKG_INCLUDE_DIRS}
48 PATH_SUFFIXES "glib-2.0")
50 get_filename_component(GLIB_LIBDIR "${GLIB}" DIRECTORY)
51 find_path(GLIB_CONFIG_INCLUDE_DIR "glibconfig.h"
54 ${GLIB_PKG_INCLUDE_DIRS}
56 "${CMAKE_LIBRARY_PATH}"
62 if(NOT GLIB_CONFIG_INCLUDE_DIR)
63 unset(GLIB_INCLUDE_DIRS)
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)
76 list(APPEND GLIB_INCLUDE_DIRS ${GLIB_CONFIG_INCLUDE_DIR})
81 add_library(gobject-2.0 SHARED IMPORTED)
82 set_property(TARGET gobject-2.0 PROPERTY IMPORTED_LOCATION "${GOBJECT}")
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)
94 add_library(gio-2.0 SHARED IMPORTED)
95 set_property(TARGET gio-2.0 PROPERTY IMPORTED_LOCATION "${GIO}")
97 find_path(GIO_INCLUDE_DIRS "gio/gio.h"
98 HINTS ${GIO_PKG_INCLUDE_DIRS}
99 PATH_SUFFIXES "glib-2.0")
101 list(APPEND GIO_INCLUDE_DIRS ${GOBJECT_INCLUDE_DIRS})
102 list(REMOVE_DUPLICATES GIO_INCLUDE_DIRS)
106 find_program(GLIB_GENMARSHAL glib-genmarshal)
108 add_executable(glib-genmarshal IMPORTED)
109 set_property(TARGET glib-genmarshal PROPERTY IMPORTED_LOCATION "${GLIB_GENMARSHAL}")
112 find_program(GLIB_MKENUMS glib-mkenums)
114 add_executable(glib-mkenums IMPORTED)
115 set_property(TARGET glib-mkenums PROPERTY IMPORTED_LOCATION "${GLIB_MKENUMS}")
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}")
124 # glib_install_schemas(
125 # [DESTINATION directory]
128 # Validate and install the listed schemas.
129 function(glib_install_schemas)
131 set (oneValueArgs DESTINATION)
133 cmake_parse_arguments(GSCHEMA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
136 unset (multiValueArgs)
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")
144 OUTPUT "${schema_output}"
145 COMMAND glib-compile-schemas
148 --schema-file="${schema}"
149 COMMAND "${CMAKE_COMMAND}" ARGS -E touch "${schema_output}"
151 WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
152 COMMENT "Validating ${schema}")
154 add_custom_target("gsettings-schema-${schema_name}" ALL
155 DEPENDS "${schema_output}")
157 if(CMAKE_INSTALL_FULL_DATADIR)
158 set(SCHEMADIR "${CMAKE_INSTALL_FULL_DATADIR}/glib-2.0/schemas")
160 set(SCHEMADIR "${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas")
162 install(FILES "${schema}"
163 DESTINATION "${SCHEMADIR}")
164 install(CODE "execute_process(COMMAND \"${GLIB_COMPILE_SCHEMAS}\" \"${SCHEMADIR}\")")
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}")
174 function(glib_compile_resources SPEC_FILE)
175 set (options INTERNAL)
176 set (oneValueArgs TARGET SOURCE_DIR HEADER SOURCE C_NAME)
178 cmake_parse_arguments(GLIB_COMPILE_RESOURCES "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
181 unset (multiValueArgs)
183 if(NOT GLIB_COMPILE_RESOURCES_SOURCE_DIR)
184 set(GLIB_COMPILE_RESOURCES_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
189 if(GLIB_COMPILE_RESOURCES_INTERNAL)
190 list(APPEND FLAGS "--internal")
193 if(GLIB_COMPILE_RESOURCES_C_NAME)
194 list(APPEND FLAGS "--c-name" "${GLIB_COMPILE_RESOURCES_C_NAME}")
197 get_filename_component(SPEC_FILE "${SPEC_FILE}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
200 COMMAND glib-compile-resources
201 --generate-dependencies
202 --sourcedir "${GLIB_COMPILE_RESOURCES_SOURCE_DIR}"
205 WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
206 OUTPUT_STRIP_TRAILING_WHITESPACE)
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}")
212 OUTPUT "${GLIB_COMPILE_RESOURCES_HEADER}"
213 COMMAND glib-compile-resources
214 --sourcedir "${GLIB_COMPILE_RESOURCES_SOURCE_DIR}"
216 --target "${GLIB_COMPILE_RESOURCES_HEADER}"
219 DEPENDS "${SPEC_FILE}" ${deps}
220 WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
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}")
227 OUTPUT "${GLIB_COMPILE_RESOURCES_SOURCE}"
228 COMMAND glib-compile-resources
229 --sourcedir "${GLIB_COMPILE_RESOURCES_SOURCE_DIR}"
231 --target "${GLIB_COMPILE_RESOURCES_SOURCE}"
234 DEPENDS "${SPEC_FILE}" ${deps}
235 WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
239 find_program(GDBUS_CODEGEN gdbus-codegen)
241 add_executable(gdbus-codegen IMPORTED)
242 set_property(TARGET gdbus-codegen PROPERTY IMPORTED_LOCATION "${GDBUS_CODEGEN}")
245 include(FindPackageHandleStandardArgs)
246 find_package_handle_standard_args(GLib
254 GLIB_COMPILE_RESOURCES