helpers.cmake 12 KB

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