helpers.cmake 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. # OBS CMake Linux helper functions module
  2. include_guard(GLOBAL)
  3. include(helpers_common)
  4. # set_target_properties_obs: Set target properties for use in obs-studio
  5. function(set_target_properties_obs target)
  6. set(options "")
  7. set(oneValueArgs "")
  8. set(multiValueArgs PROPERTIES)
  9. cmake_parse_arguments(PARSE_ARGV 0 _STPO "${options}" "${oneValueArgs}" "${multiValueArgs}")
  10. message(DEBUG "Setting additional properties for target ${target}...")
  11. while(_STPO_PROPERTIES)
  12. list(POP_FRONT _STPO_PROPERTIES key value)
  13. set_property(TARGET ${target} PROPERTY ${key} "${value}")
  14. endwhile()
  15. get_target_property(target_type ${target} TYPE)
  16. if(target_type STREQUAL EXECUTABLE)
  17. install(TARGETS ${target} RUNTIME DESTINATION "${OBS_EXECUTABLE_DESTINATION}" COMPONENT Runtime)
  18. add_custom_command(
  19. TARGET ${target}
  20. POST_BUILD
  21. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_EXECUTABLE_DESTINATION}"
  22. COMMAND
  23. "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:${target}>"
  24. "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_EXECUTABLE_DESTINATION}"
  25. COMMENT "Copy ${target} to binary directory"
  26. VERBATIM
  27. )
  28. if(target STREQUAL obs-studio)
  29. get_property(obs_executables GLOBAL PROPERTY _OBS_EXECUTABLES)
  30. get_property(obs_modules GLOBAL PROPERTY OBS_MODULES_ENABLED)
  31. add_dependencies(${target} ${obs_executables} ${obs_modules})
  32. target_add_resource(${target} "${CMAKE_CURRENT_SOURCE_DIR}/../AUTHORS"
  33. "${OBS_DATA_DESTINATION}/obs-studio/authors"
  34. )
  35. elseif(target STREQUAL browser-helper)
  36. set_property(GLOBAL APPEND PROPERTY _OBS_EXECUTABLES ${target})
  37. return()
  38. else()
  39. set_property(GLOBAL APPEND PROPERTY _OBS_EXECUTABLES ${target})
  40. endif()
  41. set_target_properties(
  42. ${target}
  43. PROPERTIES
  44. BUILD_RPATH "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}"
  45. INSTALL_RPATH "${OBS_EXECUTABLE_RPATH}"
  46. )
  47. elseif(target_type STREQUAL SHARED_LIBRARY)
  48. set_target_properties(
  49. ${target}
  50. PROPERTIES
  51. VERSION ${OBS_VERSION_CANONICAL}
  52. SOVERSION ${OBS_VERSION_MAJOR}
  53. BUILD_RPATH "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}"
  54. INSTALL_RPATH "${OBS_LIBRARY_RPATH}"
  55. )
  56. install(
  57. TARGETS ${target}
  58. LIBRARY DESTINATION "${OBS_LIBRARY_DESTINATION}" COMPONENT Runtime
  59. PUBLIC_HEADER DESTINATION "${OBS_INCLUDE_DESTINATION}" COMPONENT Development EXCLUDE_FROM_ALL
  60. )
  61. add_custom_command(
  62. TARGET ${target}
  63. POST_BUILD
  64. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}"
  65. COMMAND
  66. "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:${target}>"
  67. "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}/"
  68. COMMAND
  69. "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_SONAME_FILE:${target}>"
  70. "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}/"
  71. COMMENT "Copy ${target} to library directory (${OBS_LIBRARY_DESTINATION})"
  72. VERBATIM
  73. )
  74. if(target STREQUAL libobs OR target STREQUAL obs-frontend-api)
  75. install(
  76. FILES "$<TARGET_FILE_DIR:${target}>/$<TARGET_FILE_PREFIX:${target}>$<TARGET_FILE_BASE_NAME:${target}>.so.0"
  77. DESTINATION "${OBS_LIBRARY_DESTINATION}"
  78. )
  79. add_custom_command(
  80. TARGET ${target}
  81. POST_BUILD
  82. COMMAND
  83. "${CMAKE_COMMAND}" -E create_symlink
  84. "$<TARGET_FILE_PREFIX:${target}>$<TARGET_FILE_BASE_NAME:${target}>.so.${OBS_VERSION_MAJOR}"
  85. "$<TARGET_FILE_PREFIX:${target}>$<TARGET_FILE_BASE_NAME:${target}>.so.0"
  86. COMMAND
  87. "${CMAKE_COMMAND}" -E copy_if_different
  88. "$<TARGET_FILE_DIR:${target}>/$<TARGET_FILE_PREFIX:${target}>$<TARGET_FILE_BASE_NAME:${target}>.so.0"
  89. "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}"
  90. COMMENT "Create symlink for legacy ${target}"
  91. )
  92. endif()
  93. elseif(target_type STREQUAL MODULE_LIBRARY)
  94. if(target STREQUAL obs-browser)
  95. set_target_properties(${target} PROPERTIES VERSION 0 SOVERSION ${OBS_VERSION_MAJOR})
  96. else()
  97. set_target_properties(
  98. ${target}
  99. PROPERTIES
  100. VERSION 0
  101. SOVERSION ${OBS_VERSION_MAJOR}
  102. BUILD_RPATH "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}"
  103. INSTALL_RPATH "${OBS_MODULE_RPATH}"
  104. )
  105. endif()
  106. if(${target} STREQUAL obspython OR ${target} STREQUAL obslua)
  107. set(plugin_destination "${OBS_SCRIPT_PLUGIN_DESTINATION}")
  108. set_property(TARGET ${target} PROPERTY INSTALL_RPATH "$ORIGIN/;$ORIGIN/..")
  109. else()
  110. set(plugin_destination "${OBS_PLUGIN_DESTINATION}")
  111. endif()
  112. install(
  113. TARGETS ${target}
  114. LIBRARY DESTINATION "${plugin_destination}" COMPONENT Runtime NAMELINK_COMPONENT Development
  115. )
  116. add_custom_command(
  117. TARGET ${target}
  118. POST_BUILD
  119. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${plugin_destination}"
  120. COMMAND
  121. "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:${target}>"
  122. "${OBS_OUTPUT_DIR}/$<CONFIG>/${plugin_destination}"
  123. COMMENT "Copy ${target} to plugin directory (${plugin_destination})"
  124. VERBATIM
  125. )
  126. if(${target} STREQUAL obspython)
  127. add_custom_command(
  128. TARGET ${target}
  129. POST_BUILD
  130. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_SCRIPT_PLUGIN_DESTINATION}/"
  131. COMMAND
  132. "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE_DIR:obspython>/obspython.py"
  133. "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_SCRIPT_PLUGIN_DESTINATION}/"
  134. COMMENT "Add obspython import module"
  135. )
  136. install(
  137. FILES "$<TARGET_FILE_DIR:obspython>/obspython.py"
  138. DESTINATION "${OBS_SCRIPT_PLUGIN_DESTINATION}"
  139. COMPONENT Runtime
  140. )
  141. elseif(${target} STREQUAL obs-browser)
  142. message(DEBUG "Add Chromium Embedded Framework to project for obs-browser plugin...")
  143. if(TARGET CEF::Library)
  144. get_target_property(imported_location CEF::Library IMPORTED_LOCATION_RELEASE)
  145. if(imported_location)
  146. cmake_path(GET imported_location PARENT_PATH cef_location)
  147. cmake_path(GET cef_location PARENT_PATH cef_root_location)
  148. add_custom_command(
  149. TARGET ${target}
  150. POST_BUILD
  151. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/"
  152. COMMAND
  153. "${CMAKE_COMMAND}" -E copy_if_different "${imported_location}" "${cef_location}/chrome-sandbox"
  154. "${cef_location}/libEGL.so" "${cef_location}/libGLESv2.so" "${cef_location}/libvk_swiftshader.so"
  155. "${cef_location}/libvulkan.so.1" "${cef_location}/v8_context_snapshot.bin"
  156. "${cef_location}/vk_swiftshader_icd.json" "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/"
  157. COMMAND
  158. "${CMAKE_COMMAND}" -E copy_if_different "${cef_root_location}/Resources/chrome_100_percent.pak"
  159. "${cef_root_location}/Resources/chrome_200_percent.pak" "${cef_root_location}/Resources/icudtl.dat"
  160. "${cef_root_location}/Resources/resources.pak" "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/"
  161. COMMAND
  162. "${CMAKE_COMMAND}" -E copy_directory "${cef_root_location}/Resources/locales"
  163. "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/locales"
  164. COMMENT "Add Chromium Embedded Framwork to library directory"
  165. )
  166. install(
  167. FILES
  168. "${imported_location}"
  169. "${cef_location}/chrome-sandbox"
  170. "${cef_location}/libEGL.so"
  171. "${cef_location}/libGLESv2.so"
  172. "${cef_location}/libvk_swiftshader.so"
  173. "${cef_location}/libvulkan.so.1"
  174. "${cef_location}/v8_context_snapshot.bin"
  175. "${cef_location}/vk_swiftshader_icd.json"
  176. "${cef_root_location}/Resources/chrome_100_percent.pak"
  177. "${cef_root_location}/Resources/chrome_200_percent.pak"
  178. "${cef_root_location}/Resources/icudtl.dat"
  179. "${cef_root_location}/Resources/resources.pak"
  180. DESTINATION "${OBS_PLUGIN_DESTINATION}"
  181. COMPONENT Runtime
  182. )
  183. install(
  184. DIRECTORY "${cef_root_location}/Resources/locales"
  185. DESTINATION "${OBS_PLUGIN_DESTINATION}"
  186. USE_SOURCE_PERMISSIONS
  187. COMPONENT Runtime
  188. )
  189. endif()
  190. endif()
  191. endif()
  192. set_property(GLOBAL APPEND PROPERTY OBS_MODULES_ENABLED ${target})
  193. endif()
  194. target_install_resources(${target})
  195. endfunction()
  196. # Helper function to add resources into bundle
  197. function(target_install_resources target)
  198. message(DEBUG "Installing resources for target ${target}...")
  199. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data")
  200. file(GLOB_RECURSE data_files "${CMAKE_CURRENT_SOURCE_DIR}/data/*")
  201. foreach(data_file IN LISTS data_files)
  202. cmake_path(
  203. RELATIVE_PATH
  204. data_file
  205. BASE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/"
  206. OUTPUT_VARIABLE relative_path
  207. )
  208. cmake_path(GET relative_path PARENT_PATH relative_path)
  209. target_sources(${target} PRIVATE "${data_file}")
  210. source_group("Resources/${relative_path}" FILES "${data_file}")
  211. endforeach()
  212. get_property(obs_module_list GLOBAL PROPERTY OBS_MODULES_ENABLED)
  213. if(target IN_LIST obs_module_list)
  214. set(target_destination "${OBS_DATA_DESTINATION}/obs-plugins/${target}")
  215. elseif(target STREQUAL obs)
  216. set(target_destination "${OBS_DATA_DESTINATION}/obs-studio")
  217. else()
  218. set(target_destination "${OBS_DATA_DESTINATION}/${target}")
  219. endif()
  220. install(
  221. DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/"
  222. DESTINATION "${target_destination}"
  223. USE_SOURCE_PERMISSIONS
  224. COMPONENT Runtime
  225. )
  226. add_custom_command(
  227. TARGET ${target}
  228. POST_BUILD
  229. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}"
  230. COMMAND
  231. "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/data"
  232. "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}"
  233. COMMENT "Copy ${target} resources to data directory (${target_destination})"
  234. VERBATIM
  235. )
  236. endif()
  237. endfunction()
  238. # Helper function to add a specific resource to a bundle
  239. function(target_add_resource target resource)
  240. get_property(obs_module_list GLOBAL PROPERTY OBS_MODULES_ENABLED)
  241. if(ARGN)
  242. set(target_destination "${ARGN}")
  243. elseif(${target} IN_LIST obs_module_list)
  244. set(target_destination "${OBS_DATA_DESTINATION}/obs-plugins/${target}")
  245. elseif(target STREQUAL obs)
  246. set(target_destination "${OBS_DATA_DESTINATION}/obs-studio")
  247. else()
  248. set(target_destination "${OBS_DATA_DESTINATION}/${target}")
  249. endif()
  250. message(DEBUG "Add resource ${resource} to target ${target} at destination ${target_destination}...")
  251. install(FILES "${resource}" DESTINATION "${target_destination}" COMPONENT Runtime)
  252. add_custom_command(
  253. TARGET ${target}
  254. POST_BUILD
  255. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}/"
  256. COMMAND "${CMAKE_COMMAND}" -E copy "${resource}" "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}/"
  257. COMMENT "Copy ${target} resource ${resource} to library directory (${target_destination})"
  258. VERBATIM
  259. )
  260. endfunction()
  261. # target_export: Helper function to export target as CMake package
  262. function(target_export target)
  263. set(exclude_variant "")
  264. _target_export(${target})
  265. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/linux/${target}.pc.in")
  266. message(DEBUG "Generating pkgconfig file ${target}.pc.in...")
  267. install(CODE "set(OBS_VERSION_CANONICAL ${OBS_VERSION_CANONICAL})" COMPONENT Development)
  268. install(CODE "set(CMAKE_C_STANDARD ${CMAKE_C_STANDARD})" COMPONENT Development)
  269. install(
  270. CODE
  271. "configure_file(\"${CMAKE_CURRENT_SOURCE_DIR}/cmake/linux/${target}.pc.in\" \"${CMAKE_CURRENT_BINARY_DIR}/${target}.pc\" @ONLY)"
  272. COMPONENT Development
  273. )
  274. install(
  275. FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}.pc"
  276. DESTINATION "${OBS_LIBRARY_DESTINATION}/pkgconfig"
  277. COMPONENT Development
  278. )
  279. endif()
  280. endfunction()