build_support_macos.sh 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #!/bin/bash
  2. ##############################################################################
  3. # macOS support functions
  4. ##############################################################################
  5. #
  6. # This script file can be included in build scripts for macOS.
  7. #
  8. ##############################################################################
  9. # Setup build environment
  10. WORKFLOW_CONTENT=$(/bin/cat "${CI_WORKFLOW}")
  11. CI_DEPS_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+DEPS_VERSION_MAC: '([0-9\-]+)'/\1/p")
  12. CI_DEPS_HASH_X86_64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+DEPS_HASH_MAC_X86_64: '([0-9a-f]+)'/\1/p")
  13. CI_DEPS_HASH_ARM64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+DEPS_HASH_MAC_ARM64: '([0-9a-f]+)'/\1/p")
  14. CI_VLC_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+VLC_VERSION_MAC: '([0-9\.]+)'/\1/p")
  15. CI_VLC_HASH=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+VLC_HASH_MAC: '([0-9a-f]+)'/\1/p")
  16. CI_SPARKLE_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+SPARKLE_VERSION: '([0-9\.]+)'/\1/p")
  17. CI_SPARKLE_HASH=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+SPARKLE_HASH: '([0-9a-f]+)'/\1/p")
  18. CI_QT_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+QT_VERSION_MAC: '([0-9\.]+)'/\1/p" | /usr/bin/head -1)
  19. CI_QT_HASH_X86_64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+QT_HASH_MAC_X86_64: '([0-9a-f]+)'/\1/p")
  20. CI_QT_HASH_ARM64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+QT_HASH_MAC_ARM64: '([0-9a-f]+)'/\1/p")
  21. CI_QT_HASH_UNIVERSAL=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+QT_HASH_MAC_UNIVERSAL: '([0-9a-f]+)'/\1/p")
  22. CI_MACOSX_DEPLOYMENT_TARGET_X86_64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+MACOSX_DEPLOYMENT_TARGET_X86_64: '([0-9\.]+)'/\1/p")
  23. CI_MACOSX_DEPLOYMENT_TARGET_ARM64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+MACOSX_DEPLOYMENT_TARGET_ARM64: '([0-9\.]+)'/\1/p")
  24. CI_MACOS_CEF_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+CEF_BUILD_VERSION_MAC: '([0-9]+)'/\1/p")
  25. CI_CEF_HASH_X86_64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+CEF_HASH_MAC_X86_64: '([0-9a-f]+)'/\1/p")
  26. CI_CEF_HASH_ARM64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+CEF_HASH_MAC_ARM64: '([0-9a-f]+)'/\1/p")
  27. MACOS_VERSION="$(/usr/bin/sw_vers -productVersion)"
  28. MACOS_MAJOR="$(echo ${MACOS_VERSION} | /usr/bin/cut -d '.' -f 1)"
  29. MACOS_MINOR="$(echo ${MACOS_VERSION} | /usr/bin/cut -d '.' -f 2)"
  30. if [ "${TERM-}" -a -z "${CI}" ]; then
  31. COLOR_RED=$(/usr/bin/tput setaf 1)
  32. COLOR_GREEN=$(/usr/bin/tput setaf 2)
  33. COLOR_BLUE=$(/usr/bin/tput setaf 4)
  34. COLOR_ORANGE=$(/usr/bin/tput setaf 3)
  35. COLOR_RESET=$(/usr/bin/tput sgr0)
  36. else
  37. COLOR_RED=""
  38. COLOR_GREEN=""
  39. COLOR_BLUE=""
  40. COLOR_ORANGE=""
  41. COLOR_RESET=""
  42. fi
  43. ## DEFINE UTILITIES ##
  44. check_macos_version() {
  45. ARCH="${ARCH:-${CURRENT_ARCH}}"
  46. if [ "${ARCH}" = "x86_64" ]; then
  47. CI_MACOSX_DEPLOYMENT_TARGET="${CI_MACOSX_DEPLOYMENT_TARGET_X86_64}"
  48. CI_CEF_HASH="${CI_CEF_HASH_X86_64}"
  49. CI_QT_HASH="${CI_QT_HASH_X86_64}"
  50. CI_DEPS_HASH="${CI_DEPS_HASH_X86_64}"
  51. elif [ "${ARCH}" = "arm64" ]; then
  52. CI_MACOSX_DEPLOYMENT_TARGET="${CI_MACOSX_DEPLOYMENT_TARGET_ARM64}"
  53. CI_CEF_HASH="${CI_CEF_HASH_ARM64}"
  54. CI_QT_HASH="${CI_QT_HASH_ARM64}"
  55. CI_DEPS_HASH="${CI_DEPS_HASH_ARM64}"
  56. else
  57. caught_error "Unsupported architecture '${ARCH}' provided"
  58. fi
  59. step "Check macOS version..."
  60. MIN_VERSION=${MACOSX_DEPLOYMENT_TARGET:-${CI_MACOSX_DEPLOYMENT_TARGET}}
  61. MIN_MAJOR=$(echo ${MIN_VERSION} | /usr/bin/cut -d '.' -f 1)
  62. MIN_MINOR=$(echo ${MIN_VERSION} | /usr/bin/cut -d '.' -f 2)
  63. if [ "${MACOS_MAJOR}" -lt "11" -a "${MACOS_MINOR}" -lt "${MIN_MINOR}" ]; then
  64. error "ERROR: Minimum required macOS version is ${MIN_VERSION}, but running on ${MACOS_VERSION}"
  65. fi
  66. if [ "${MACOS_MAJOR}" -ge "11" ]; then
  67. export CODESIGN_LINKER="ON"
  68. fi
  69. }
  70. install_homebrew_deps() {
  71. if ! exists brew; then
  72. caught_error "Homebrew not found - please install Homebrew (https://brew.sh)"
  73. fi
  74. brew bundle --file "${CHECKOUT_DIR}/CI/include/Brewfile" ${QUIET:+--quiet}
  75. check_curl
  76. }
  77. check_curl() {
  78. if [ "${MACOS_MAJOR}" -lt "11" -a "${MACOS_MINOR}" -lt "15" ]; then
  79. if [ ! -d /usr/local/opt/curl ]; then
  80. step "Install Homebrew curl..."
  81. brew install curl
  82. fi
  83. CURLCMD="/usr/local/opt/curl/bin/curl"
  84. else
  85. CURLCMD="curl"
  86. fi
  87. if [ "${CI}" -o "${QUIET}" ]; then
  88. export CURLCMD="${CURLCMD} --silent --show-error --location -O"
  89. else
  90. export CURLCMD="${CURLCMD} --progress-bar --location --continue-at - -O"
  91. fi
  92. }
  93. check_archs() {
  94. step "Check Architecture..."
  95. ARCH="${ARCH:-${CURRENT_ARCH}}"
  96. if [ "${ARCH}" = "universal" ]; then
  97. CMAKE_ARCHS="x86_64;arm64"
  98. elif [ "${ARCH}" != "x86_64" -a "${ARCH}" != "arm64" ]; then
  99. caught_error "Unsupported architecture '${ARCH}' provided"
  100. else
  101. CMAKE_ARCHS="${ARCH}"
  102. fi
  103. }
  104. _add_ccache_to_path() {
  105. if [ "${CMAKE_CCACHE_OPTIONS}" ]; then
  106. if [ "${CURRENT_ARCH}" == "arm64" ]; then
  107. PATH="/opt/homebrew/opt/ccache/libexec:${PATH}"
  108. else
  109. PATH="/usr/local/opt/ccache/libexec:${PATH}"
  110. fi
  111. status "Compiler Info:"
  112. local IFS=$'\n'
  113. for COMPILER_INFO in $(type cc c++ gcc g++ clang clang++ || true); do
  114. info "${COMPILER_INFO}"
  115. done
  116. fi
  117. }
  118. ## SET UP CODE SIGNING AND NOTARIZATION CREDENTIALS ##
  119. ##############################################################################
  120. # Apple Developer Identity needed:
  121. #
  122. # + Signing the code requires a developer identity in the system's keychain
  123. # + codesign will look up and find the identity automatically
  124. #
  125. ##############################################################################
  126. read_codesign_ident() {
  127. if [ -z "${CODESIGN_IDENT}" ]; then
  128. step "Set up code signing..."
  129. read -p "${COLOR_ORANGE} + Apple developer identity: ${COLOR_RESET}" CODESIGN_IDENT
  130. fi
  131. }
  132. ##############################################################################
  133. # Apple Developer credentials necessary:
  134. #
  135. # + Signing for distribution and notarization require an active Apple
  136. # Developer membership
  137. # + An Apple Development identity is needed for code signing
  138. # (i.e. 'Apple Development: YOUR APPLE ID (PROVIDER)')
  139. # + Your Apple developer ID is needed for notarization
  140. # + An app-specific password is necessary for notarization from CLI
  141. # + This password will be stored in your macOS keychain under the identifier
  142. # 'OBS-Codesign-Password' with access Apple's 'altool' only.
  143. ##############################################################################
  144. read_codesign_pass() {
  145. step "Set up notarization..."
  146. if [ -z "${CODESIGN_IDENT_USER}" ]; then
  147. read -p "${COLOR_ORANGE} + Apple account id: ${COLOR_RESET}" CODESIGN_IDENT_USER
  148. fi
  149. if [ -z "${CODESIGN_IDENT_PASS}" ]; then
  150. CODESIGN_IDENT_PASS=$(stty -echo; read -p "${COLOR_ORANGE} + Apple developer password: ${COLOR_RESET}" secret; stty echo; echo $secret)
  151. echo ""
  152. fi
  153. step "Update notarization keychain..."
  154. echo -n "${COLOR_ORANGE}"
  155. /usr/bin/xcrun altool --store-password-in-keychain-item "OBS-Codesign-Password" -u "${CODESIGN_IDENT_USER}" -p "${CODESIGN_IDENT_PASS}"
  156. echo -n "${COLOR_RESET}"
  157. CODESIGN_IDENT_SHORT=$(echo "${CODESIGN_IDENT}" | /usr/bin/sed -En "s/.+\((.+)\)/\1/p")
  158. }