helpers.cmake 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  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}/snapshot_blob.bin"
  156. "${cef_location}/v8_context_snapshot.bin" "${cef_location}/vk_swiftshader_icd.json"
  157. "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/"
  158. COMMAND
  159. "${CMAKE_COMMAND}" -E copy_if_different "${cef_root_location}/Resources/chrome_100_percent.pak"
  160. "${cef_root_location}/Resources/chrome_200_percent.pak" "${cef_root_location}/Resources/icudtl.dat"
  161. "${cef_root_location}/Resources/resources.pak" "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/"
  162. COMMAND
  163. "${CMAKE_COMMAND}" -E copy_directory "${cef_root_location}/Resources/locales"
  164. "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/locales"
  165. COMMENT "Add Chromium Embedded Framwork to library directory"
  166. )
  167. install(
  168. FILES
  169. "${imported_location}"
  170. "${cef_location}/chrome-sandbox"
  171. "${cef_location}/libEGL.so"
  172. "${cef_location}/libGLESv2.so"
  173. "${cef_location}/libvk_swiftshader.so"
  174. "${cef_location}/libvulkan.so.1"
  175. "${cef_location}/snapshot_blob.bin"
  176. "${cef_location}/v8_context_snapshot.bin"
  177. "${cef_location}/vk_swiftshader_icd.json"
  178. "${cef_root_location}/Resources/chrome_100_percent.pak"
  179. "${cef_root_location}/Resources/chrome_200_percent.pak"
  180. "${cef_root_location}/Resources/icudtl.dat"
  181. "${cef_root_location}/Resources/resources.pak"
  182. DESTINATION "${OBS_PLUGIN_DESTINATION}"
  183. COMPONENT Runtime
  184. )
  185. install(
  186. DIRECTORY "${cef_root_location}/Resources/locales"
  187. DESTINATION "${OBS_PLUGIN_DESTINATION}"
  188. USE_SOURCE_PERMISSIONS
  189. COMPONENT Runtime
  190. )
  191. endif()
  192. endif()
  193. endif()
  194. set_property(GLOBAL APPEND PROPERTY OBS_MODULES_ENABLED ${target})
  195. endif()
  196. target_install_resources(${target})
  197. endfunction()
  198. # Helper function to add resources into bundle
  199. function(target_install_resources target)
  200. message(DEBUG "Installing resources for target ${target}...")
  201. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data")
  202. file(GLOB_RECURSE data_files "${CMAKE_CURRENT_SOURCE_DIR}/data/*")
  203. foreach(data_file IN LISTS data_files)
  204. cmake_path(
  205. RELATIVE_PATH
  206. data_file
  207. BASE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/"
  208. OUTPUT_VARIABLE relative_path
  209. )
  210. cmake_path(GET relative_path PARENT_PATH relative_path)
  211. target_sources(${target} PRIVATE "${data_file}")
  212. source_group("Resources/${relative_path}" FILES "${data_file}")
  213. endforeach()
  214. get_property(obs_module_list GLOBAL PROPERTY OBS_MODULES_ENABLED)
  215. if(target IN_LIST obs_module_list)
  216. set(target_destination "${OBS_DATA_DESTINATION}/obs-plugins/${target}")
  217. elseif(target STREQUAL obs)
  218. set(target_destination "${OBS_DATA_DESTINATION}/obs-studio")
  219. else()
  220. set(target_destination "${OBS_DATA_DESTINATION}/${target}")
  221. endif()
  222. install(
  223. DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/"
  224. DESTINATION "${target_destination}"
  225. USE_SOURCE_PERMISSIONS
  226. COMPONENT Runtime
  227. )
  228. add_custom_command(
  229. TARGET ${target}
  230. POST_BUILD
  231. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}"
  232. COMMAND
  233. "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/data"
  234. "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}"
  235. COMMENT "Copy ${target} resources to data directory (${target_destination})"
  236. VERBATIM
  237. )
  238. endif()
  239. endfunction()
  240. # Helper function to add a specific resource to a bundle
  241. function(target_add_resource target resource)
  242. get_property(obs_module_list GLOBAL PROPERTY OBS_MODULES_ENABLED)
  243. if(${ARGN})
  244. set(target_destination "${ARGN}")
  245. elseif(${target} IN_LIST obs_module_list)
  246. set(target_destination "${OBS_DATA_DESTINATION}/obs-plugins/${target}")
  247. elseif(target STREQUAL obs)
  248. set(target_destination "${OBS_DATA_DESTINATION}/obs-studio")
  249. else()
  250. set(target_destination "${OBS_DATA_DESTINATION}/${target}")
  251. endif()
  252. message(DEBUG "Add resource ${resource} to target ${target} at destination ${target_destination}...")
  253. install(FILES "${resource}" DESTINATION "${target_destination}" COMPONENT Runtime)
  254. add_custom_command(
  255. TARGET ${target}
  256. POST_BUILD
  257. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}/"
  258. COMMAND "${CMAKE_COMMAND}" -E copy "${resource}" "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}/"
  259. COMMENT "Copy ${target} resource ${resource} to library directory (${target_destination})"
  260. VERBATIM
  261. )
  262. endfunction()
  263. # target_export: Helper function to export target as CMake package
  264. function(target_export target)
  265. set(exclude_variant "")
  266. _target_export(${target})
  267. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/linux/${target}.pc.in")
  268. message(DEBUG "Generating pkgconfig file ${target}.pc.in...")
  269. install(CODE "set(OBS_VERSION_CANONICAL ${OBS_VERSION_CANONICAL})" COMPONENT Development)
  270. install(CODE "set(CMAKE_C_STANDARD ${CMAKE_C_STANDARD})" COMPONENT Development)
  271. install(
  272. CODE
  273. "configure_file(\"${CMAKE_CURRENT_SOURCE_DIR}/cmake/linux/${target}.pc.in\" \"${CMAKE_CURRENT_BINARY_DIR}/${target}.pc\" @ONLY)"
  274. COMPONENT Development
  275. )
  276. install(
  277. FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}.pc"
  278. DESTINATION "${OBS_LIBRARY_DESTINATION}/pkgconfig"
  279. COMPONENT Development
  280. )
  281. endif()
  282. endfunction()