123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- # OBS CMake Linux helper functions module
- include_guard(GLOBAL)
- include(helpers_common)
- # set_target_properties_obs: Set target properties for use in obs-studio
- function(set_target_properties_obs target)
- set(options "")
- set(oneValueArgs "")
- set(multiValueArgs PROPERTIES)
- cmake_parse_arguments(PARSE_ARGV 0 _STPO "${options}" "${oneValueArgs}" "${multiValueArgs}")
- message(DEBUG "Setting additional properties for target ${target}...")
- while(_STPO_PROPERTIES)
- list(POP_FRONT _STPO_PROPERTIES key value)
- set_property(TARGET ${target} PROPERTY ${key} "${value}")
- endwhile()
- get_target_property(target_type ${target} TYPE)
- if(target_type STREQUAL EXECUTABLE)
- install(TARGETS ${target} RUNTIME DESTINATION "${OBS_EXECUTABLE_DESTINATION}" COMPONENT Runtime)
- add_custom_command(
- TARGET ${target}
- POST_BUILD
- COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_EXECUTABLE_DESTINATION}"
- COMMAND
- "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:${target}>"
- "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_EXECUTABLE_DESTINATION}"
- COMMENT "Copy ${target} to binary directory"
- VERBATIM
- )
- if(target STREQUAL obs-studio)
- get_property(obs_executables GLOBAL PROPERTY _OBS_EXECUTABLES)
- get_property(obs_modules GLOBAL PROPERTY OBS_MODULES_ENABLED)
- add_dependencies(${target} ${obs_executables} ${obs_modules})
- target_add_resource(${target} "${CMAKE_CURRENT_SOURCE_DIR}/../AUTHORS"
- "${OBS_DATA_DESTINATION}/obs-studio/authors"
- )
- elseif(target STREQUAL browser-helper)
- set_property(GLOBAL APPEND PROPERTY _OBS_EXECUTABLES ${target})
- return()
- else()
- set_property(GLOBAL APPEND PROPERTY _OBS_EXECUTABLES ${target})
- endif()
- set_target_properties(
- ${target}
- PROPERTIES
- BUILD_RPATH "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}"
- INSTALL_RPATH "${OBS_EXECUTABLE_RPATH}"
- )
- elseif(target_type STREQUAL SHARED_LIBRARY)
- set_target_properties(
- ${target}
- PROPERTIES
- VERSION ${OBS_VERSION_CANONICAL}
- SOVERSION ${OBS_VERSION_MAJOR}
- BUILD_RPATH "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}"
- INSTALL_RPATH "${OBS_LIBRARY_RPATH}"
- )
- install(
- TARGETS ${target}
- LIBRARY DESTINATION "${OBS_LIBRARY_DESTINATION}" COMPONENT Runtime
- PUBLIC_HEADER DESTINATION "${OBS_INCLUDE_DESTINATION}" COMPONENT Development EXCLUDE_FROM_ALL
- )
- add_custom_command(
- TARGET ${target}
- POST_BUILD
- COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}"
- COMMAND
- "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:${target}>"
- "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}/"
- COMMAND
- "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_SONAME_FILE:${target}>"
- "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}/"
- COMMENT "Copy ${target} to library directory (${OBS_LIBRARY_DESTINATION})"
- VERBATIM
- )
- if(target STREQUAL libobs OR target STREQUAL obs-frontend-api)
- install(
- FILES "$<TARGET_FILE_DIR:${target}>/$<TARGET_FILE_PREFIX:${target}>$<TARGET_FILE_BASE_NAME:${target}>.so.0"
- DESTINATION "${OBS_LIBRARY_DESTINATION}"
- )
- add_custom_command(
- TARGET ${target}
- POST_BUILD
- COMMAND
- "${CMAKE_COMMAND}" -E create_symlink
- "$<TARGET_FILE_PREFIX:${target}>$<TARGET_FILE_BASE_NAME:${target}>.so.${OBS_VERSION_MAJOR}"
- "$<TARGET_FILE_PREFIX:${target}>$<TARGET_FILE_BASE_NAME:${target}>.so.0"
- COMMAND
- "${CMAKE_COMMAND}" -E copy_if_different
- "$<TARGET_FILE_DIR:${target}>/$<TARGET_FILE_PREFIX:${target}>$<TARGET_FILE_BASE_NAME:${target}>.so.0"
- "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}"
- COMMENT "Create symlink for legacy ${target}"
- )
- endif()
- elseif(target_type STREQUAL MODULE_LIBRARY)
- if(target STREQUAL obs-browser)
- set_target_properties(${target} PROPERTIES VERSION 0 SOVERSION ${OBS_VERSION_MAJOR})
- else()
- set_target_properties(
- ${target}
- PROPERTIES
- VERSION 0
- SOVERSION ${OBS_VERSION_MAJOR}
- BUILD_RPATH "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_LIBRARY_DESTINATION}"
- INSTALL_RPATH "${OBS_MODULE_RPATH}"
- )
- endif()
- if(${target} STREQUAL obspython OR ${target} STREQUAL obslua)
- set(plugin_destination "${OBS_SCRIPT_PLUGIN_DESTINATION}")
- set_property(TARGET ${target} PROPERTY INSTALL_RPATH "$ORIGIN/;$ORIGIN/..")
- else()
- set(plugin_destination "${OBS_PLUGIN_DESTINATION}")
- endif()
- install(
- TARGETS ${target}
- LIBRARY DESTINATION "${plugin_destination}" COMPONENT Runtime NAMELINK_COMPONENT Development
- )
- add_custom_command(
- TARGET ${target}
- POST_BUILD
- COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${plugin_destination}"
- COMMAND
- "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:${target}>"
- "${OBS_OUTPUT_DIR}/$<CONFIG>/${plugin_destination}"
- COMMENT "Copy ${target} to plugin directory (${plugin_destination})"
- VERBATIM
- )
- if(${target} STREQUAL obspython)
- add_custom_command(
- TARGET ${target}
- POST_BUILD
- COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_SCRIPT_PLUGIN_DESTINATION}/"
- COMMAND
- "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE_DIR:obspython>/obspython.py"
- "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_SCRIPT_PLUGIN_DESTINATION}/"
- COMMENT "Add obspython import module"
- )
- install(
- FILES "$<TARGET_FILE_DIR:obspython>/obspython.py"
- DESTINATION "${OBS_SCRIPT_PLUGIN_DESTINATION}"
- COMPONENT Runtime
- )
- elseif(${target} STREQUAL obs-browser)
- message(DEBUG "Add Chromium Embedded Framework to project for obs-browser plugin...")
- if(TARGET CEF::Library)
- get_target_property(imported_location CEF::Library IMPORTED_LOCATION_RELEASE)
- if(imported_location)
- cmake_path(GET imported_location PARENT_PATH cef_location)
- cmake_path(GET cef_location PARENT_PATH cef_root_location)
- add_custom_command(
- TARGET ${target}
- POST_BUILD
- COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/"
- COMMAND
- "${CMAKE_COMMAND}" -E copy_if_different "${imported_location}" "${cef_location}/chrome-sandbox"
- "${cef_location}/libEGL.so" "${cef_location}/libGLESv2.so" "${cef_location}/libvk_swiftshader.so"
- "${cef_location}/libvulkan.so.1" "${cef_location}/snapshot_blob.bin"
- "${cef_location}/v8_context_snapshot.bin" "${cef_location}/vk_swiftshader_icd.json"
- "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/"
- COMMAND
- "${CMAKE_COMMAND}" -E copy_if_different "${cef_root_location}/Resources/chrome_100_percent.pak"
- "${cef_root_location}/Resources/chrome_200_percent.pak" "${cef_root_location}/Resources/icudtl.dat"
- "${cef_root_location}/Resources/resources.pak" "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/"
- COMMAND
- "${CMAKE_COMMAND}" -E copy_directory "${cef_root_location}/Resources/locales"
- "${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/locales"
- COMMENT "Add Chromium Embedded Framwork to library directory"
- )
- install(
- FILES
- "${imported_location}"
- "${cef_location}/chrome-sandbox"
- "${cef_location}/libEGL.so"
- "${cef_location}/libGLESv2.so"
- "${cef_location}/libvk_swiftshader.so"
- "${cef_location}/libvulkan.so.1"
- "${cef_location}/snapshot_blob.bin"
- "${cef_location}/v8_context_snapshot.bin"
- "${cef_location}/vk_swiftshader_icd.json"
- "${cef_root_location}/Resources/chrome_100_percent.pak"
- "${cef_root_location}/Resources/chrome_200_percent.pak"
- "${cef_root_location}/Resources/icudtl.dat"
- "${cef_root_location}/Resources/resources.pak"
- DESTINATION "${OBS_PLUGIN_DESTINATION}"
- COMPONENT Runtime
- )
- install(
- DIRECTORY "${cef_root_location}/Resources/locales"
- DESTINATION "${OBS_PLUGIN_DESTINATION}"
- USE_SOURCE_PERMISSIONS
- COMPONENT Runtime
- )
- endif()
- endif()
- endif()
- set_property(GLOBAL APPEND PROPERTY OBS_MODULES_ENABLED ${target})
- endif()
- target_install_resources(${target})
- endfunction()
- # Helper function to add resources into bundle
- function(target_install_resources target)
- message(DEBUG "Installing resources for target ${target}...")
- if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data")
- file(GLOB_RECURSE data_files "${CMAKE_CURRENT_SOURCE_DIR}/data/*")
- foreach(data_file IN LISTS data_files)
- cmake_path(
- RELATIVE_PATH
- data_file
- BASE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/"
- OUTPUT_VARIABLE relative_path
- )
- cmake_path(GET relative_path PARENT_PATH relative_path)
- target_sources(${target} PRIVATE "${data_file}")
- source_group("Resources/${relative_path}" FILES "${data_file}")
- endforeach()
- get_property(obs_module_list GLOBAL PROPERTY OBS_MODULES_ENABLED)
- if(target IN_LIST obs_module_list)
- set(target_destination "${OBS_DATA_DESTINATION}/obs-plugins/${target}")
- elseif(target STREQUAL obs)
- set(target_destination "${OBS_DATA_DESTINATION}/obs-studio")
- else()
- set(target_destination "${OBS_DATA_DESTINATION}/${target}")
- endif()
- install(
- DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/"
- DESTINATION "${target_destination}"
- USE_SOURCE_PERMISSIONS
- COMPONENT Runtime
- )
- add_custom_command(
- TARGET ${target}
- POST_BUILD
- COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}"
- COMMAND
- "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/data"
- "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}"
- COMMENT "Copy ${target} resources to data directory (${target_destination})"
- VERBATIM
- )
- endif()
- endfunction()
- # Helper function to add a specific resource to a bundle
- function(target_add_resource target resource)
- get_property(obs_module_list GLOBAL PROPERTY OBS_MODULES_ENABLED)
- if(${ARGN})
- set(target_destination "${ARGN}")
- elseif(${target} IN_LIST obs_module_list)
- set(target_destination "${OBS_DATA_DESTINATION}/obs-plugins/${target}")
- elseif(target STREQUAL obs)
- set(target_destination "${OBS_DATA_DESTINATION}/obs-studio")
- else()
- set(target_destination "${OBS_DATA_DESTINATION}/${target}")
- endif()
- message(DEBUG "Add resource ${resource} to target ${target} at destination ${target_destination}...")
- install(FILES "${resource}" DESTINATION "${target_destination}" COMPONENT Runtime)
- add_custom_command(
- TARGET ${target}
- POST_BUILD
- COMMAND "${CMAKE_COMMAND}" -E make_directory "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}/"
- COMMAND "${CMAKE_COMMAND}" -E copy "${resource}" "${OBS_OUTPUT_DIR}/$<CONFIG>/${target_destination}/"
- COMMENT "Copy ${target} resource ${resource} to library directory (${target_destination})"
- VERBATIM
- )
- endfunction()
- # target_export: Helper function to export target as CMake package
- function(target_export target)
- set(exclude_variant "")
- _target_export(${target})
- if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/linux/${target}.pc.in")
- message(DEBUG "Generating pkgconfig file ${target}.pc.in...")
- install(CODE "set(OBS_VERSION_CANONICAL ${OBS_VERSION_CANONICAL})" COMPONENT Development)
- install(CODE "set(CMAKE_C_STANDARD ${CMAKE_C_STANDARD})" COMPONENT Development)
- install(
- CODE
- "configure_file(\"${CMAKE_CURRENT_SOURCE_DIR}/cmake/linux/${target}.pc.in\" \"${CMAKE_CURRENT_BINARY_DIR}/${target}.pc\" @ONLY)"
- COMPONENT Development
- )
- install(
- FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}.pc"
- DESTINATION "${OBS_LIBRARY_DESTINATION}/pkgconfig"
- COMPONENT Development
- )
- endif()
- endfunction()
|