bundleutils.cmake 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. if(POLICY CMP0007)
  2. cmake_policy(SET CMP0007 NEW)
  3. endif()
  4. if(POLICY CMP0009)
  5. cmake_policy(SET CMP0009 NEW)
  6. endif()
  7. if(POLICY CMP0011)
  8. cmake_policy(SET CMP0011 NEW)
  9. endif()
  10. # Add additional search paths for dylibbundler
  11. list(APPEND _FIXUP_BUNDLES "-s \"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks\"")
  12. list(APPEND _FIXUP_BUNDLES "-s \"${CMAKE_INSTALL_PREFIX}/lib\"")
  13. list(APPEND _FIXUP_BUNDLES "-s \"${CMAKE_INSTALL_PREFIX}/Frameworks\"")
  14. foreach(_PREFIX_PATH IN LISTS _DEPENDENCY_PREFIX)
  15. list(APPEND _FIXUP_BUNDLES "-s \"${_PREFIX_PATH}/lib\"")
  16. file(GLOB _DYLIBS "${_PREFIX_PATH}/lib/*.dylib")
  17. file(
  18. COPY ${_DYLIBS}
  19. DESTINATION ${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks
  20. FOLLOW_SYMLINK_CHAIN)
  21. unset(_DYLIBS)
  22. endforeach()
  23. # Unlinked modules need to be supplied manually to dylibbundler
  24. # Find all modules (plugin and standalone)
  25. file(GLOB _OBS_PLUGINS "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/*.plugin")
  26. file(GLOB _OBS_SCRIPTING_PLUGINS "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/*.so")
  27. # Add modules to fixups
  28. foreach(_OBS_PLUGIN IN LISTS _OBS_PLUGINS)
  29. get_filename_component(PLUGIN_NAME "${_OBS_PLUGIN}" NAME_WLE)
  30. list(APPEND _FIXUP_BUNDLES "-x \"${_OBS_PLUGIN}/Contents/MacOS/${PLUGIN_NAME}\"")
  31. endforeach()
  32. if(EXISTS "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/MacOS/obs-ffmpeg-mux")
  33. list(APPEND _FIXUP_BUNDLES "-x \"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/MacOS/obs-ffmpeg-mux\"")
  34. endif()
  35. # Add scripting modules to fixups
  36. foreach(_OBS_PLUGIN IN LISTS _OBS_SCRIPTING_PLUGINS)
  37. list(APPEND _FIXUP_BUNDLES "-x \"${_OBS_PLUGIN}\"")
  38. endforeach()
  39. # Run dylibbbundler
  40. if(DEFINED ENV{VERBOSE})
  41. set(_VERBOSE_FLAG "--verbose")
  42. endif()
  43. if(DEFINED ENV{QUIET})
  44. set(_QUIET_FLAG "OUTPUT_QUIET")
  45. endif()
  46. list(REMOVE_DUPLICATES _FIXUP_BUNDLES)
  47. string(REPLACE ";" " " _FIXUP_BUNDLES "${_FIXUP_BUNDLES}")
  48. message(STATUS "OBS: Bundle linked libraries and dependencies")
  49. execute_process(
  50. COMMAND
  51. /bin/sh -c
  52. "${_BUNDLER_COMMAND} -a \"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}\" -cd -of -q -f ${_FIXUP_BUNDLES} ${_VERBOSE_FLAG}"
  53. ${_QUIET_FLAG})
  54. # Find all dylibs, frameworks and other code elements inside bundle
  55. file(GLOB _DYLIBS "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/*.dylib")
  56. file(GLOB _FRAMEWORKS "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/*.framework")
  57. file(GLOB_RECURSE _QT_PLUGINS "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/*.dylib")
  58. if(EXISTS "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/MacOS/obs-ffmpeg-mux")
  59. list(APPEND _OTHER_BINARIES "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/MacOS/obs-ffmpeg-mux")
  60. endif()
  61. if(EXISTS "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Resources/obs-mac-virtualcam.plugin")
  62. list(APPEND _OTHER_BINARIES "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Resources/obs-mac-virtualcam.plugin")
  63. endif()
  64. # Create libobs symlink for legacy plugin support
  65. execute_process(
  66. COMMAND
  67. /bin/sh -c
  68. "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"
  69. ${_QUIET_FLAG})
  70. # Python potentially leaves __pycache__ directories inside the bundle which will break codesigning
  71. if(EXISTS "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/__pycache__")
  72. file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/__pycache__")
  73. endif()
  74. # Codesign all binaries inside-out
  75. message(STATUS "OBS: Codesign dependencies")
  76. if(EXISTS "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/Chromium Embedded Framework.framework")
  77. set(CEF_HELPER_OUTPUT_NAME "OBS Helper")
  78. set(CEF_HELPER_APP_SUFFIXES ":" " (GPU):.gpu" " (Plugin):.plugin" " (Renderer):.renderer")
  79. foreach(_SUFFIXES ${CEF_HELPER_APP_SUFFIXES})
  80. string(REPLACE ":" ";" _SUFFIXES ${_SUFFIXES})
  81. list(GET _SUFFIXES 0 _NAME_SUFFIX)
  82. list(GET _SUFFIXES 1 _PLIST_SUFFIX)
  83. set(_HELPER_OUTPUT_NAME "${CEF_HELPER_OUTPUT_NAME}${_NAME_SUFFIX}")
  84. set(_HELPER_ENTITLEMENT_PLIST "entitlements-helper${_PLIST_SUFFIX}.plist")
  85. execute_process(
  86. COMMAND
  87. /usr/bin/codesign --remove-signature
  88. "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/OBS Helper${_NAME_SUFFIX}.app" ${_VERBOSE_FLAG}
  89. ${_QUIET_FLAG})
  90. execute_process(
  91. COMMAND
  92. /usr/bin/codesign --force --sign "${_CODESIGN_IDENTITY}" --deep --options runtime --entitlements
  93. "${_CODESIGN_ENTITLEMENTS}/entitlements-helper${_PLIST_SUFFIX}.plist"
  94. "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/OBS Helper${_NAME_SUFFIX}.app" ${_VERBOSE_FLAG}
  95. ${_QUIET_FLAG})
  96. endforeach()
  97. endif()
  98. foreach(_DEPENDENCY IN LISTS _OTHER_BINARIES _DYLIBS _FRAMEWORKS _OBS_PLUGINS _OBS_SCRIPTING_PLUGINS _QT_PLUGINS)
  99. if(NOT IS_SYMLINK "${_DEPENDENCY}")
  100. execute_process(COMMAND /usr/bin/codesign --remove-signature "${_DEPENDENCY}" ${_VERBOSE_FLAG} ${_QUIET_FLAG})
  101. execute_process(
  102. COMMAND /usr/bin/codesign --force --sign "${_CODESIGN_IDENTITY}" --options runtime --entitlements
  103. "${_CODESIGN_ENTITLEMENTS}/entitlements.plist" "${_DEPENDENCY}" ${_VERBOSE_FLAG} ${_QUIET_FLAG})
  104. endif()
  105. endforeach()
  106. # Codesign main app
  107. message(STATUS "OBS: Codesign main app")
  108. execute_process(COMMAND /usr/bin/codesign --remove-signature "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}" ${_VERBOSE_FLAG}
  109. ${_QUIET_FLAG})
  110. execute_process(
  111. COMMAND
  112. /usr/bin/codesign --force --sign "${_CODESIGN_IDENTITY}" --options runtime --entitlements
  113. "${_CODESIGN_ENTITLEMENTS}/entitlements.plist" "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}" ${_VERBOSE_FLAG}
  114. ${_QUIET_FLAG})