aboutsummaryrefslogtreecommitdiff
path: root/find-modules/FindXCB.cmake
blob: eb3075885bc408fc4c213516a387dfcd0e75cb8b (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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
# Try to find XCB on a Unix system
#
# This will define:
#
#   XCB_FOUND        - True if xcb is available
#   XCB_LIBRARIES    - Link these to use xcb
#   XCB_INCLUDE_DIRS - Include directory for xcb
#   XCB_DEFINITIONS  - Compiler flags for using xcb
#
# In addition the following more fine grained variables will be defined:
#
#   XCB_XCB_FOUND        XCB_XCB_INCLUDE_DIR        XCB_XCB_LIBRARY
#   XCB_UTIL_FOUND       XCB_UTIL_INCLUDE_DIR       XCB_UTIL_LIBRARY
#   XCB_COMPOSITE_FOUND  XCB_COMPOSITE_INCLUDE_DIR  XCB_COMPOSITE_LIBRARY
#   XCB_DAMAGE_FOUND     XCB_DAMAGE_INCLUDE_DIR     XCB_DAMAGE_LIBRARY
#   XCB_XFIXES_FOUND     XCB_XFIXES_INCLUDE_DIR     XCB_XFIXES_LIBRARY
#   XCB_RENDER_FOUND     XCB_RENDER_INCLUDE_DIR     XCB_RENDER_LIBRARY
#   XCB_RANDR_FOUND      XCB_RANDR_INCLUDE_DIR      XCB_RANDR_LIBRARY
#   XCB_SHAPE_FOUND      XCB_SHAPE_INCLUDE_DIR      XCB_SHAPE_LIBRARY
#   XCB_DRI2_FOUND       XCB_DRI2_INCLUDE_DIR       XCB_DRI2_LIBRARY
#   XCB_GLX_FOUND        XCB_GLX_INCLUDE_DIR        XCB_GLX_LIBRARY
#   XCB_SHM_FOUND        XCB_SHM_INCLUDE_DIR        XCB_SHM_LIBRARY
#   XCB_XV_FOUND         XCB_XV_INCLUDE_DIR         XCB_XV_LIBRARY
#   XCB_SYNC_FOUND       XCB_SYNC_INCLUDE_DIR       XCB_SYNC_LIBRARY
#   XCB_XTEST_FOUND      XCB_XTEST_INCLUDE_DIR      XCB_XTEST_LIBRARY
#   XCB_ICCCM_FOUND      XCB_ICCCM_INCLUDE_DIR      XCB_ICCCM_LIBRARY
#   XCB_EWMH_FOUND       XCB_EWMH_INCLUDE_DIR       XCB_EWMH_LIBRARY
#   XCB_IMAGE_FOUND      XCB_IMAGE_INCLUDE_DIR      XCB_IMAGE_LIBRARY
#   XCB_RENDERUTIL_FOUND XCB_RENDERUTIL_INCLUDE_DIR XCB_RENDERUTIL_LIBRARY
#   XCB_KEYSYMS_FOUND    XCB_KEYSYMS_INCLUDE_DIR    XCB_KEYSYMS_LIBRARY
#
# Additionally, the following imported targets will be defined:
#
#   XCB::XCB
#   XCB::COMPOSITE
#   XCB::DAMAGE
#   XCB::DRI2
#   XCB::EWMH
#   XCB::GLX
#   XCB::ICCCM
#   XCB::IMAGE
#   XCB::KEYSYMS
#   XCB::RANDR
#   XCB::RENDER
#   XCB::RENDERUTIL
#   XCB::SHAPE
#   XCB::SHM
#   XCB::SYNC
#   XCB::UTIL
#   XCB::XFIXES
#   XCB::XTEST
#   XCB::XV
#
# Copyright (c) 2011 Fredrik Höglund <fredrik@kde.org>
# Copyright (c) 2013 Martin Gräßlin <mgraesslin@kde.org>
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.

if(CMAKE_VERSION VERSION_LESS 2.8.12)
    message(FATAL_ERROR "CMake 2.8.12 is required by FindXCB.cmake")
endif()
if(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.12)
    message(AUTHOR_WARNING "Your project should require at least CMake 2.8.12 to use FindXCB.cmake")
endif()

set(knownComponents XCB
                    COMPOSITE
                    DAMAGE
                    DRI2
                    EWMH
                    GLX
                    ICCCM
                    IMAGE
                    KEYSYMS
                    RANDR
                    RENDER
                    RENDERUTIL
                    SHAPE
                    SHM
                    SYNC
                    UTIL
                    XFIXES
                    XTEST
                    XV)

unset(unknownComponents)

set(pkgConfigModules)

if (XCB_FIND_COMPONENTS)
  set(comps ${XCB_FIND_COMPONENTS})
else()
  set(comps ${knownComponents})
endif()

# iterate through the list of requested components, and check that we know them all.
# If not, fail.
foreach(comp ${comps})
    list(FIND knownComponents ${comp} index )
    if("${index}" STREQUAL "-1")
        list(APPEND unknownComponents "${comp}")
    else()
        if("${comp}" STREQUAL "XCB")
            list(APPEND pkgConfigModules "xcb")
        elseif("${comp}" STREQUAL "COMPOSITE")
            list(APPEND pkgConfigModules "xcb-composite")
        elseif("${comp}" STREQUAL "DAMAGE")
            list(APPEND pkgConfigModules "xcb-damage")
        elseif("${comp}" STREQUAL "DRI2")
            list(APPEND pkgConfigModules "xcb-dri2")
        elseif("${comp}" STREQUAL "EWMH")
            list(APPEND pkgConfigModules "xcb-ewmh")
        elseif("${comp}" STREQUAL "GLX")
            list(APPEND pkgConfigModules "xcb-glx")
        elseif("${comp}" STREQUAL "ICCCM")
            list(APPEND pkgConfigModules "xcb-icccm")
        elseif("${comp}" STREQUAL "IMAGE")
            list(APPEND pkgConfigModules "xcb-image")
        elseif("${comp}" STREQUAL "KEYSYMS")
            list(APPEND pkgConfigModules "xcb-keysyms")
        elseif("${comp}" STREQUAL "RANDR")
            list(APPEND pkgConfigModules "xcb-randr")
        elseif("${comp}" STREQUAL "RENDER")
            list(APPEND pkgConfigModules "xcb-render")
        elseif("${comp}" STREQUAL "RENDERUTIL")
            list(APPEND pkgConfigModules "xcb-renderutil")
        elseif("${comp}" STREQUAL "SHAPE")
            list(APPEND pkgConfigModules "xcb-shape")
        elseif("${comp}" STREQUAL "SHM")
            list(APPEND pkgConfigModules "xcb-shm")
        elseif("${comp}" STREQUAL "SYNC")
            list(APPEND pkgConfigModules "xcb-sync")
        elseif("${comp}" STREQUAL "UTIL")
            list(APPEND pkgConfigModules "xcb-util")
        elseif("${comp}" STREQUAL "XFIXES")
            list(APPEND pkgConfigModules "xcb-xfixes")
        elseif("${comp}" STREQUAL "XTEST")
            list(APPEND pkgConfigModules "xcb-xtest")
        elseif("${comp}" STREQUAL "XV")
            list(APPEND pkgConfigModules "xcb-xv")
        endif()
    endif()
endforeach()


if(DEFINED unknownComponents)
   set(msgType STATUS)
   if(XCB_FIND_REQUIRED)
      set(msgType FATAL_ERROR)
   endif()
   if(NOT XCB_FIND_QUIETLY)
      message(${msgType} "XCB: requested unknown components ${unknownComponents}")
   endif()
   return()
endif()

macro(_XCB_HANDLE_COMPONENT _comp)
    set(_header )
    set(_lib )
    set(_pkgconfig_module_var)
    if("${_comp}" STREQUAL "XCB")
        set(_header "xcb/xcb.h")
        set(_lib "xcb")
        set(_pkgconfig_module_var "xcb")
    elseif("${_comp}" STREQUAL "COMPOSITE")
        set(_header "xcb/composite.h")
        set(_lib "xcb-composite")
        set(_pkgconfig_module_var "xcb-composite")
    elseif("${_comp}" STREQUAL "DAMAGE")
        set(_header "xcb/damage.h")
        set(_lib "xcb-damage")
        set(_pkgconfig_module_var "xcb-damage")
    elseif("${_comp}" STREQUAL "DRI2")
        set(_header "xcb/dri2.h")
        set(_lib "xcb-dri2")
        set(_pkgconfig_module_var "xcb-dri2")
    elseif("${_comp}" STREQUAL "EWMH")
        set(_header "xcb/xcb_ewmh.h")
        set(_lib "xcb-ewmh")
        set(_pkgconfig_module_var "xcb-ewmh")
    elseif("${_comp}" STREQUAL "GLX")
        set(_header "xcb/glx.h")
        set(_lib "xcb-glx")
        set(_pkgconfig_module_var "xcb-glx")
    elseif("${_comp}" STREQUAL "ICCCM")
        set(_header "xcb/xcb_icccm.h")
        set(_lib "xcb-icccm")
        set(_pkgconfig_module_var "xcb-icccm")
    elseif("${_comp}" STREQUAL "IMAGE")
        set(_header "xcb/xcb_image.h")
        set(_lib "xcb-image")
        set(_pkgconfig_module_var "xcb-image")
    elseif("${_comp}" STREQUAL "KEYSYMS")
        set(_header "xcb/xcb_keysyms.h")
        set(_lib "xcb-keysyms")
        set(_pkgconfig_module_var "xcb-keysyms")
    elseif("${_comp}" STREQUAL "RANDR")
        set(_header "xcb/randr.h")
        set(_lib "xcb-randr")
        set(_pkgconfig_module_var "xcb-randr")
    elseif("${_comp}" STREQUAL "RENDER")
        set(_header "xcb/render.h")
        set(_lib "xcb-render")
        set(_pkgconfig_module_var "xcb-render")
    elseif("${_comp}" STREQUAL "RENDERUTIL")
        set(_header "xcb/xcb_renderutil.h")
        set(_lib "xcb-render-util")
        set(_pkgconfig_module_var "xcb-renderutil")
    elseif("${_comp}" STREQUAL "SHAPE")
        set(_header "xcb/shape.h")
        set(_lib "xcb-shape")
        set(_pkgconfig_module_var "xcb-shape")
    elseif("${_comp}" STREQUAL "SHM")
        set(_header "xcb/shm.h")
        set(_lib "xcb-shm")
        set(_pkgconfig_module_var "xcb-shm")
    elseif("${_comp}" STREQUAL "SYNC")
        set(_header "xcb/sync.h")
        set(_lib "xcb-sync")
        set(_pkgconfig_module_var "xcb-sync")
    elseif("${_comp}" STREQUAL "UTIL")
        set(_header "xcb/xcb_util.h")
        set(_lib "xcb-util")
        set(_pkgconfig_module_var "xcb-util")
    elseif("${_comp}" STREQUAL "XFIXES")
        set(_header "xcb/xfixes.h")
        set(_lib "xcb-xfixes")
        set(_pkgconfig_module_var "xcb-xfixes")
    elseif("${_comp}" STREQUAL "XTEST")
        set(_header "xcb/xtest.h")
        set(_lib "xcb-xtest")
        set(_pkgconfig_module_var "xcb-xtest")
    elseif("${_comp}" STREQUAL "XV")
        set(_header "xcb/xv.h")
        set(_lib "xcb-xv")
        set(_pkgconfig_module_var "xcb-xv")
    endif()

    find_path(XCB_${_comp}_INCLUDE_DIR
        NAMES ${_header}
        HINTS ${PKG_XCB_INCLUDE_DIRS}
    )
    find_library(XCB_${_comp}_LIBRARY
        NAMES ${_lib}
        HINTS ${PKG_XCB_LIBRARY_DIRS}
    )

    if(XCB_${_comp}_INCLUDE_DIR AND XCB_${_comp}_LIBRARY)
        list(APPEND XCB_INCLUDE_DIRS ${XCB_${_comp}_INCLUDE_DIR})
        list(APPEND XCB_LIBRARIES ${XCB_${_comp}_LIBRARY})
    endif()

    if(PKG_XCB_VERSION AND NOT PKG_XCB_${_pkgconfig_module_var}_VERSION)
        # this is what gets set if we only search for one module
        set(XCB_${_comp}_VERSION_STRING "${PKG_XCB_VERSION}")
    else()
        set(XCB_${_comp}_VERSION_STRING "${PKG_XCB_${_pkgconfig_module_var}_VERSION}")
    endif()

    if(NOT XCB_VERSION_STRING)
        set(XCB_VERSION_STRING ${XCB_${_comp}_VERSION_STRING})
    endif()

    find_package_handle_standard_args(XCB_${_comp}
        FOUND_VAR
            XCB_${_comp}_FOUND
        REQUIRED_VARS
            XCB_${_comp}_LIBRARY
            XCB_${_comp}_INCLUDE_DIR
        VERSION_VAR
            XCB_${_comp}_VERSION_STRING
        )

    mark_as_advanced(XCB_${_comp}_LIBRARY XCB_${_comp}_INCLUDE_DIR)

    if(XCB_${_comp}_FOUND AND NOT TARGET XCB::${_comp})
        add_library(XCB::${_comp} UNKNOWN IMPORTED)
        set_target_properties(XCB::${_comp} PROPERTIES
            IMPORTED_LOCATION "${XCB_${_comp}_LIBRARY}"
            INTERFACE_COMPILE_OPTIONS "${XCB_DEFINITIONS}"
            INTERFACE_INCLUDE_DIRECTORIES "${XCB_${_comp}_INCLUDE_DIR}"
        )
    endif()

    # compatibility for old variable naming
    set(XCB_${_comp}_INCLUDE_DIRS ${XCB_${_comp}_INCLUDE_DIR})
    set(XCB_${_comp}_LIBRARIES ${XCB_${_comp}_LIBRARY})
endmacro()

IF (NOT WIN32)
    include(FindPackageHandleStandardArgs)
    # Use pkg-config to get the directories and then use these values
    # in the FIND_PATH() and FIND_LIBRARY() calls
    find_package(PkgConfig)
    pkg_check_modules(PKG_XCB QUIET ${pkgConfigModules})

    set(XCB_DEFINITIONS ${PKG_XCB_CFLAGS})

    foreach(comp ${comps})
        _xcb_handle_component(${comp})
    endforeach()

    if(XCB_INCLUDE_DIRS)
        list(REMOVE_DUPLICATES XCB_INCLUDE_DIRS)
    endif()


    find_package_handle_standard_args(XCB
        FOUND_VAR
            XCB_FOUND
        REQUIRED_VARS
            XCB_LIBRARIES
            XCB_INCLUDE_DIRS
        VERSION_VAR
            XCB_VERSION_STRING
        HANDLE_COMPONENTS
    )

    # compatibility for old variable naming
    set(XCB_INCLUDE_DIR ${XCB_INCLUDE_DIRS})

else()
    message(STATUS "XCB is not available on Windows.")
    set(XCB_FOUND FALSE)
endif()

include(FeatureSummary)
set_package_properties(XCB PROPERTIES
    URL "http://xcb.freedesktop.org"
    DESCRIPTION "X protocol C-language Binding"
)