helpers.cmake 12 KB

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