helpers.cmake 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  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. elseif(target_type STREQUAL MODULE_LIBRARY)
  75. if(target STREQUAL obs-browser)
  76. set_target_properties(${target} PROPERTIES VERSION 0 SOVERSION ${OBS_VERSION_MAJOR})
  77. else()
  78. set_target_properties(
  79. ${target}
  80. PROPERTIES
  81. VERSION 0
  82. SOVERSION ${OBS_VERSION_MAJOR}
  83. BUILD_RPATH "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}"
  84. INSTALL_RPATH "${OBS_MODULE_RPATH}"
  85. )
  86. endif()
  87. if(${target} STREQUAL obspython OR ${target} STREQUAL obslua)
  88. set(plugin_destination "${OBS_SCRIPT_PLUGIN_DESTINATION}")
  89. set_property(TARGET ${target} PROPERTY INSTALL_RPATH "$ORIGIN/;$ORIGIN/..")
  90. else()
  91. set(plugin_destination "${OBS_PLUGIN_DESTINATION}")
  92. endif()
  93. install(
  94. TARGETS ${target}
  95. LIBRARY DESTINATION "${plugin_destination}" COMPONENT Runtime NAMELINK_COMPONENT Development
  96. )
  97. add_custom_command(
  98. TARGET ${target}
  99. POST_BUILD
  100. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${plugin_destination}"
  101. COMMAND
  102. "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:${target}>"
  103. "${OBS_OUTPUT_DIR}/$<CONFIG>/${plugin_destination}"
  104. COMMENT "Copy ${target} to plugin directory (${plugin_destination})"
  105. VERBATIM
  106. )
  107. if(${target} STREQUAL obspython)
  108. add_custom_command(
  109. TARGET ${target}
  110. POST_BUILD
  111. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_SCRIPT_PLUGIN_DESTINATION}/"
  112. COMMAND
  113. "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE_DIR:obspython>/obspython.py"
  114. "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_SCRIPT_PLUGIN_DESTINATION}/"
  115. COMMENT "Add obspython import module"
  116. )
  117. install(
  118. FILES "$<TARGET_FILE_DIR:obspython>/obspython.py"
  119. DESTINATION "${OBS_SCRIPT_PLUGIN_DESTINATION}"
  120. COMPONENT Runtime
  121. )
  122. elseif(${target} STREQUAL obs-browser)
  123. message(DEBUG "Add Chromium Embedded Framework to project for obs-browser plugin...")
  124. if(TARGET CEF::Library)
  125. get_target_property(imported_location CEF::Library IMPORTED_LOCATION_RELEASE)
  126. if(imported_location)
  127. cmake_path(GET imported_location PARENT_PATH cef_location)
  128. cmake_path(GET cef_location PARENT_PATH cef_root_location)
  129. add_custom_command(
  130. TARGET ${target}
  131. POST_BUILD
  132. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/"
  133. COMMAND
  134. "${CMAKE_COMMAND}" -E copy_if_different "${imported_location}" "${cef_location}/chrome-sandbox"
  135. "${cef_location}/libEGL.so" "${cef_location}/libGLESv2.so" "${cef_location}/libvk_swiftshader.so"
  136. "${cef_location}/libvulkan.so.1" "${cef_location}/v8_context_snapshot.bin"
  137. "${cef_location}/vk_swiftshader_icd.json" "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/"
  138. COMMAND
  139. "${CMAKE_COMMAND}" -E copy_if_different "${cef_root_location}/Resources/chrome_100_percent.pak"
  140. "${cef_root_location}/Resources/chrome_200_percent.pak" "${cef_root_location}/Resources/icudtl.dat"
  141. "${cef_root_location}/Resources/resources.pak" "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/"
  142. COMMAND
  143. "${CMAKE_COMMAND}" -E copy_directory "${cef_root_location}/Resources/locales"
  144. "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/locales"
  145. COMMENT "Add Chromium Embedded Framwork to library directory"
  146. )
  147. install(
  148. FILES
  149. "${imported_location}"
  150. "${cef_location}/chrome-sandbox"
  151. "${cef_location}/libEGL.so"
  152. "${cef_location}/libGLESv2.so"
  153. "${cef_location}/libvk_swiftshader.so"
  154. "${cef_location}/libvulkan.so.1"
  155. "${cef_location}/v8_context_snapshot.bin"
  156. "${cef_location}/vk_swiftshader_icd.json"
  157. "${cef_root_location}/Resources/chrome_100_percent.pak"
  158. "${cef_root_location}/Resources/chrome_200_percent.pak"
  159. "${cef_root_location}/Resources/icudtl.dat"
  160. "${cef_root_location}/Resources/resources.pak"
  161. DESTINATION "${OBS_PLUGIN_DESTINATION}"
  162. COMPONENT Runtime
  163. )
  164. install(
  165. DIRECTORY "${cef_root_location}/Resources/locales"
  166. DESTINATION "${OBS_PLUGIN_DESTINATION}"
  167. USE_SOURCE_PERMISSIONS
  168. COMPONENT Runtime
  169. )
  170. endif()
  171. endif()
  172. endif()
  173. set_property(GLOBAL APPEND PROPERTY OBS_MODULES_ENABLED ${target})
  174. endif()
  175. target_install_resources(${target})
  176. endfunction()
  177. # Helper function to add resources into bundle
  178. function(target_install_resources target)
  179. message(DEBUG "Installing resources for target ${target}...")
  180. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data")
  181. file(GLOB_RECURSE data_files "${CMAKE_CURRENT_SOURCE_DIR}/data/*")
  182. foreach(data_file IN LISTS data_files)
  183. cmake_path(
  184. RELATIVE_PATH
  185. data_file
  186. BASE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/"
  187. OUTPUT_VARIABLE relative_path
  188. )
  189. cmake_path(GET relative_path PARENT_PATH relative_path)
  190. target_sources(${target} PRIVATE "${data_file}")
  191. source_group("Resources/${relative_path}" FILES "${data_file}")
  192. endforeach()
  193. get_property(obs_module_list GLOBAL PROPERTY OBS_MODULES_ENABLED)
  194. if(target IN_LIST obs_module_list)
  195. set(target_destination "${OBS_DATA_DESTINATION}/obs-plugins/${target}")
  196. elseif(target STREQUAL obs)
  197. set(target_destination "${OBS_DATA_DESTINATION}/obs-studio")
  198. else()
  199. set(target_destination "${OBS_DATA_DESTINATION}/${target}")
  200. endif()
  201. install(
  202. DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/"
  203. DESTINATION "${target_destination}"
  204. USE_SOURCE_PERMISSIONS
  205. COMPONENT Runtime
  206. )
  207. add_custom_command(
  208. TARGET ${target}
  209. POST_BUILD
  210. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}"
  211. COMMAND
  212. "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/data"
  213. "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}"
  214. COMMENT "Copy ${target} resources to data directory (${target_destination})"
  215. VERBATIM
  216. )
  217. endif()
  218. endfunction()
  219. # Helper function to add a specific resource to a bundle
  220. function(target_add_resource target resource)
  221. get_property(obs_module_list GLOBAL PROPERTY OBS_MODULES_ENABLED)
  222. if(ARGN)
  223. set(target_destination "${ARGN}")
  224. elseif(${target} IN_LIST obs_module_list)
  225. set(target_destination "${OBS_DATA_DESTINATION}/obs-plugins/${target}")
  226. elseif(target STREQUAL obs)
  227. set(target_destination "${OBS_DATA_DESTINATION}/obs-studio")
  228. else()
  229. set(target_destination "${OBS_DATA_DESTINATION}/${target}")
  230. endif()
  231. message(DEBUG "Add resource ${resource} to target ${target} at destination ${target_destination}...")
  232. install(FILES "${resource}" DESTINATION "${target_destination}" COMPONENT Runtime)
  233. add_custom_command(
  234. TARGET ${target}
  235. POST_BUILD
  236. COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}/"
  237. COMMAND "${CMAKE_COMMAND}" -E copy "${resource}" "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}/"
  238. COMMENT "Copy ${target} resource ${resource} to library directory (${target_destination})"
  239. VERBATIM
  240. )
  241. endfunction()
  242. # target_export: Helper function to export target as CMake package
  243. function(target_export target)
  244. set(exclude_variant "")
  245. _target_export(${target})
  246. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/linux/${target}.pc.in")
  247. message(DEBUG "Generating pkgconfig file ${target}.pc.in...")
  248. install(CODE "set(OBS_VERSION_CANONICAL ${OBS_VERSION_CANONICAL})" COMPONENT Development)
  249. install(CODE "set(CMAKE_C_STANDARD ${CMAKE_C_STANDARD})" COMPONENT Development)
  250. install(
  251. CODE
  252. "configure_file(\"${CMAKE_CURRENT_SOURCE_DIR}/cmake/linux/${target}.pc.in\" \"${CMAKE_CURRENT_BINARY_DIR}/${target}.pc\" @ONLY)"
  253. COMPONENT Development
  254. )
  255. install(
  256. FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}.pc"
  257. DESTINATION "${OBS_LIBRARY_DESTINATION}/pkgconfig"
  258. COMPONENT Development
  259. )
  260. endif()
  261. endfunction()