CMakeLists.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. set(the_description "High-level GUI")
  2. if(ANDROID)
  3. ocv_add_module(highgui opencv_imgproc OPTIONAL opencv_imgcodecs opencv_videoio WRAP python)
  4. else()
  5. ocv_add_module(highgui opencv_imgproc OPTIONAL opencv_imgcodecs opencv_videoio WRAP python java)
  6. endif()
  7. include(${CMAKE_CURRENT_LIST_DIR}/cmake/plugin.cmake)
  8. set(tgts "PRIVATE")
  9. set(highgui_hdrs
  10. ${CMAKE_CURRENT_LIST_DIR}/src/precomp.hpp
  11. )
  12. set(highgui_srcs
  13. ${CMAKE_CURRENT_LIST_DIR}/src/backend.cpp
  14. ${CMAKE_CURRENT_LIST_DIR}/src/window.cpp
  15. ${CMAKE_CURRENT_LIST_DIR}/src/roiSelector.cpp
  16. )
  17. # ----------------------------------------------------------------------------
  18. # CMake file for highgui. See root CMakeLists.txt
  19. # Some parts taken from version of Hartmut Seichter, HIT Lab NZ.
  20. # Jose Luis Blanco, 2008
  21. # ----------------------------------------------------------------------------
  22. if(DEFINED WINRT AND NOT DEFINED ENABLE_WINRT_MODE_NATIVE)
  23. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /ZW")
  24. endif()
  25. if(APPLE)
  26. ocv_include_directories(${ZLIB_INCLUDE_DIRS})
  27. list(APPEND HIGHGUI_LIBRARIES ${ZLIB_LIBRARIES})
  28. endif()
  29. if(HAVE_WEBP)
  30. add_definitions(-DHAVE_WEBP)
  31. endif()
  32. file(GLOB highgui_ext_hdrs
  33. "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/*.hpp"
  34. "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/*.hpp"
  35. "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/*.h")
  36. # Removing WinRT API headers by default
  37. list(REMOVE_ITEM highgui_ext_hdrs "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/highgui_winrt.hpp")
  38. set(OPENCV_HIGHGUI_BUILTIN_BACKEND "")
  39. if(WITH_FRAMEBUFFER AND HAVE_FRAMEBUFFER)
  40. set(OPENCV_HIGHGUI_BUILTIN_BACKEND "FB")
  41. add_definitions(-DHAVE_FRAMEBUFFER)
  42. list(APPEND highgui_srcs ${CMAKE_CURRENT_LIST_DIR}/src/window_framebuffer.cpp)
  43. list(APPEND highgui_hdrs ${CMAKE_CURRENT_LIST_DIR}/src/window_framebuffer.hpp)
  44. if(HAVE_FRAMEBUFFER_XVFB)
  45. add_definitions(-DHAVE_FRAMEBUFFER_XVFB)
  46. endif()
  47. endif()
  48. if(WITH_WAYLAND AND HAVE_WAYLAND)
  49. set(OPENCV_HIGHGUI_BUILTIN_BACKEND "Wayland")
  50. add_definitions(-DHAVE_WAYLAND)
  51. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  52. if (HAVE_WAYLAND_PROTOCOLS)
  53. ocv_wayland_generate(
  54. ${WAYLAND_PROTOCOLS_BASE}/stable/xdg-shell/xdg-shell.xml
  55. xdg-shell-client-protocol)
  56. endif()
  57. list(APPEND highgui_srcs
  58. ${CMAKE_CURRENT_LIST_DIR}/src/window_wayland.cpp
  59. ${WAYLAND_PROTOCOL_SOURCES}
  60. )
  61. list(APPEND HIGHGUI_LIBRARIES "${WAYLAND_CLIENT_LINK_LIBRARIES};${WAYLAND_CURSOR_LINK_LIBRARIES};${XKBCOMMON_LINK_LIBRARIES}")
  62. if(HAVE_WAYLAND_EGL)
  63. if(WAYLAND_EGL_LIBRARIES)
  64. list(APPEND HIGHGUI_LIBRARIES "${WAYLAND_EGL_LIBRARIES}")
  65. endif()
  66. endif()
  67. ocv_module_include_directories(${WAYLAND_CLIENT_INCLUDE_DIRS} ${XKBCOMMON_INCLUDE_DIRS})
  68. elseif(HAVE_QT)
  69. set(OPENCV_HIGHGUI_BUILTIN_BACKEND "QT${QT_VERSION_MAJOR}")
  70. add_definitions(-DHAVE_QT)
  71. if(QT_VERSION_MAJOR GREATER 4)
  72. # "Automoc" doesn't work properly with opencv_world build, use QT<ver>_WRAP_CPP() directly
  73. #set(CMAKE_AUTOMOC ON)
  74. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  75. if(QT_VERSION_MAJOR EQUAL 6)
  76. add_definitions(-DHAVE_QT6) # QGLWidget deprecated for QT6, use this preprocessor to adjust window_QT.[h,cpp]
  77. QT6_ADD_RESOURCES(_RCC_OUTFILES ${CMAKE_CURRENT_LIST_DIR}/src/window_QT.qrc)
  78. QT6_WRAP_CPP(_MOC_OUTFILES ${CMAKE_CURRENT_LIST_DIR}/src/window_QT.h)
  79. elseif(QT_VERSION_MAJOR EQUAL 5)
  80. QT5_ADD_RESOURCES(_RCC_OUTFILES ${CMAKE_CURRENT_LIST_DIR}/src/window_QT.qrc)
  81. QT5_WRAP_CPP(_MOC_OUTFILES ${CMAKE_CURRENT_LIST_DIR}/src/window_QT.h)
  82. else()
  83. message(FATAL_ERROR "Unsupported QT version: ${QT_VERSION_MAJOR}")
  84. endif()
  85. list(APPEND highgui_srcs
  86. ${CMAKE_CURRENT_LIST_DIR}/src/window_QT.cpp
  87. ${CMAKE_CURRENT_LIST_DIR}/src/window_QT.h
  88. ${_MOC_OUTFILES}
  89. ${_RCC_OUTFILES})
  90. set(qt_deps Core Gui Widgets Test Concurrent)
  91. if(HAVE_QT_OPENGL)
  92. add_definitions(-DHAVE_QT_OPENGL)
  93. # QOpenGLWidget requires Qt6 package component OpenGLWidgets
  94. if(QT_VERSION_MAJOR GREATER 5)
  95. list(APPEND qt_deps OpenGLWidgets)
  96. endif()
  97. list(APPEND qt_deps OpenGL)
  98. if(OPENGL_LIBRARIES)
  99. list(APPEND HIGHGUI_LIBRARIES "${OPENGL_LIBRARIES}")
  100. endif()
  101. endif()
  102. foreach(dt_dep ${qt_deps})
  103. link_libraries(${Qt${QT_VERSION_MAJOR}${dt_dep}})
  104. include_directories(${Qt${QT_VERSION_MAJOR}${dt_dep}_INCLUDE_DIRS})
  105. list(APPEND HIGHGUI_LIBRARIES ${Qt${QT_VERSION_MAJOR}${dt_dep}_LIBRARIES})
  106. endforeach()
  107. else()
  108. ocv_assert(QT_VERSION_MAJOR EQUAL 4)
  109. if(HAVE_QT_OPENGL)
  110. set(QT_USE_QTOPENGL TRUE)
  111. if(OPENGL_LIBRARIES)
  112. list(APPEND HIGHGUI_LIBRARIES "${OPENGL_LIBRARIES}")
  113. endif()
  114. endif()
  115. include(${QT_USE_FILE})
  116. QT4_ADD_RESOURCES(_RCC_OUTFILES ${CMAKE_CURRENT_LIST_DIR}/src/window_QT.qrc)
  117. QT4_WRAP_CPP(_MOC_OUTFILES ${CMAKE_CURRENT_LIST_DIR}/src/window_QT.h)
  118. list(APPEND HIGHGUI_LIBRARIES ${QT_LIBRARIES})
  119. list(APPEND highgui_srcs ${CMAKE_CURRENT_LIST_DIR}/src/window_QT.cpp ${_MOC_OUTFILES} ${_RCC_OUTFILES})
  120. ocv_check_flag_support(CXX -Wno-missing-declarations _have_flag "")
  121. if(${_have_flag})
  122. set_source_files_properties(${_RCC_OUTFILES} PROPERTIES COMPILE_FLAGS -Wno-missing-declarations)
  123. endif()
  124. endif()
  125. elseif(WINRT)
  126. set(OPENCV_HIGHGUI_BUILTIN_BACKEND "WINRT")
  127. if(NOT WINRT_8_0)
  128. # Dependencies used by the implementation referenced
  129. # below are not available on WinRT 8.0.
  130. # Enabling it for WiRT 8.1+ only.
  131. # WinRT 8.1+ detected. Adding WinRT API header.
  132. message(STATUS " ${name}: WinRT detected. Adding WinRT API header")
  133. list(APPEND highgui_ext_hdrs "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/highgui_winrt.hpp")
  134. list(APPEND highgui_srcs
  135. ${CMAKE_CURRENT_LIST_DIR}/src/window_winrt.cpp
  136. ${CMAKE_CURRENT_LIST_DIR}/src/window_winrt_bridge.cpp)
  137. list(APPEND highgui_hdrs
  138. ${CMAKE_CURRENT_LIST_DIR}/src/window_winrt_bridge.hpp)
  139. endif()
  140. # libraries below are neither available nor required
  141. # on ARM devices and/or Windows Phone
  142. if(WINRT_PHONE OR (OpenCV_ARCH STREQUAL "ARM"))
  143. list(REMOVE_ITEM HIGHGUI_LIBRARIES "comctl32" "gdi32" "ole32" "setupapi")
  144. if(WINRT_PHONE)
  145. message(STATUS " ${name}: Windows Phone detected")
  146. elseif(OpenCV_ARCH STREQUAL "ARM")
  147. message(STATUS " ${name}: ARM detected")
  148. if(WINRT_STORE)
  149. list(REMOVE_ITEM HIGHGUI_LIBRARIES "ws2_32")
  150. message(STATUS " ${name}: Removing 'ws2_32.lib'")
  151. endif()
  152. endif()
  153. message(STATUS " ${name}: Removing 'comctl32.lib, gdi32.lib, ole32.lib, setupapi.lib'")
  154. message(STATUS " ${name}: Leaving '${HIGHGUI_LIBRARIES}'")
  155. endif()
  156. elseif(HAVE_COCOA)
  157. set(OPENCV_HIGHGUI_BUILTIN_BACKEND "COCOA")
  158. add_definitions(-DHAVE_COCOA)
  159. list(APPEND highgui_srcs ${CMAKE_CURRENT_LIST_DIR}/src/window_cocoa.mm)
  160. list(APPEND HIGHGUI_LIBRARIES "-framework Cocoa")
  161. endif()
  162. if(TARGET ocv.3rdparty.win32ui)
  163. if("win32ui" IN_LIST HIGHGUI_PLUGIN_LIST OR HIGHGUI_PLUGIN_LIST STREQUAL "all")
  164. ocv_create_builtin_highgui_plugin(opencv_highgui_win32 ocv.3rdparty.win32ui "window_w32.cpp")
  165. elseif(NOT OPENCV_HIGHGUI_BUILTIN_BACKEND)
  166. set(OPENCV_HIGHGUI_BUILTIN_BACKEND "WIN32UI")
  167. list(APPEND highgui_srcs ${CMAKE_CURRENT_LIST_DIR}/src/window_w32.cpp)
  168. list(APPEND tgts ocv.3rdparty.win32ui)
  169. if(HAVE_OPENGL AND OPENGL_LIBRARIES)
  170. list(APPEND tgts "${OPENGL_LIBRARIES}")
  171. endif()
  172. endif()
  173. endif()
  174. if(TARGET ocv.3rdparty.gtk3 OR TARGET ocv.3rdparty.gtk2)
  175. if(TARGET ocv.3rdparty.gtk3 AND NOT WITH_GTK_2_X)
  176. set(__gtk_dependency "ocv.3rdparty.gtk3")
  177. else()
  178. set(__gtk_dependency "ocv.3rdparty.gtk2")
  179. endif()
  180. if(
  181. NOT HIGHGUI_PLUGIN_LIST STREQUAL "all"
  182. AND NOT "gtk" IN_LIST HIGHGUI_PLUGIN_LIST
  183. AND NOT "gtk2" IN_LIST HIGHGUI_PLUGIN_LIST
  184. AND NOT "gtk3" IN_LIST HIGHGUI_PLUGIN_LIST
  185. AND NOT OPENCV_HIGHGUI_BUILTIN_BACKEND
  186. )
  187. if(__gtk_dependency STREQUAL "ocv.3rdparty.gtk3")
  188. set(OPENCV_HIGHGUI_BUILTIN_BACKEND "GTK3")
  189. if(OPENGL_LIBRARIES)
  190. list(APPEND HIGHGUI_LIBRARIES "${OPENGL_LIBRARIES}")
  191. endif()
  192. elseif(__gtk_dependency STREQUAL "ocv.3rdparty.gtk2")
  193. set(OPENCV_HIGHGUI_BUILTIN_BACKEND "GTK2")
  194. else()
  195. set(OPENCV_HIGHGUI_BUILTIN_BACKEND "GTK")
  196. endif()
  197. list(APPEND highgui_srcs ${CMAKE_CURRENT_LIST_DIR}/src/window_gtk.cpp)
  198. list(APPEND tgts ${__gtk_dependency})
  199. if(TARGET ocv.3rdparty.gtkglext
  200. AND __gtk_dependency STREQUAL "ocv.3rdparty.gtk2"
  201. AND NOT OPENCV_GTK_DISABLE_GTKGLEXT
  202. )
  203. list(APPEND tgts ocv.3rdparty.gtkglext)
  204. if(TARGET ocv.3rdparty.gtk_opengl
  205. AND __gtk_dependency STREQUAL "ocv.3rdparty.gtk2"
  206. AND NOT OPENCV_GTK_DISABLE_OPENGL
  207. )
  208. list(APPEND tgts ocv.3rdparty.gtk_opengl)
  209. endif()
  210. endif()
  211. elseif("gtk" IN_LIST HIGHGUI_PLUGIN_LIST)
  212. ocv_create_builtin_highgui_plugin(opencv_highgui_gtk ${__gtk_dependency} "window_gtk.cpp")
  213. if(TARGET ocv.3rdparty.gtkglext)
  214. ocv_target_link_libraries(opencv_highgui_gtk ocv.3rdparty.gtkglext)
  215. endif()
  216. else()
  217. if(TARGET ocv.3rdparty.gtk3 AND ("gtk3" IN_LIST HIGHGUI_PLUGIN_LIST OR HIGHGUI_PLUGIN_LIST STREQUAL "all"))
  218. ocv_create_builtin_highgui_plugin(opencv_highgui_gtk3 ocv.3rdparty.gtk3 "window_gtk.cpp")
  219. if(TARGET ocv.3rdparty.gtkglext)
  220. ocv_target_link_libraries(opencv_highgui_gtk3 ocv.3rdparty.gtkglext)
  221. endif()
  222. endif()
  223. if(TARGET ocv.3rdparty.gtk2 AND ("gtk2" IN_LIST HIGHGUI_PLUGIN_LIST OR HIGHGUI_PLUGIN_LIST STREQUAL "all"))
  224. ocv_create_builtin_highgui_plugin(opencv_highgui_gtk2 ocv.3rdparty.gtk2 "window_gtk.cpp")
  225. if(TARGET ocv.3rdparty.gtkglext)
  226. ocv_target_link_libraries(opencv_highgui_gtk2 ocv.3rdparty.gtkglext)
  227. endif()
  228. endif()
  229. endif()
  230. endif()
  231. if(NOT OPENCV_HIGHGUI_BUILTIN_BACKEND)
  232. set(OPENCV_HIGHGUI_BUILTIN_BACKEND "NONE")
  233. endif()
  234. message(STATUS "highgui: using builtin backend: ${OPENCV_HIGHGUI_BUILTIN_BACKEND}")
  235. set(OPENCV_HIGHGUI_BUILTIN_BACKEND "${OPENCV_HIGHGUI_BUILTIN_BACKEND}" PARENT_SCOPE) # informational
  236. if(TRUE)
  237. # these variables are set by 'ocv_append_build_options(HIGHGUI ...)'
  238. foreach(P ${HIGHGUI_INCLUDE_DIRS})
  239. ocv_include_directories(${P})
  240. endforeach()
  241. foreach(P ${HIGHGUI_LIBRARY_DIRS})
  242. link_directories(${P})
  243. endforeach()
  244. endif()
  245. if(tgts STREQUAL "PRIVATE")
  246. set(tgts "")
  247. endif()
  248. ocv_install_used_external_targets(${tgts})
  249. source_group("Src" FILES ${highgui_srcs} ${highgui_hdrs})
  250. source_group("Include" FILES ${highgui_ext_hdrs})
  251. ocv_set_module_sources(HEADERS ${highgui_ext_hdrs} SOURCES ${highgui_srcs} ${highgui_hdrs})
  252. ocv_module_include_directories()
  253. ocv_create_module(${HIGHGUI_LIBRARIES})
  254. macro(ocv_highgui_configure_target)
  255. if(APPLE)
  256. add_apple_compiler_options(${the_module})
  257. endif()
  258. if(MSVC AND NOT BUILD_SHARED_LIBS AND BUILD_WITH_STATIC_CRT)
  259. set_target_properties(${the_module} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:atlthunk.lib /NODEFAULTLIB:atlsd.lib /NODEFAULTLIB:libcmt.lib /DEBUG")
  260. endif()
  261. ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-deprecated-declarations)
  262. endmacro()
  263. if(NOT BUILD_opencv_world)
  264. ocv_highgui_configure_target()
  265. endif()
  266. ocv_add_accuracy_tests(${tgts})
  267. #ocv_add_perf_tests(${tgts})
  268. if(HIGHGUI_ENABLE_PLUGINS)
  269. ocv_target_compile_definitions(${the_module} PRIVATE ENABLE_PLUGINS)
  270. if(TARGET opencv_test_highgui)
  271. ocv_target_compile_definitions(opencv_test_highgui PRIVATE ENABLE_PLUGINS)
  272. endif()
  273. endif()
  274. ocv_target_link_libraries(${the_module} LINK_PRIVATE ${tgts})
  275. # generate module configuration
  276. set(CONFIG_STR "// Auto-generated file
  277. #define OPENCV_HIGHGUI_BUILTIN_BACKEND_STR \"${OPENCV_HIGHGUI_BUILTIN_BACKEND}\"
  278. ")
  279. if(OPENCV_HIGHGUI_BUILTIN_BACKEND STREQUAL "NONE")
  280. set(CONFIG_STR "${CONFIG_STR}
  281. #define OPENCV_HIGHGUI_WITHOUT_BUILTIN_BACKEND 1
  282. ")
  283. endif()
  284. ocv_update_file("${CMAKE_CURRENT_BINARY_DIR}/opencv_highgui_config.hpp" "${CONFIG_STR}")