123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554 |
- # Set OS-specific constants in non-deprecated way
- include(GNUInstallDirs)
- if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
- include(ObsDefaults_macOS)
- set(OS_MACOS ON)
- set(OS_POSIX ON)
- elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|FreeBSD|OpenBSD")
- include(ObsDefaults_Linux)
- set(OS_POSIX ON)
- string(TOUPPER "${CMAKE_SYSTEM_NAME}" _SYSTEM_NAME_U)
- set(OS_${_SYSTEM_NAME_U} ON)
- elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
- include(ObsDefaults_Windows)
- set(OS_WINDOWS ON)
- set(OS_POSIX OFF)
- endif()
- # Create global property to hold list of activated modules
- set_property(GLOBAL PROPERTY OBS_MODULE_LIST "")
- # ##############################################################################
- # GLOBAL HELPER FUNCTIONS #
- # ##############################################################################
- # Helper function to set up runtime or library targets
- function(setup_binary_target target)
- # Set up installation paths for program install
- install(
- TARGETS ${target}
- RUNTIME DESTINATION ${OBS_EXECUTABLE_DESTINATION}
- COMPONENT ${target}_Runtime
- LIBRARY DESTINATION ${OBS_LIBRARY_DESTINATION}
- COMPONENT ${target}_Runtime
- NAMELINK_COMPONENT ${target}_Development
- ARCHIVE DESTINATION ${OBS_LIBRARY_DESTINATION}
- COMPONENT ${target}_Development
- PUBLIC_HEADER
- DESTINATION ${OBS_INCLUDE_DESTINATION}
- COMPONENT ${target}_Development
- EXCLUDE_FROM_ALL)
- # Set up installation paths for development rundir
- install(
- TARGETS ${target}
- RUNTIME DESTINATION ${OBS_EXECUTABLE_DESTINATION}
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL
- LIBRARY DESTINATION ${OBS_LIBRARY_DESTINATION}
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL
- PUBLIC_HEADER
- DESTINATION ${OBS_INCLUDE_DESTINATION}
- COMPONENT IGNORED
- EXCLUDE_FROM_ALL)
- add_custom_command(
- TARGET ${target}
- POST_BUILD
- COMMAND
- "${CMAKE_COMMAND}" --install .. --config $<CONFIG> --prefix
- ${OBS_OUTPUT_DIR}/$<CONFIG> --component obs_${target} >
- "$<IF:$<PLATFORM_ID:Windows>,nul,/dev/null>"
- COMMENT "Installing OBS rundir"
- VERBATIM)
- endfunction()
- # Helper function to set up OBS plugin targets
- function(setup_plugin_target target)
- set_target_properties(${target} PROPERTIES PREFIX "")
- install(
- TARGETS ${target}
- RUNTIME DESTINATION ${OBS_PLUGIN_DESTINATION} COMPONENT ${target}_Runtime
- LIBRARY DESTINATION ${OBS_PLUGIN_DESTINATION}
- COMPONENT ${target}_Runtime
- NAMELINK_COMPONENT ${target}_Development)
- install(
- TARGETS ${target}
- RUNTIME DESTINATION ${OBS_PLUGIN_DESTINATION}
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL
- LIBRARY DESTINATION ${OBS_PLUGIN_DESTINATION}
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL)
- setup_target_resources("${target}" "obs-plugins/${target}")
- set_property(GLOBAL APPEND PROPERTY OBS_MODULE_LIST "${target}")
- add_custom_command(
- TARGET ${target}
- POST_BUILD
- COMMAND
- "${CMAKE_COMMAND}" --install .. --config $<CONFIG> --prefix
- ${OBS_OUTPUT_DIR}/$<CONFIG> --component obs_${target} >
- "$<IF:$<PLATFORM_ID:Windows>,nul,/dev/null>"
- COMMENT "Installing ${target} to OBS rundir"
- VERBATIM)
- obs_status(ENABLED "${target}")
- endfunction()
- # Helper function to set up OBS scripting plugin targets
- function(setup_script_plugin_target target)
- set_target_properties(${target} PROPERTIES PREFIX "")
- install(
- TARGETS ${target}
- LIBRARY DESTINATION ${OBS_SCRIPT_PLUGIN_DESTINATION}
- COMPONENT ${target}_Runtime
- NAMELINK_COMPONENT ${target}_Development)
- install(
- TARGETS ${target}
- LIBRARY DESTINATION ${OBS_SCRIPT_PLUGIN_DESTINATION}
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL)
- if(${target} STREQUAL "obspython")
- install(
- FILES "$<TARGET_FILE_DIR:${target}>/$<TARGET_FILE_BASE_NAME:${target}>.py"
- DESTINATION ${OBS_SCRIPT_PLUGIN_DESTINATION}
- COMPONENT ${target}_Runtime)
- install(
- FILES "$<TARGET_FILE_DIR:${target}>/$<TARGET_FILE_BASE_NAME:${target}>.py"
- DESTINATION ${OBS_SCRIPT_PLUGIN_DESTINATION}
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL)
- endif()
- set_property(GLOBAL APPEND PROPERTY OBS_SCRIPTING_MODULE_LIST "${target}")
- add_custom_command(
- TARGET ${target}
- POST_BUILD
- COMMAND
- "${CMAKE_COMMAND}" --install .. --config $<CONFIG> --prefix
- ${OBS_OUTPUT_DIR}/$<CONFIG> --component obs_${target} >
- "$<IF:$<PLATFORM_ID:Windows>,nul,/dev/null>"
- COMMENT "Installing ${target} to OBS rundir"
- VERBATIM)
- obs_status(ENABLED "${target}")
- endfunction()
- # Helper function to set up target resources (e.g. L10N files)
- function(setup_target_resources target destination)
- if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data")
- install(
- DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data/
- DESTINATION ${OBS_DATA_DESTINATION}/${destination}
- USE_SOURCE_PERMISSIONS
- COMPONENT ${target}_Runtime)
- install(
- DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data/
- DESTINATION ${OBS_DATA_DESTINATION}/${destination}
- USE_SOURCE_PERMISSIONS
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL)
- endif()
- endfunction()
- # Helper function to set up specific resource files for targets
- function(add_target_resource target resource destination)
- install(
- FILES ${resource}
- DESTINATION ${OBS_DATA_DESTINATION}/${destination}
- COMPONENT ${target}_Runtime)
- install(
- FILES ${resource}
- DESTINATION ${OBS_DATA_DESTINATION}/${destination}
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL)
- endfunction()
- # Helper function to set up OBS app target
- function(setup_obs_app target)
- setup_binary_target(${target})
- get_property(OBS_MODULE_LIST GLOBAL PROPERTY OBS_MODULE_LIST)
- list(LENGTH OBS_MODULE_LIST _LEN)
- if(_LEN GREATER 0)
- add_dependencies(${target} ${OBS_MODULE_LIST})
- endif()
- get_property(OBS_SCRIPTING_MODULE_LIST GLOBAL
- PROPERTY OBS_SCRIPTING_MODULE_LIST)
- list(LENGTH OBS_SCRIPTING_MODULE_LIST _LEN)
- if(_LEN GREATER 0)
- add_dependencies(${target} ${OBS_SCRIPTING_MODULE_LIST})
- endif()
- # detect outdated obs-browser submodule
- if(NOT TARGET OBS::browser AND TARGET obs-browser)
- target_compile_features(obs-browser-page PRIVATE cxx_std_17)
- add_library(OBS::browser ALIAS obs-browser)
- if(NOT TARGET OBS::browser-panels AND BROWSER_PANEL_SUPPORT_ENABLED)
- add_library(OBS::browser-panels ALIAS obs-browser)
- endif()
- endif()
- if(TARGET OBS::browser)
- setup_target_browser(${target})
- endif()
- if(TARGET OBS::ffmpeg-mux)
- add_dependencies(${target} OBS::ffmpeg-mux)
- endif()
- add_custom_command(
- TARGET ${target}
- POST_BUILD
- COMMAND
- "${CMAKE_COMMAND}" --install .. --config $<CONFIG> --prefix
- ${OBS_OUTPUT_DIR}/$<CONFIG> --component obs_rundir >
- "$<IF:$<PLATFORM_ID:Windows>,nul,/dev/null>"
- COMMENT "Installing OBS rundir"
- VERBATIM)
- endfunction()
- # Helper function to do additional setup for browser source plugin
- function(setup_target_browser target)
- install(
- DIRECTORY ${CEF_ROOT_DIR}/Resources/
- DESTINATION ${OBS_PLUGIN_DESTINATION}
- COMPONENT ${target}_Runtime)
- install(
- DIRECTORY ${CEF_ROOT_DIR}/Release/
- DESTINATION ${OBS_PLUGIN_DESTINATION}
- COMPONENT ${target}_Runtime)
- install(
- DIRECTORY ${CEF_ROOT_DIR}/Resources/
- DESTINATION ${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}
- COMPONENT obs_rundir
- EXCLUDE_FROM_ALL)
- install(
- DIRECTORY ${CEF_ROOT_DIR}/Release/
- DESTINATION ${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}
- COMPONENT obs_rundir
- EXCLUDE_FROM_ALL)
- endfunction()
- # Helper function to export target to build and install tree. Allows usage of
- # `find_package(libobs)` by other build trees
- function(export_target target)
- set(CMAKE_EXPORT_PACKAGE_REGISTRY OFF)
- install(
- TARGETS ${target}
- EXPORT ${target}Targets
- RUNTIME DESTINATION ${OBS_EXECUTABLE_DESTINATION}
- COMPONENT obs_libraries
- EXCLUDE_FROM_ALL
- LIBRARY DESTINATION ${OBS_LIBRARY_DESTINATION}
- COMPONENT obs_libraries
- EXCLUDE_FROM_ALL
- ARCHIVE DESTINATION ${OBS_LIBRARY_DESTINATION}
- COMPONENT obs_libraries
- EXCLUDE_FROM_ALL
- INCLUDES
- DESTINATION ${OBS_INCLUDE_DESTINATION}
- PUBLIC_HEADER
- DESTINATION ${OBS_INCLUDE_DESTINATION}
- COMPONENT obs_libraries
- EXCLUDE_FROM_ALL)
- include(GenerateExportHeader)
- generate_export_header(${target} EXPORT_FILE_NAME
- ${CMAKE_CURRENT_BINARY_DIR}/${target}_EXPORT.h)
- target_sources(${target}
- PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/${target}_EXPORT.h)
- set(TARGETS_EXPORT_NAME "${target}Targets")
- include(CMakePackageConfigHelpers)
- configure_package_config_file(
- ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${target}Config.cmake.in
- ${CMAKE_CURRENT_BINARY_DIR}/${target}Config.cmake
- INSTALL_DESTINATION ${OBS_CMAKE_DESTINATION}/${target}
- PATH_VARS OBS_PLUGIN_DESTINATION OBS_DATA_DESTINATION)
- write_basic_package_version_file(
- ${CMAKE_CURRENT_BINARY_DIR}/${target}ConfigVersion.cmake
- VERSION ${OBS_VERSION_CANONICAL}
- COMPATIBILITY SameMajorVersion)
- export(
- EXPORT ${target}Targets
- FILE ${CMAKE_CURRENT_BINARY_DIR}/${TARGETS_EXPORT_NAME}.cmake
- NAMESPACE OBS::)
- export(PACKAGE "${target}")
- install(
- EXPORT ${TARGETS_EXPORT_NAME}
- FILE ${TARGETS_EXPORT_NAME}.cmake
- NAMESPACE OBS::
- DESTINATION ${OBS_CMAKE_DESTINATION}/${target}
- COMPONENT obs_libraries
- EXCLUDE_FROM_ALL)
- install(
- FILES ${CMAKE_CURRENT_BINARY_DIR}/${target}Config.cmake
- ${CMAKE_CURRENT_BINARY_DIR}/${target}ConfigVersion.cmake
- DESTINATION ${OBS_CMAKE_DESTINATION}/${target}
- COMPONENT obs_libraries
- EXCLUDE_FROM_ALL)
- endfunction()
- # Helper function to define available graphics modules for targets
- function(define_graphic_modules target)
- foreach(_GRAPHICS_API metal d3d11 opengl d3d9)
- string(TOUPPER ${_GRAPHICS_API} _GRAPHICS_API_u)
- if(TARGET OBS::libobs-${_GRAPHICS_API})
- if(OS_POSIX AND NOT LINUX_PORTABLE)
- target_compile_definitions(
- ${target}
- PRIVATE
- DL_${_GRAPHICS_API_u}="$<TARGET_SONAME_FILE_NAME:libobs-${_GRAPHICS_API}>"
- )
- else()
- target_compile_definitions(
- ${target}
- PRIVATE
- DL_${_GRAPHICS_API_u}="$<TARGET_FILE_NAME:libobs-${_GRAPHICS_API}>")
- endif()
- add_dependencies(${target} OBS::libobs-${_GRAPHICS_API})
- else()
- target_compile_definitions(${target} PRIVATE DL_${_GRAPHICS_API_u}="")
- endif()
- endforeach()
- endfunction()
- if(NOT QT_VERSION)
- set(QT_VERSION
- AUTO
- CACHE STRING "OBS Qt version [AUTO, 5, 6]" FORCE)
- set_property(CACHE QT_VERSION PROPERTY STRINGS AUTO 5 6)
- endif()
- macro(find_qt)
- set(multiValueArgs COMPONENTS COMPONENTS_WIN COMPONENTS_MAC COMPONENTS_LINUX)
- cmake_parse_arguments(FIND_QT "" "${oneValueArgs}" "${multiValueArgs}"
- ${ARGN})
- set(QT_NO_CREATE_VERSIONLESS_TARGETS ON)
- find_package(
- Qt5
- COMPONENTS Core
- QUIET)
- find_package(
- Qt6
- COMPONENTS Core
- QUIET)
- if(NOT _QT_VERSION AND QT_VERSION STREQUAL AUTO)
- if(TARGET Qt5::Core)
- set(_QT_VERSION
- 5
- CACHE INTERNAL "")
- elseif(TARGET Qt6::Core)
- set(_QT_VERSION
- 6
- CACHE INTERNAL "")
- endif()
- elseif(NOT _QT_VERSION)
- if(TARGET Qt${QT_VERSION}::Core)
- set(_QT_VERSION
- ${QT_VERSION}
- CACHE INTERNAL "")
- else()
- if(QT_VERSION EQUAL 6)
- set(FALLBACK_QT_VERSION 5)
- else()
- set(FALLBACK_QT_VERSION 6)
- endif()
- message(
- WARNING
- "Qt${QT_VERSION} was not found, falling back to Qt${FALLBACK_QT_VERSION}"
- )
- if(TARGET Qt${FALLBACK_QT_VERSION}::Core)
- set(_QT_VERSION
- ${FALLBACK_QT_VERSION}
- CACHE INTERNAL "")
- endif()
- endif()
- endif()
- set(QT_NO_CREATE_VERSIONLESS_TARGETS OFF)
- if(NOT _QT_VERSION)
- message(FATAL_ERROR "Neither Qt5 or Qt6 were found")
- endif()
- if(OS_WINDOWS)
- find_package(
- Qt${_QT_VERSION}
- COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_WIN}
- REQUIRED)
- elseif(OS_MACOS)
- find_package(
- Qt${_QT_VERSION}
- COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_MAC}
- REQUIRED)
- else()
- find_package(
- Qt${_QT_VERSION}
- COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_LINUX}
- REQUIRED)
- endif()
- list(APPEND FIND_QT_COMPONENTS "Core")
- if("Gui" IN_LIST FIND_QT_COMPONENTS_LINUX)
- list(APPEND FIND_QT_COMPONENTS_LINUX "GuiPrivate")
- endif()
- foreach(_COMPONENT IN LISTS FIND_QT_COMPONENTS FIND_QT_COMPONENTS_WIN
- FIND_QT_COMPONENTS_MAC FIND_QT_COMPONENTS_LINUX)
- if(NOT TARGET Qt::${_COMPONENT} AND TARGET Qt${_QT_VERSION}::${_COMPONENT})
- add_library(Qt::${_COMPONENT} INTERFACE IMPORTED)
- set_target_properties(
- Qt::${_COMPONENT} PROPERTIES INTERFACE_LINK_LIBRARIES
- "Qt${_QT_VERSION}::${_COMPONENT}")
- endif()
- endforeach()
- endmacro()
- # Idea adapted from: https://github.com/edsiper/cmake-options
- macro(set_option option value)
- set(${option}
- ${value}
- CACHE INTERNAL "")
- endmacro()
- function(obs_status status text)
- set(_OBS_STATUS_DISABLED "OBS: DISABLED ")
- set(_OBS_STATUS_ENABLED "OBS: ENABLED ")
- set(_OBS_STATUS "OBS: ")
- if(status STREQUAL "DISABLED")
- message(STATUS "${_OBS_STATUS_DISABLED}${text}")
- elseif(status STREQUAL "ENABLED")
- message(STATUS "${_OBS_STATUS_ENABLED}${text}")
- else()
- message(${status} "${_OBS_STATUS}${text}")
- endif()
- endfunction()
- if(OS_WINDOWS)
- include(ObsHelpers_Windows)
- elseif(OS_MACOS)
- include(ObsHelpers_macOS)
- elseif(OS_POSIX)
- include(ObsHelpers_Linux)
- endif()
- # ##############################################################################
- # LEGACY FALLBACKS #
- # ##############################################################################
- # Helper function to install OBS plugin with associated resource directory
- function(_install_obs_plugin_with_data target source)
- setup_plugin_target(${target})
- if(NOT ${source} STREQUAL "data"
- AND IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${source}"
- AND NOT OS_MACOS)
- install(
- DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${source}/
- DESTINATION ${OBS_DATA_DESTINATION}/obs-plugins/${target}
- USE_SOURCE_PERMISSIONS
- COMPONENT ${target}_Runtime)
- install(
- DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${source}/
- DESTINATION
- ${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_DATA_DESTINATION}/obs-plugins/${target}
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL)
- if(OS_WINDOWS AND DEFINED ENV{obsInstallerTempDir})
- install(
- DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${source}/
- DESTINATION
- $ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/obs-plugins/${target}
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL)
- endif()
- endif()
- endfunction()
- # Helper function to install OBS plugin
- function(_install_obs_plugin target)
- setup_plugin_target(${target})
- endfunction()
- # Helper function to install data for a target only
- function(_install_obs_datatarget target destination)
- install(
- TARGETS ${target}
- LIBRARY DESTINATION ${OBS_DATA_DESTINATION}/${destination}
- COMPONENT ${target}_Runtime
- NAMELINK_COMPONENT ${target}_Development
- RUNTIME DESTINATION ${OBS_DATA_DESTINATION}/${destination}
- COMPONENT ${target}_Runtime)
- install(
- TARGETS ${target}
- LIBRARY DESTINATION ${OBS_DATA_DESTINATION}/${destination}
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL
- RUNTIME DESTINATION ${OBS_DATA_DESTINATION}/${destination}
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL)
- if(OS_WINDOWS)
- if(MSVC)
- add_target_resource(${target} "$<TARGET_PDB_FILE:${target}>"
- "${destination}" OPTIONAL)
- endif()
- if(DEFINED ENV{obsInstallerTempDir})
- install(
- TARGETS ${target}
- RUNTIME
- DESTINATION
- $ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${destination}/$<TARGET_FILE_NAME:${target}>
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL
- LIBRARY
- DESTINATION
- $ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${destination}/$<TARGET_FILE_NAME:${target}>
- COMPONENT obs_${target}
- EXCLUDE_FROM_ALL)
- endif()
- endif()
- add_custom_command(
- TARGET ${target}
- POST_BUILD
- COMMAND
- "${CMAKE_COMMAND}" --install .. --config $<CONFIG> --prefix
- ${OBS_OUTPUT_DIR}/$<CONFIG> --component obs_${target} >
- "$<IF:$<PLATFORM_ID:Windows>,nul,/dev/null>"
- COMMENT "Installing ${target} to OBS rundir"
- VERBATIM)
- endfunction()
|