02_build_obs.sh 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #!/bin/bash
  2. ##############################################################################
  3. # macOS build function
  4. ##############################################################################
  5. #
  6. # This script file can be included in build scripts for macOS or run directly
  7. #
  8. ##############################################################################
  9. # Halt on errors
  10. set -eE
  11. build_obs() {
  12. status "Build OBS"
  13. trap "caught_error 'build app'" ERR
  14. if [ -z "${CI}" ]; then
  15. _backup_artifacts
  16. fi
  17. step "Configure OBS..."
  18. _configure_obs
  19. ensure_dir "${CHECKOUT_DIR}/"
  20. step "Build OBS targets..."
  21. cmake --build ${BUILD_DIR}
  22. }
  23. bundle_obs() {
  24. status "Create relocatable macOS application bundle"
  25. trap "caught_error 'package app'" ERR
  26. ensure_dir "${CHECKOUT_DIR}"
  27. step "Install OBS application bundle..."
  28. cmake --install ${BUILD_DIR}
  29. }
  30. # Function to configure OBS build
  31. _configure_obs() {
  32. if [ "${CODESIGN}" ]; then
  33. read_codesign_ident
  34. fi
  35. ensure_dir "${CHECKOUT_DIR}"
  36. status "Configure OBS build system..."
  37. trap "caught_error 'configure build'" ERR
  38. check_ccache
  39. if [ "${TWITCH_CLIENTID}" -a "${TWITCH_HASH}" ]; then
  40. TWITCH_OPTIONS="-DTWITCH_CLIENTID='${TWITCH_CLIENTID}' -DTWITCH_HASH='${TWITCH_HASH}'"
  41. fi
  42. if [ "${RESTREAM_CLIENTID}" -a "${RESTREAM_HASH}" ]; then
  43. RESTREAM_OPTIONS="-DRESTREAM_CLIENTID='${RESTREAM_CLIENTID}' -DRESTREAM_HASH='${RESTREAM_HASH}'"
  44. fi
  45. if [ "${YOUTUBE_CLIENTID}" -a "${YOUTUBE_CLIENTID_HASH}" -a "${YOUTUBE_SECRET}" -a "{YOUTUBE_SECRET_HASH}" ]; then
  46. YOUTUBE_OPTIONS="-DYOUTUBE_CLIENTID='${YOUTUBE_CLIENTID}' -DYOUTUBE_CLIENTID_HASH='${YOUTUBE_CLIENTID_HASH}' -DYOUTUBE_SECRET='${YOUTUBE_SECRET}' -DYOUTUBE_SECRET_HASH='${YOUTUBE_SECRET_HASH}'"
  47. fi
  48. if [ "${XCODE}" ]; then
  49. GENERATOR="Xcode"
  50. else
  51. GENERATOR="Ninja"
  52. fi
  53. if [ "${CI}" -a "${ARCH}" = "x86_64" ]; then
  54. UNITTEST_OPTIONS="-DENABLE_UNIT_TESTS=ON"
  55. fi
  56. cmake -S . -B ${BUILD_DIR} -G ${GENERATOR} \
  57. -DCEF_ROOT_DIR="${DEPS_BUILD_DIR}/cef_binary_${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}_macos_${ARCH:-x86_64}" \
  58. -DENABLE_BROWSER=ON \
  59. -DVLC_PATH="${DEPS_BUILD_DIR}/vlc-${VLC_VERSION:-${CI_VLC_VERSION}}" \
  60. -DENABLE_VLC=ON \
  61. -DCMAKE_PREFIX_PATH="${DEPS_BUILD_DIR}/obs-deps" \
  62. -DBROWSER_LEGACY=$(test "${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}" -le 3770 && echo "ON" || echo "OFF") \
  63. -DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-${CI_MACOSX_DEPLOYMENT_TARGET}} \
  64. -DCMAKE_OSX_ARCHITECTURES=${CMAKE_ARCHS} \
  65. -DOBS_CODESIGN_LINKER=${CODESIGN_LINKER:-OFF} \
  66. -DCMAKE_INSTALL_PREFIX=${BUILD_DIR}/install \
  67. -DCMAKE_BUILD_TYPE=${BUILD_CONFIG} \
  68. -DOBS_BUNDLE_CODESIGN_IDENTITY="${CODESIGN_IDENT:--}" \
  69. ${YOUTUBE_OPTIONS} \
  70. ${TWITCH_OPTIONS} \
  71. ${RESTREAM_OPTIONS} \
  72. ${UNITTEST_OPTIONS} \
  73. ${CI:+-DBUILD_FOR_DISTRIBUTION=${BUILD_FOR_DISTRIBUTION} -DOBS_BUILD_NUMBER=${GITHUB_RUN_ID}} \
  74. ${QUIET:+-Wno-deprecated -Wno-dev --log-level=ERROR}
  75. }
  76. # Function to backup previous build artifacts
  77. _backup_artifacts() {
  78. ensure_dir "${CHECKOUT_DIR}"
  79. if [ -d "${BUILD_DIR}" ]; then
  80. status "Backup old OBS build artifacts"
  81. CUR_DATE=$(/bin/date +"%Y-%m-%d@%H%M%S")
  82. NIGHTLY_DIR="${CHECKOUT_DIR}/nightly-${CUR_DATE}"
  83. PACKAGE_NAME=$(/usr/bin/find "${BUILD_DIR}" -name "*.dmg" -depth 1 | sort -rn | head -1)
  84. if [ -d "${BUILD_DIR}/install/OBS.app" ]; then
  85. step "Back up OBS.app..."
  86. ensure_dir "${NIGHTLY_DIR}"
  87. /bin/mv "${CHECKOUT_DIR}/${BUILD_DIR}/install/OBS.app" "${NIGHTLY_DIR}/"
  88. info "You can find OBS.app in ${NIGHTLY_DIR}"
  89. fi
  90. if [ "${PACKAGE_NAME}" ]; then
  91. step "Back up $(basename "${PACKAGE_NAME}")..."
  92. ensure_dir "${NIGHTLY_DIR}"
  93. /bin/mv "../${BUILD_DIR}/$(basename "${PACKAGE_NAME}")" "${NIGHTLY_DIR}/"
  94. info "You can find ${PACKAGE_NAME} in ${NIGHTLY_DIR}"
  95. fi
  96. fi
  97. }
  98. build-obs-standalone() {
  99. CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)"
  100. PRODUCT_NAME="OBS-Studio"
  101. DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies"
  102. source "${CHECKOUT_DIR}/CI/include/build_support.sh"
  103. source "${CHECKOUT_DIR}/CI/include/build_support_macos.sh"
  104. check_archs
  105. check_macos_version
  106. build_obs
  107. if [ "${BUNDLE}" ]; then
  108. bundle_obs
  109. fi
  110. }
  111. print_usage() {
  112. echo -e "Usage: ${0}\n" \
  113. "-h, --help : Print this help\n" \
  114. "-q, --quiet : Suppress most build process output\n" \
  115. "-v, --verbose : Enable more verbose build process output\n" \
  116. "-a, --architecture : Specify build architecture (default: x86_64, alternative: arm64)\n" \
  117. "-c, --codesign : Codesign OBS and all libraries (default: ad-hoc only)\n" \
  118. "-b, --bundle : Create relocatable OBS application bundle in build directory (default: build/install/OBS.app)\n" \
  119. "--xcode : Create Xcode build environment instead of Ninja\n" \
  120. "--build-dir : Specify alternative build directory (default: build)\n"
  121. }
  122. build-obs-main() {
  123. if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then
  124. while true; do
  125. case "${1}" in
  126. -h | --help ) print_usage; exit 0 ;;
  127. -q | --quiet ) export QUIET=TRUE; shift ;;
  128. -v | --verbose ) export VERBOSE=TRUE; shift ;;
  129. -a | --architecture ) ARCH="${2}"; shift 2 ;;
  130. -c | --codesign ) CODESIGN=TRUE; shift ;;
  131. -b | --bundle ) BUNDLE=TRUE; shift ;;
  132. --xcode ) XCODE=TRUE; shift ;;
  133. --build-dir ) BUILD_DIR="${2}"; shift 2 ;;
  134. -- ) shift; break ;;
  135. * ) break ;;
  136. esac
  137. done
  138. build-obs-standalone
  139. fi
  140. }
  141. build-obs-main $*