ObsHelpers.cmake 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. # Set OS-specific constants in non-deprecated way
  2. include(GNUInstallDirs)
  3. if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
  4. include(ObsDefaults_macOS)
  5. set(OS_MACOS ON)
  6. set(OS_POSIX ON)
  7. elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|FreeBSD|OpenBSD")
  8. include(ObsDefaults_Linux)
  9. set(OS_POSIX ON)
  10. string(TOUPPER "${CMAKE_SYSTEM_NAME}" _SYSTEM_NAME_U)
  11. set(OS_${_SYSTEM_NAME_U} ON)
  12. elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
  13. include(ObsDefaults_Windows)
  14. set(OS_WINDOWS ON)
  15. set(OS_POSIX OFF)
  16. endif()
  17. # Create global property to hold list of activated modules
  18. set_property(GLOBAL PROPERTY OBS_MODULE_LIST "")
  19. # ##############################################################################
  20. # GLOBAL HELPER FUNCTIONS #
  21. # ##############################################################################
  22. # Helper function to set up runtime or library targets
  23. function(setup_binary_target target)
  24. # Set up installation paths for program install
  25. install(
  26. TARGETS ${target}
  27. RUNTIME DESTINATION ${OBS_EXECUTABLE_DESTINATION}
  28. COMPONENT ${target}_Runtime
  29. LIBRARY DESTINATION ${OBS_LIBRARY_DESTINATION}
  30. COMPONENT ${target}_Runtime
  31. NAMELINK_COMPONENT ${target}_Development
  32. ARCHIVE DESTINATION ${OBS_LIBRARY_DESTINATION}
  33. COMPONENT ${target}_Development
  34. PUBLIC_HEADER DESTINATION ${OBS_INCLUDE_DESTINATION})
  35. # Set up installation paths for development rundir
  36. install(
  37. TARGETS ${target}
  38. RUNTIME DESTINATION ${OBS_EXECUTABLE_DESTINATION} COMPONENT obs_rundir
  39. LIBRARY DESTINATION ${OBS_LIBRARY_DESTINATION} COMPONENT obs_rundir
  40. PUBLIC_HEADER DESTINATION ${OBS_INCLUDE_DESTINATION} EXCLUDE_FROM_ALL)
  41. endfunction()
  42. # Helper function to set up OBS plugin targets
  43. function(setup_plugin_target target)
  44. set_target_properties(${target} PROPERTIES PREFIX "")
  45. install(
  46. TARGETS ${target}
  47. RUNTIME DESTINATION ${OBS_PLUGIN_DESTINATION} COMPONENT ${target}_Runtime
  48. LIBRARY DESTINATION ${OBS_PLUGIN_DESTINATION}
  49. COMPONENT ${target}_Runtime
  50. NAMELINK_COMPONENT ${target}_Development)
  51. install(
  52. TARGETS ${target}
  53. RUNTIME DESTINATION ${OBS_PLUGIN_DESTINATION} COMPONENT obs_rundir
  54. LIBRARY DESTINATION ${OBS_PLUGIN_DESTINATION}
  55. COMPONENT obs_rundir
  56. EXCLUDE_FROM_ALL)
  57. setup_target_resources("${target}" "obs-plugins/${target}")
  58. set_property(GLOBAL APPEND PROPERTY OBS_MODULE_LIST "${target}")
  59. message(STATUS "OBS: ENABLED ${target}")
  60. endfunction()
  61. # Helper function to set up OBS scripting plugin targets
  62. function(setup_script_plugin_target target)
  63. set_target_properties(${target} PROPERTIES PREFIX "")
  64. install(
  65. TARGETS ${target}
  66. LIBRARY DESTINATION ${OBS_SCRIPT_PLUGIN_DESTINATION}
  67. COMPONENT ${target}_Runtime
  68. NAMELINK_COMPONENT ${target}_Development)
  69. install(
  70. TARGETS ${target}
  71. LIBRARY DESTINATION ${OBS_SCRIPT_PLUGIN_DESTINATION}
  72. COMPONENT obs_rundir
  73. EXCLUDE_FROM_ALL)
  74. if(${target} STREQUAL "obspython")
  75. install(
  76. FILES "$<TARGET_FILE_DIR:${target}>/$<TARGET_FILE_BASE_NAME:${target}>.py"
  77. DESTINATION ${OBS_SCRIPT_PLUGIN_DESTINATION}
  78. COMPONENT ${target}_Runtime)
  79. install(
  80. FILES "$<TARGET_FILE_DIR:${target}>/$<TARGET_FILE_BASE_NAME:${target}>.py"
  81. DESTINATION ${OBS_SCRIPT_PLUGIN_DESTINATION}
  82. COMPONENT obs_rundir
  83. EXCLUDE_FROM_ALL)
  84. endif()
  85. set_property(GLOBAL APPEND PROPERTY OBS_SCRIPTING_MODULE_LIST "${target}")
  86. message(STATUS "OBS: ENABLED ${target}")
  87. endfunction()
  88. # Helper function to set up target resources (e.g. L10N files)
  89. function(setup_target_resources target destination)
  90. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data")
  91. install(
  92. DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data/
  93. DESTINATION ${OBS_DATA_DESTINATION}/${destination}
  94. USE_SOURCE_PERMISSIONS
  95. COMPONENT ${target}_Runtime)
  96. install(
  97. DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data/
  98. DESTINATION ${OBS_DATA_DESTINATION}/${destination}
  99. USE_SOURCE_PERMISSIONS
  100. COMPONENT obs_rundir
  101. EXCLUDE_FROM_ALL)
  102. endif()
  103. endfunction()
  104. # Helper function to set up specific resource files for targets
  105. function(add_target_resource target resource destination)
  106. install(
  107. FILES ${resource}
  108. DESTINATION ${OBS_DATA_DESTINATION}/${destination}
  109. COMPONENT ${target}_Runtime)
  110. install(
  111. FILES ${resource}
  112. DESTINATION
  113. ${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_DATA_DESTINATION}/${destination}
  114. COMPONENT obs_rundir
  115. EXCLUDE_FROM_ALL)
  116. endfunction()
  117. # Helper function to set up OBS app target
  118. function(setup_obs_app target)
  119. setup_binary_target(${target})
  120. get_property(OBS_MODULE_LIST GLOBAL PROPERTY OBS_MODULE_LIST)
  121. list(LENGTH OBS_MODULE_LIST _LEN)
  122. if(_LEN GREATER 0)
  123. add_dependencies(${target} ${OBS_MODULE_LIST})
  124. endif()
  125. get_property(OBS_SCRIPTING_MODULE_LIST GLOBAL
  126. PROPERTY OBS_SCRIPTING_MODULE_LIST)
  127. list(LENGTH OBS_SCRIPTING_MODULE_LIST _LEN)
  128. if(_LEN GREATER 0)
  129. add_dependencies(${target} ${OBS_SCRIPTING_MODULE_LIST})
  130. endif()
  131. # detect outdated obs-browser submodule
  132. if(NOT TARGET OBS::browser AND TARGET obs-browser)
  133. target_compile_features(obs-browser-page PRIVATE cxx_std_17)
  134. add_library(OBS::browser ALIAS obs-browser)
  135. if(NOT TARGET OBS::browser-panels AND BROWSER_PANEL_SUPPORT_ENABLED)
  136. add_library(OBS::browser-panels ALIAS obs-browser)
  137. endif()
  138. endif()
  139. if(TARGET OBS::browser)
  140. setup_target_browser(${target})
  141. endif()
  142. if(TARGET OBS::ffmpeg-mux)
  143. add_dependencies(${target} OBS::ffmpeg-mux)
  144. endif()
  145. add_custom_command(
  146. TARGET ${target}
  147. POST_BUILD
  148. COMMAND "${CMAKE_COMMAND}" --install .. --config $<CONFIG> --prefix
  149. ${OBS_OUTPUT_DIR}/$<CONFIG> --component obs_rundir
  150. COMMENT "Installing OBS rundir"
  151. VERBATIM)
  152. endfunction()
  153. # Helper function to do additional setup for browser source plugin
  154. function(setup_target_browser target)
  155. install(
  156. DIRECTORY ${CEF_ROOT_DIR}/Resources/
  157. DESTINATION ${OBS_PLUGIN_DESTINATION}
  158. COMPONENT ${target}_Runtime)
  159. install(
  160. DIRECTORY ${CEF_ROOT_DIR}/Release/
  161. DESTINATION ${OBS_PLUGIN_DESTINATION}
  162. COMPONENT ${target}_Runtime)
  163. install(
  164. DIRECTORY ${CEF_ROOT_DIR}/Resources/
  165. DESTINATION ${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}
  166. COMPONENT obs_rundir
  167. EXCLUDE_FROM_ALL)
  168. install(
  169. DIRECTORY ${CEF_ROOT_DIR}/Release/
  170. DESTINATION ${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}
  171. COMPONENT obs_rundir
  172. EXCLUDE_FROM_ALL)
  173. endfunction()
  174. # Helper function to export target to build and install tree. Allows usage of
  175. # `find_package(libobs)` by other build trees
  176. function(export_target target)
  177. set(CMAKE_EXPORT_PACKAGE_REGISTRY OFF)
  178. install(
  179. TARGETS ${target}
  180. EXPORT ${target}Targets
  181. RUNTIME DESTINATION ${OBS_EXECUTABLE_DESTINATION} COMPONENT obs_libraries
  182. LIBRARY DESTINATION ${OBS_LIBRARY_DESTINATION} COMPONENT obs_libraries
  183. ARCHIVE DESTINATION ${OBS_LIBRARY_DESTINATION} COMPONENT obs_libraries
  184. INCLUDES
  185. DESTINATION ${OBS_INCLUDE_DESTINATION}
  186. PUBLIC_HEADER
  187. DESTINATION ${OBS_INCLUDE_DESTINATION}
  188. COMPONENT obs_libraries
  189. EXCLUDE_FROM_ALL)
  190. include(GenerateExportHeader)
  191. generate_export_header(${target} EXPORT_FILE_NAME
  192. ${CMAKE_CURRENT_BINARY_DIR}/${target}_EXPORT.h)
  193. target_sources(${target}
  194. PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/${target}_EXPORT.h)
  195. set(TARGETS_EXPORT_NAME "${target}Targets")
  196. include(CMakePackageConfigHelpers)
  197. configure_package_config_file(
  198. ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${target}Config.cmake.in
  199. ${CMAKE_CURRENT_BINARY_DIR}/${target}Config.cmake
  200. INSTALL_DESTINATION ${OBS_CMAKE_DESTINATION}/${target}
  201. PATH_VARS OBS_PLUGIN_DESTINATION OBS_DATA_DESTINATION)
  202. write_basic_package_version_file(
  203. ${CMAKE_CURRENT_BINARY_DIR}/${target}ConfigVersion.cmake
  204. VERSION ${OBS_VERSION_CANONICAL}
  205. COMPATIBILITY SameMajorVersion)
  206. export(
  207. EXPORT ${target}Targets
  208. FILE ${CMAKE_CURRENT_BINARY_DIR}/${TARGETS_EXPORT_NAME}.cmake
  209. NAMESPACE OBS::)
  210. export(PACKAGE "${target}")
  211. install(
  212. EXPORT ${TARGETS_EXPORT_NAME}
  213. FILE ${TARGETS_EXPORT_NAME}.cmake
  214. NAMESPACE OBS::
  215. DESTINATION ${OBS_CMAKE_DESTINATION}/${target}
  216. COMPONENT obs_libraries
  217. EXCLUDE_FROM_ALL)
  218. install(
  219. FILES ${CMAKE_CURRENT_BINARY_DIR}/${target}Config.cmake
  220. ${CMAKE_CURRENT_BINARY_DIR}/${target}ConfigVersion.cmake
  221. DESTINATION ${OBS_CMAKE_DESTINATION}/${target}
  222. COMPONENT obs_libraries
  223. EXCLUDE_FROM_ALL)
  224. endfunction()
  225. # Helper function to install header files
  226. function(install_headers target)
  227. install(
  228. DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/"
  229. DESTINATION ${OBS_INCLUDE_DESTINATION}
  230. COMPONENT obs_libraries
  231. EXCLUDE_FROM_ALL FILES_MATCHING
  232. PATTERN "*.h"
  233. PATTERN "*.hpp"
  234. PATTERN "cmake" EXCLUDE
  235. PATTERN "pkgconfig" EXCLUDE
  236. PATTERN "data" EXCLUDE)
  237. if(NOT EXISTS "${OBS_INCLUDE_DESTINATION}/obsconfig.h")
  238. install(
  239. FILES "${CMAKE_BINARY_DIR}/config/obsconfig.h"
  240. DESTINATION "${OBS_INCLUDE_DESTINATION}"
  241. COMPONENT obs_libraries
  242. EXCLUDE_FROM_ALL)
  243. endif()
  244. endfunction()
  245. # Helper function to define available graphics modules for targets
  246. function(define_graphic_modules target)
  247. foreach(_GRAPHICS_API metal d3d11 opengl d3d9)
  248. string(TOUPPER ${_GRAPHICS_API} _GRAPHICS_API_u)
  249. if(TARGET OBS::libobs-${_GRAPHICS_API})
  250. if(OS_POSIX AND NOT LINUX_PORTABLE)
  251. target_compile_definitions(
  252. ${target}
  253. PRIVATE
  254. DL_${_GRAPHICS_API_u}="$<TARGET_SONAME_FILE_NAME:libobs-${_GRAPHICS_API}>"
  255. )
  256. else()
  257. target_compile_definitions(
  258. ${target}
  259. PRIVATE
  260. DL_${_GRAPHICS_API_u}="$<TARGET_FILE_NAME:libobs-${_GRAPHICS_API}>")
  261. endif()
  262. add_dependencies(${target} OBS::libobs-${_GRAPHICS_API})
  263. else()
  264. target_compile_definitions(${target} PRIVATE DL_${_GRAPHICS_API_u}="")
  265. endif()
  266. endforeach()
  267. endfunction()
  268. macro(find_qt)
  269. set(oneValueArgs VERSION)
  270. set(multiValueArgs COMPONENTS COMPONENTS_WIN COMPONENTS_MAC COMPONENTS_LINUX)
  271. cmake_parse_arguments(FIND_QT "" "${oneValueArgs}" "${multiValueArgs}"
  272. ${ARGN})
  273. if(OS_WINDOWS)
  274. find_package(
  275. Qt${FIND_QT_VERSION}
  276. COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_WIN}
  277. REQUIRED)
  278. elseif(OS_MACOS)
  279. find_package(
  280. Qt${FIND_QT_VERSION}
  281. COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_MAC}
  282. REQUIRED)
  283. else()
  284. find_package(
  285. Qt${FIND_QT_VERSION}
  286. COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_LINUX}
  287. REQUIRED)
  288. endif()
  289. foreach(_COMPONENT IN LISTS FIND_QT_COMPONENTS FIND_QT_COMPONENTS_WIN
  290. FIND_QT_COMPONENTS_MAC FIND_QT_COMPONENTS_LINUX)
  291. if(NOT TARGET Qt::${_COMPONENT} AND TARGET
  292. Qt${FIND_QT_VERSION}::${_COMPONENT})
  293. add_library(Qt::${_COMPONENT} INTERFACE IMPORTED)
  294. set_target_properties(
  295. Qt::${_COMPONENT} PROPERTIES INTERFACE_LINK_LIBRARIES
  296. "Qt${FIND_QT_VERSION}::${_COMPONENT}")
  297. endif()
  298. endforeach()
  299. endmacro()
  300. # Idea adapted from: https://github.com/edsiper/cmake-options
  301. macro(set_option option value)
  302. set(${option}
  303. ${value}
  304. CACHE INTERNAL "")
  305. endmacro()
  306. if(OS_WINDOWS)
  307. include(ObsHelpers_Windows)
  308. elseif(OS_MACOS)
  309. include(ObsHelpers_macOS)
  310. elseif(OS_POSIX)
  311. include(ObsHelpers_Linux)
  312. endif()
  313. # ##############################################################################
  314. # LEGACY FALLBACKS #
  315. # ##############################################################################
  316. # Helper function to install OBS plugin with associated resource directory
  317. function(_install_obs_plugin_with_data target source)
  318. setup_plugin_target(${target})
  319. if(NOT ${source} STREQUAL "data"
  320. AND IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${source}"
  321. AND NOT OS_MACOS)
  322. install(
  323. DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${source}/
  324. DESTINATION ${OBS_DATA_DESTINATION}/obs-plugins/${target}
  325. USE_SOURCE_PERMISSIONS
  326. COMPONENT ${target}_Runtime)
  327. install(
  328. DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${source}/
  329. DESTINATION
  330. ${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_DATA_DESTINATION}/obs-plugins/${target}
  331. COMPONENT obs_rundir
  332. EXCLUDE_FROM_ALL)
  333. if(OS_WINDOWS AND DEFINED ENV{obsInstallerTempDir})
  334. install(
  335. DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${source}/
  336. DESTINATION
  337. $ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/obs-plugins/${target}
  338. COMPONENT obs_rundir
  339. EXCLUDE_FROM_ALL)
  340. endif()
  341. endif()
  342. endfunction()
  343. # Helper function to install OBS plugin
  344. function(_install_obs_plugin target)
  345. setup_plugin_target(${target})
  346. endfunction()
  347. # Helper function to install data for a target only
  348. function(_install_obs_datatarget target destination)
  349. install(
  350. TARGETS ${target}
  351. LIBRARY DESTINATION ${OBS_DATA_DESTINATION}/${destination}
  352. COMPONENT ${target}_Runtime
  353. NAMELINK_COMPONENT ${target}_Development
  354. RUNTIME DESTINATION ${OBS_DATA_DESTINATION}/${destination}
  355. COMPONENT ${target}_Runtime)
  356. install(
  357. TARGETS ${target}
  358. LIBRARY
  359. DESTINATION
  360. ${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_DATA_DESTINATION}/${destination}
  361. COMPONENT obs_rundir
  362. RUNTIME
  363. DESTINATION
  364. ${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_DATA_DESTINATION}/${destination}
  365. COMPONENT obs_rundir
  366. EXCLUDE_FROM_ALL)
  367. if(OS_WINDOWS)
  368. if(MSVC)
  369. add_target_resource(${target} "$<TARGET_PDB_FILE:${target}>"
  370. "${destination}")
  371. endif()
  372. if(DEFINED ENV{obsInstallerTempDir})
  373. install(
  374. TARGETS ${target}
  375. RUNTIME
  376. DESTINATION
  377. $ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${destination}/$<TARGET_FILE_NAME:${target}>
  378. LIBRARY
  379. DESTINATION
  380. $ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${destination}/$<TARGET_FILE_NAME:${target}>
  381. COMPONENT obs_rundir
  382. EXCLUDE_FROM_ALL)
  383. endif()
  384. endif()
  385. endfunction()