02_build_obs.sh 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. if [ "${PRESET}" != "macos-ci-${ARCH}" ]; then
  22. export NSUnbufferedIO=YES
  23. : "${PACKAGE:=}"
  24. case "${GITHUB_EVENT_NAME}" in
  25. push) if [[ ${GITHUB_REF_NAME} =~ [0-9]+.[0-9]+.[0-9]+(-(rc|beta).+)? ]]; then PACKAGE=1; fi ;;
  26. pull_request) PACKAGE=1 ;;
  27. esac
  28. pushd "build_${ARCH}" > /dev/null
  29. if [[ "${PACKAGE}" && "${CODESIGN_IDENT:--}" != '-' ]]; then
  30. set -o pipefail && xcodebuild -archivePath "obs-studio.xcarchive" -scheme obs-studio -destination "generic/platform=macOS,name=Any Mac'" archive 2>&1 | xcbeautify
  31. set -o pipefail && xcodebuild -exportArchive -archivePath "obs-studio.xcarchive" -exportOptionsPlist "exportOptions.plist" -exportPath "." 2>&1 | xcbeautify
  32. else
  33. set -o pipefail && xcodebuild -scheme obs-studio -destination "generic/platform=macOS,name=Any Mac" -configuration RelWithDebInfo 2>&1 | xcbeautify
  34. mkdir OBS.app
  35. ditto UI/RelWithDebInfo/OBS.app OBS.app
  36. fi
  37. popd > /dev/null
  38. unset NSUnbufferedIO
  39. else
  40. cmake --build --preset macos-${ARCH}
  41. fi
  42. }
  43. bundle_obs() {
  44. status "Create relocatable macOS application bundle"
  45. trap "caught_error 'package app'" ERR
  46. ensure_dir "${CHECKOUT_DIR}"
  47. step "Install OBS application bundle..."
  48. find "build_${ARCH}/UI/${BUILD_CONFIG}" -type d -name "OBS.app" | xargs -I{} cp -r {} "build_${ARCH}"/
  49. }
  50. # Function to configure OBS build
  51. _configure_obs() {
  52. if [ "${CODESIGN}" ]; then
  53. read_codesign_ident
  54. fi
  55. ensure_dir "${CHECKOUT_DIR}"
  56. status "Configure OBS build system..."
  57. trap "caught_error 'configure build'" ERR
  58. check_ccache
  59. if [ "${TWITCH_CLIENTID}" -a "${TWITCH_HASH}" ]; then
  60. TWITCH_OPTIONS="-DTWITCH_CLIENTID='${TWITCH_CLIENTID}' -DTWITCH_HASH='${TWITCH_HASH}'"
  61. fi
  62. if [ "${RESTREAM_CLIENTID}" -a "${RESTREAM_HASH}" ]; then
  63. RESTREAM_OPTIONS="-DRESTREAM_CLIENTID='${RESTREAM_CLIENTID}' -DRESTREAM_HASH='${RESTREAM_HASH}'"
  64. fi
  65. if [ "${YOUTUBE_CLIENTID}" -a "${YOUTUBE_CLIENTID_HASH}" -a "${YOUTUBE_SECRET}" -a "{YOUTUBE_SECRET_HASH}" ]; then
  66. YOUTUBE_OPTIONS="-DYOUTUBE_CLIENTID='${YOUTUBE_CLIENTID}' -DYOUTUBE_CLIENTID_HASH='${YOUTUBE_CLIENTID_HASH}' -DYOUTUBE_SECRET='${YOUTUBE_SECRET}' -DYOUTUBE_SECRET_HASH='${YOUTUBE_SECRET_HASH}'"
  67. fi
  68. if [ "${SPARKLE_APPCAST_URL}" -a "${SPARKLE_PUBLIC_KEY}" ]; then
  69. SPARKLE_OPTIONS="-DSPARKLE_APPCAST_URL=\"${SPARKLE_APPCAST_URL}\" -DSPARKLE_PUBLIC_KEY=\"${SPARKLE_PUBLIC_KEY}\""
  70. fi
  71. PRESET="macos-${ARCH}"
  72. if [ "${CI}" ]; then
  73. case "${GITHUB_EVENT_NAME}" in
  74. schedule) PRESET="macos-${ARCH}" ;;
  75. push)
  76. if [ "${GITHUB_REF_TYPE}" == 'tag' ]; then
  77. PRESET="macos-release-${ARCH}"
  78. else
  79. PRESET="macos-ci-${ARCH}"
  80. fi
  81. ;;
  82. pull_request)
  83. if [ "${SEEKING_TESTERS}" == '1' ]; then
  84. PRESET="macos-${ARCH}"
  85. else
  86. PRESET="macos-ci-${ARCH}"
  87. fi
  88. ;;
  89. *) PRESET="macos-ci-${ARCH}" ;;
  90. esac
  91. fi
  92. cmake -S . --preset ${PRESET} \
  93. -DCMAKE_INSTALL_PREFIX=${BUILD_DIR}/install \
  94. -DCMAKE_BUILD_TYPE=${BUILD_CONFIG} \
  95. -DOBS_CODESIGN_IDENTITY="${CODESIGN_IDENT:--}" \
  96. ${YOUTUBE_OPTIONS} \
  97. ${TWITCH_OPTIONS} \
  98. ${RESTREAM_OPTIONS} \
  99. ${SPARKLE_OPTIONS} \
  100. ${QUIET:+-Wno-deprecated -Wno-dev --log-level=ERROR}
  101. }
  102. # Function to backup previous build artifacts
  103. _backup_artifacts() {
  104. ensure_dir "${CHECKOUT_DIR}"
  105. if [ -d "${BUILD_DIR}" ]; then
  106. status "Backup old OBS build artifacts"
  107. CUR_DATE=$(/bin/date +"%Y-%m-%d@%H%M%S")
  108. NIGHTLY_DIR="${CHECKOUT_DIR}/nightly-${CUR_DATE}"
  109. PACKAGE_NAME=$(/usr/bin/find "${BUILD_DIR}" -name "*.dmg" -depth 1 | sort -rn | head -1)
  110. if [ -d "${BUILD_DIR}/install/OBS.app" ]; then
  111. step "Back up OBS.app..."
  112. ensure_dir "${NIGHTLY_DIR}"
  113. /bin/mv "${CHECKOUT_DIR}/${BUILD_DIR}/install/OBS.app" "${NIGHTLY_DIR}/"
  114. info "You can find OBS.app in ${NIGHTLY_DIR}"
  115. fi
  116. if [ "${PACKAGE_NAME}" ]; then
  117. step "Back up $(basename "${PACKAGE_NAME}")..."
  118. ensure_dir "${NIGHTLY_DIR}"
  119. /bin/mv "../${BUILD_DIR}/$(basename "${PACKAGE_NAME}")" "${NIGHTLY_DIR}/"
  120. info "You can find ${PACKAGE_NAME} in ${NIGHTLY_DIR}"
  121. fi
  122. fi
  123. }
  124. build-obs-standalone() {
  125. CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)"
  126. PRODUCT_NAME="OBS-Studio"
  127. DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies"
  128. source "${CHECKOUT_DIR}/CI/include/build_support.sh"
  129. source "${CHECKOUT_DIR}/CI/include/build_support_macos.sh"
  130. check_archs
  131. check_macos_version
  132. build_obs
  133. if [ "${BUNDLE}" ]; then
  134. bundle_obs
  135. fi
  136. }
  137. print_usage() {
  138. echo -e "Usage: ${0}\n" \
  139. "-h, --help : Print this help\n" \
  140. "-q, --quiet : Suppress most build process output\n" \
  141. "-v, --verbose : Enable more verbose build process output\n" \
  142. "-a, --architecture : Specify build architecture (default: x86_64, alternative: arm64)\n" \
  143. "-c, --codesign : Codesign OBS and all libraries (default: ad-hoc only)\n" \
  144. "-b, --bundle : Create relocatable OBS application bundle in build directory (default: build/install/OBS.app)\n"
  145. }
  146. build-obs-main() {
  147. if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then
  148. while true; do
  149. case "${1}" in
  150. -h | --help ) print_usage; exit 0 ;;
  151. -q | --quiet ) export QUIET=TRUE; shift ;;
  152. -v | --verbose ) export VERBOSE=TRUE; shift ;;
  153. -a | --architecture ) ARCH="${2}"; shift 2 ;;
  154. -c | --codesign ) CODESIGN=TRUE; shift ;;
  155. -b | --bundle ) BUNDLE=TRUE; shift ;;
  156. -- ) shift; break ;;
  157. * ) break ;;
  158. esac
  159. done
  160. build-obs-standalone
  161. fi
  162. }
  163. build-obs-main $*