FindXCB.cmake 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. # cmake-format: off
  2. # Try to find XCB on a Unix system
  3. #
  4. # This will define:
  5. #
  6. # XCB_FOUND - True if xcb is available XCB_LIBRARIES - Link these to
  7. # use xcb XCB_INCLUDE_DIRS - Include directory for xcb XCB_DEFINITIONS -
  8. # Compiler flags for using xcb
  9. #
  10. # In addition the following more fine grained variables will be defined:
  11. #
  12. # XCB_XCB_FOUND XCB_XCB_INCLUDE_DIR XCB_XCB_LIBRARY XCB_UTIL_FOUND
  13. # XCB_UTIL_INCLUDE_DIR XCB_UTIL_LIBRARY XCB_COMPOSITE_FOUND
  14. # XCB_COMPOSITE_INCLUDE_DIR XCB_COMPOSITE_LIBRARY XCB_DAMAGE_FOUND
  15. # XCB_DAMAGE_INCLUDE_DIR XCB_DAMAGE_LIBRARY XCB_XFIXES_FOUND
  16. # XCB_XFIXES_INCLUDE_DIR XCB_XFIXES_LIBRARY XCB_RENDER_FOUND
  17. # XCB_RENDER_INCLUDE_DIR XCB_RENDER_LIBRARY XCB_RANDR_FOUND
  18. # XCB_RANDR_INCLUDE_DIR XCB_RANDR_LIBRARY XCB_SHAPE_FOUND
  19. # XCB_SHAPE_INCLUDE_DIR XCB_SHAPE_LIBRARY XCB_DRI2_FOUND
  20. # XCB_DRI2_INCLUDE_DIR XCB_DRI2_LIBRARY XCB_GLX_FOUND XCB_GLX_INCLUDE_DIR
  21. # XCB_GLX_LIBRARY XCB_SHM_FOUND XCB_SHM_INCLUDE_DIR XCB_SHM_LIBRARY
  22. # XCB_XV_FOUND XCB_XV_INCLUDE_DIR XCB_XV_LIBRARY XCB_XINPUT_FOUND
  23. # XCB_XINPUT_INCLUDE_DIR XCB_XINPUT_LIBRARY XCB_SYNC_FOUND
  24. # XCB_SYNC_INCLUDE_DIR XCB_SYNC_LIBRARY XCB_XTEST_FOUND
  25. # XCB_XTEST_INCLUDE_DIR XCB_XTEST_LIBRARY XCB_ICCCM_FOUND
  26. # XCB_ICCCM_INCLUDE_DIR XCB_ICCCM_LIBRARY XCB_EWMH_FOUND
  27. # XCB_EWMH_INCLUDE_DIR XCB_EWMH_LIBRARY XCB_IMAGE_FOUND
  28. # XCB_IMAGE_INCLUDE_DIR XCB_IMAGE_LIBRARY XCB_RENDERUTIL_FOUND
  29. # XCB_RENDERUTIL_INCLUDE_DIR XCB_RENDERUTIL_LIBRARY XCB_KEYSYMS_FOUND
  30. # XCB_KEYSYMS_INCLUDE_DIR XCB_KEYSYMS_LIBRARY
  31. #
  32. # Copyright (c) 2011 Fredrik Höglund <[email protected]> Copyright (c) 2013 Martin
  33. # Gräßlin <[email protected]>
  34. #
  35. # Redistribution and use is allowed according to the terms of the BSD license.
  36. # For details see the accompanying COPYING-CMAKE-SCRIPTS file.
  37. # cmake-format: on
  38. set(knownComponents
  39. XCB
  40. COMPOSITE
  41. DAMAGE
  42. DRI2
  43. EWMH
  44. GLX
  45. ICCCM
  46. IMAGE
  47. KEYSYMS
  48. RANDR
  49. RENDER
  50. RENDERUTIL
  51. SHAPE
  52. SHM
  53. SYNC
  54. UTIL
  55. XFIXES
  56. XTEST
  57. XV
  58. XINPUT
  59. XINERAMA)
  60. unset(unknownComponents)
  61. set(pkgConfigModules)
  62. set(requiredComponents)
  63. if(XCB_FIND_COMPONENTS)
  64. set(comps ${XCB_FIND_COMPONENTS})
  65. else()
  66. set(comps ${knownComponents})
  67. endif()
  68. # iterate through the list of requested components, and check that we know them all. If not, fail.
  69. foreach(comp ${comps})
  70. list(FIND knownComponents ${comp} index)
  71. if("${index}" STREQUAL "-1")
  72. list(APPEND unknownComponents "${comp}")
  73. else()
  74. if("${comp}" STREQUAL "XCB")
  75. list(APPEND pkgConfigModules "xcb")
  76. elseif("${comp}" STREQUAL "COMPOSITE")
  77. list(APPEND pkgConfigModules "xcb-composite")
  78. elseif("${comp}" STREQUAL "DAMAGE")
  79. list(APPEND pkgConfigModules "xcb-damage")
  80. elseif("${comp}" STREQUAL "DRI2")
  81. list(APPEND pkgConfigModules "xcb-dri2")
  82. elseif("${comp}" STREQUAL "EWMH")
  83. list(APPEND pkgConfigModules "xcb-ewmh")
  84. elseif("${comp}" STREQUAL "GLX")
  85. list(APPEND pkgConfigModules "xcb-glx")
  86. elseif("${comp}" STREQUAL "ICCCM")
  87. list(APPEND pkgConfigModules "xcb-icccm")
  88. elseif("${comp}" STREQUAL "IMAGE")
  89. list(APPEND pkgConfigModules "xcb-image")
  90. elseif("${comp}" STREQUAL "KEYSYMS")
  91. list(APPEND pkgConfigModules "xcb-keysyms")
  92. elseif("${comp}" STREQUAL "RANDR")
  93. list(APPEND pkgConfigModules "xcb-randr")
  94. elseif("${comp}" STREQUAL "RENDER")
  95. list(APPEND pkgConfigModules "xcb-render")
  96. elseif("${comp}" STREQUAL "RENDERUTIL")
  97. list(APPEND pkgConfigModules "xcb-renderutil")
  98. elseif("${comp}" STREQUAL "SHAPE")
  99. list(APPEND pkgConfigModules "xcb-shape")
  100. elseif("${comp}" STREQUAL "SHM")
  101. list(APPEND pkgConfigModules "xcb-shm")
  102. elseif("${comp}" STREQUAL "SYNC")
  103. list(APPEND pkgConfigModules "xcb-sync")
  104. elseif("${comp}" STREQUAL "UTIL")
  105. list(APPEND pkgConfigModules "xcb-util")
  106. elseif("${comp}" STREQUAL "XFIXES")
  107. list(APPEND pkgConfigModules "xcb-xfixes")
  108. elseif("${comp}" STREQUAL "XTEST")
  109. list(APPEND pkgConfigModules "xcb-xtest")
  110. elseif("${comp}" STREQUAL "XV")
  111. list(APPEND pkgConfigModules "xcb-xv")
  112. elseif("${comp}" STREQUAL "XINPUT")
  113. list(APPEND pkgConfigModules "xcb-xinput")
  114. elseif("${comp}" STREQUAL "XINERAMA")
  115. list(APPEND pkgConfigModules "xcb-xinerama")
  116. endif()
  117. endif()
  118. endforeach()
  119. if(DEFINED unknownComponents)
  120. set(msgType STATUS)
  121. if(XCB_FIND_REQUIRED)
  122. set(msgType FATAL_ERROR)
  123. endif()
  124. if(NOT XCB_FIND_QUIETLY)
  125. message(${msgType} "XCB: requested unknown components ${unknownComponents}")
  126. endif()
  127. return()
  128. endif()
  129. macro(_XCB_HANDLE_COMPONENT _comp)
  130. set(_header)
  131. set(_lib)
  132. if("${_comp}" STREQUAL "XCB")
  133. set(_header "xcb/xcb.h")
  134. set(_lib "xcb")
  135. elseif("${_comp}" STREQUAL "COMPOSITE")
  136. set(_header "xcb/composite.h")
  137. set(_lib "xcb-composite")
  138. elseif("${_comp}" STREQUAL "DAMAGE")
  139. set(_header "xcb/damage.h")
  140. set(_lib "xcb-damage")
  141. elseif("${_comp}" STREQUAL "DRI2")
  142. set(_header "xcb/dri2.h")
  143. set(_lib "xcb-dri2")
  144. elseif("${_comp}" STREQUAL "EWMH")
  145. set(_header "xcb/xcb_ewmh.h")
  146. set(_lib "xcb-ewmh")
  147. elseif("${_comp}" STREQUAL "GLX")
  148. set(_header "xcb/glx.h")
  149. set(_lib "xcb-glx")
  150. elseif("${_comp}" STREQUAL "ICCCM")
  151. set(_header "xcb/xcb_icccm.h")
  152. set(_lib "xcb-icccm")
  153. elseif("${_comp}" STREQUAL "IMAGE")
  154. set(_header "xcb/xcb_image.h")
  155. set(_lib "xcb-image")
  156. elseif("${_comp}" STREQUAL "KEYSYMS")
  157. set(_header "xcb/xcb_keysyms.h")
  158. set(_lib "xcb-keysyms")
  159. elseif("${_comp}" STREQUAL "RANDR")
  160. set(_header "xcb/randr.h")
  161. set(_lib "xcb-randr")
  162. elseif("${_comp}" STREQUAL "RENDER")
  163. set(_header "xcb/render.h")
  164. set(_lib "xcb-render")
  165. elseif("${_comp}" STREQUAL "RENDERUTIL")
  166. set(_header "xcb/xcb_renderutil.h")
  167. set(_lib "xcb-render-util")
  168. elseif("${_comp}" STREQUAL "SHAPE")
  169. set(_header "xcb/shape.h")
  170. set(_lib "xcb-shape")
  171. elseif("${_comp}" STREQUAL "SHM")
  172. set(_header "xcb/shm.h")
  173. set(_lib "xcb-shm")
  174. elseif("${_comp}" STREQUAL "SYNC")
  175. set(_header "xcb/sync.h")
  176. set(_lib "xcb-sync")
  177. elseif("${_comp}" STREQUAL "UTIL")
  178. set(_header "xcb/xcb_util.h")
  179. set(_lib "xcb-util")
  180. elseif("${_comp}" STREQUAL "XFIXES")
  181. set(_header "xcb/xfixes.h")
  182. set(_lib "xcb-xfixes")
  183. elseif("${_comp}" STREQUAL "XTEST")
  184. set(_header "xcb/xtest.h")
  185. set(_lib "xcb-xtest")
  186. elseif("${_comp}" STREQUAL "XV")
  187. set(_header "xcb/xv.h")
  188. set(_lib "xcb-xv")
  189. elseif("${_comp}" STREQUAL "XINPUT")
  190. set(_header "xcb/xinput.h")
  191. set(_lib "xcb-xinput")
  192. elseif("${_comp}" STREQUAL "XINERAMA")
  193. set(_header "xcb/xinerama.h")
  194. set(_lib "xcb-xinerama")
  195. endif()
  196. find_path(
  197. XCB_${_comp}_INCLUDE_DIR
  198. NAMES ${_header}
  199. HINTS ${PKG_XCB_INCLUDE_DIRS})
  200. find_library(
  201. XCB_${_comp}_LIBRARY
  202. NAMES ${_lib}
  203. HINTS ${PKG_XCB_LIBRARY_DIRS})
  204. mark_as_advanced(XCB_${_comp}_LIBRARY XCB_${_comp}_INCLUDE_DIR)
  205. if(XCB_${_comp}_INCLUDE_DIR AND XCB_${_comp}_LIBRARY)
  206. set(XCB_${_comp}_FOUND TRUE)
  207. list(APPEND XCB_INCLUDE_DIRS ${XCB_${_comp}_INCLUDE_DIR})
  208. list(APPEND XCB_LIBRARIES ${XCB_${_comp}_LIBRARY})
  209. if(NOT XCB_FIND_QUIETLY)
  210. message(STATUS "XCB[${_comp}]: Found component ${_comp}")
  211. endif()
  212. endif()
  213. endmacro()
  214. if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  215. # Use pkg-config to get the directories and then use these values in the FIND_PATH() and FIND_LIBRARY() calls
  216. find_package(PkgConfig)
  217. pkg_check_modules(PKG_XCB QUIET ${pkgConfigModules})
  218. set(XCB_DEFINITIONS ${PKG_XCB_CFLAGS})
  219. foreach(comp ${comps})
  220. _xcb_handle_component(${comp})
  221. endforeach()
  222. if(XCB_INCLUDE_DIRS)
  223. list(REMOVE_DUPLICATES XCB_INCLUDE_DIRS)
  224. endif()
  225. include(FindPackageHandleStandardArgs)
  226. find_package_handle_standard_args(
  227. XCB
  228. REQUIRED_VARS XCB_LIBRARIES XCB_INCLUDE_DIRS
  229. HANDLE_COMPONENTS)
  230. # compatibility for old variable naming
  231. set(XCB_INCLUDE_DIR ${XCB_INCLUDE_DIRS})
  232. endif()
  233. if(XCB_FOUND AND NOT TARGET XCB::XCB)
  234. foreach(component ${comps})
  235. if(NOT TARGET XCB::${component})
  236. string(TOUPPER ${component} component_u)
  237. if(XCB_${component_u}_FOUND)
  238. if(IS_ABSOLUTE "${XCB_${component_u}_LIBRARY}")
  239. add_library(XCB::${component} UNKNOWN IMPORTED)
  240. set_target_properties(XCB::${component} PROPERTIES IMPORTED_LOCATION "${XCB_${component_u}_LIBRARY}")
  241. else()
  242. add_library(XCB::${component} INTERFACE IMPORTED)
  243. set_target_properties(XCB::${component} PROPERTIES IMPORTED_LIBNAME "${XCB_${component_u}_LIBRARY}")
  244. endif()
  245. set_target_properties(XCB::${component} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
  246. "${XCB_${component_u}_INCLUDE_DIR}")
  247. endif()
  248. endif()
  249. endforeach()
  250. endif()