obs-studio/cmake/bundle/macOS/bundleutils.cmake

182 lines
6.4 KiB
CMake

if(POLICY CMP0007)
cmake_policy(SET CMP0007 NEW)
endif()
if(POLICY CMP0009)
cmake_policy(SET CMP0009 NEW)
endif()
if(POLICY CMP0011)
cmake_policy(SET CMP0011 NEW)
endif()
# Add additional search paths for dylibbundler
list(APPEND _FIXUP_BUNDLES
"-s \"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks\"")
list(APPEND _FIXUP_BUNDLES "-s \"${CMAKE_INSTALL_PREFIX}/lib\"")
list(APPEND _FIXUP_BUNDLES "-s \"${CMAKE_INSTALL_PREFIX}/Frameworks\"")
foreach(_PREFIX_PATH IN LISTS _DEPENDENCY_PREFIX)
list(APPEND _FIXUP_BUNDLES "-s \"${_PREFIX_PATH}/lib\"")
file(GLOB _DYLIBS "${_PREFIX_PATH}/lib/*.dylib")
file(
COPY ${_DYLIBS}
DESTINATION ${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks
FOLLOW_SYMLINK_CHAIN)
unset(_DYLIBS)
endforeach()
# Unlinked modules need to be supplied manually to dylibbundler
# Find all modules (plugin and standalone)
file(GLOB _OBS_PLUGINS
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/*.plugin")
file(GLOB _OBS_SCRIPTING_PLUGINS
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/*.so")
# Add modules to fixups
foreach(_OBS_PLUGIN IN LISTS _OBS_PLUGINS)
get_filename_component(PLUGIN_NAME "${_OBS_PLUGIN}" NAME_WLE)
list(APPEND _FIXUP_BUNDLES
"-x \"${_OBS_PLUGIN}/Contents/MacOS/${PLUGIN_NAME}\"")
endforeach()
if(EXISTS
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/MacOS/obs-ffmpeg-mux")
list(
APPEND
_FIXUP_BUNDLES
"-x \"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/MacOS/obs-ffmpeg-mux\""
)
endif()
# Add scripting modules to fixups
foreach(_OBS_PLUGIN IN LISTS _OBS_SCRIPTING_PLUGINS)
list(APPEND _FIXUP_BUNDLES "-x \"${_OBS_PLUGIN}\"")
endforeach()
# Run dylibbbundler
if(DEFINED ENV{VERBOSE})
set(_VERBOSE_FLAG "--verbose")
endif()
if(DEFINED ENV{QUIET})
set(_QUIET_FLAG "OUTPUT_QUIET")
endif()
list(REMOVE_DUPLICATES _FIXUP_BUNDLES)
string(REPLACE ";" " " _FIXUP_BUNDLES "${_FIXUP_BUNDLES}")
message(STATUS "OBS: Bundle linked libraries and dependencies")
execute_process(
COMMAND
/bin/sh -c
"${_BUNDLER_COMMAND} -a \"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}\" -cd -of -q -f ${_FIXUP_BUNDLES} ${_VERBOSE_FLAG}"
${_QUIET_FLAG})
# Find all dylibs, frameworks and other code elements inside bundle
file(GLOB _DYLIBS
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/*.dylib")
file(GLOB _FRAMEWORKS
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/*.framework")
file(GLOB_RECURSE _QT_PLUGINS
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/*.dylib")
if(EXISTS
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/MacOS/obs-ffmpeg-mux")
list(APPEND _OTHER_BINARIES
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/MacOS/obs-ffmpeg-mux")
endif()
if(EXISTS
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Resources/obs-mac-virtualcam.plugin"
)
list(
APPEND
_OTHER_BINARIES
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Resources/obs-mac-virtualcam.plugin"
)
endif()
# Create libobs symlink for legacy plugin support
execute_process(
COMMAND
/bin/sh -c
"cd \"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks\" && ln -fs libobs.framework/Versions/Current/libobs libobs.0.dylib && ln -fsv libobs.framework/Versions/Current/libobs libobs.dylib"
${_QUIET_FLAG})
# Python potentially leaves __pycache__ directories inside the bundle which will
# break codesigning
if(EXISTS "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/__pycache__")
file(REMOVE_RECURSE
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/__pycache__")
endif()
# Codesign all binaries inside-out
message(STATUS "OBS: Codesign dependencies")
if(EXISTS
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/Sparkle.framework"
)
execute_process(
COMMAND
/usr/bin/codesign --remove-signature
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app"
${_VERBOSE_FLAG} ${_QUIET_FLAG})
execute_process(
COMMAND
/usr/bin/codesign --force --sign "${_CODESIGN_IDENTITY}" --deep --options
runtime
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app"
${_VERBOSE_FLAG} ${_QUIET_FLAG})
endif()
if(EXISTS
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/Chromium Embedded Framework.framework"
)
set(CEF_HELPER_OUTPUT_NAME "OBS Helper")
set(CEF_HELPER_APP_SUFFIXES ":" " (GPU):.gpu" " (Plugin):.plugin"
" (Renderer):.renderer")
foreach(_SUFFIXES ${CEF_HELPER_APP_SUFFIXES})
string(REPLACE ":" ";" _SUFFIXES ${_SUFFIXES})
list(GET _SUFFIXES 0 _NAME_SUFFIX)
list(GET _SUFFIXES 1 _PLIST_SUFFIX)
set(_HELPER_OUTPUT_NAME "${CEF_HELPER_OUTPUT_NAME}${_NAME_SUFFIX}")
set(_HELPER_ENTITLEMENT_PLIST "entitlements-helper${_PLIST_SUFFIX}.plist")
execute_process(
COMMAND
/usr/bin/codesign --remove-signature
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/OBS Helper${_NAME_SUFFIX}.app"
${_VERBOSE_FLAG} ${_QUIET_FLAG})
execute_process(
COMMAND
/usr/bin/codesign --force --sign "${_CODESIGN_IDENTITY}" --deep
--options runtime --entitlements
"${_CODESIGN_ENTITLEMENTS}/entitlements-helper${_PLIST_SUFFIX}.plist"
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/OBS Helper${_NAME_SUFFIX}.app"
${_VERBOSE_FLAG} ${_QUIET_FLAG})
endforeach()
endif()
foreach(_DEPENDENCY IN LISTS _OTHER_BINARIES _DYLIBS _FRAMEWORKS _OBS_PLUGINS
_OBS_SCRIPTING_PLUGINS _QT_PLUGINS)
if(NOT IS_SYMLINK "${_DEPENDENCY}")
execute_process(COMMAND /usr/bin/codesign --remove-signature
"${_DEPENDENCY}" ${_VERBOSE_FLAG} ${_QUIET_FLAG})
execute_process(
COMMAND
/usr/bin/codesign --force --sign "${_CODESIGN_IDENTITY}" --options
runtime --entitlements "${_CODESIGN_ENTITLEMENTS}/entitlements.plist"
"${_DEPENDENCY}" ${_VERBOSE_FLAG} ${_QUIET_FLAG})
endif()
endforeach()
# Codesign main app
message(STATUS "OBS: Codesign main app")
execute_process(
COMMAND
/usr/bin/codesign --remove-signature
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}" ${_VERBOSE_FLAG} ${_QUIET_FLAG})
execute_process(
COMMAND
/usr/bin/codesign --force --sign "${_CODESIGN_IDENTITY}" --options runtime
--entitlements "${_CODESIGN_ENTITLEMENTS}/entitlements.plist"
"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}" ${_VERBOSE_FLAG} ${_QUIET_FLAG})