helpers.cmake 12 KB

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