diff --git a/CI/full-build-macos.sh b/CI/full-build-macos.sh index 87cc37a24..f5b46ba99 100755 --- a/CI/full-build-macos.sh +++ b/CI/full-build-macos.sh @@ -14,6 +14,7 @@ # # Parameters: # -b: Create macOS bundle +# -d: Skip dependency checks # -p: Create macOS distribution image # -n: Notarize macOS app and disk image (implies bundling) # -s: Skip the build process (useful for bundling/packaging only) @@ -24,6 +25,7 @@ # CEF_BUILD_VERSION : Chromium Embedded Framework version # VLC_VERISON : VLC version # SPARKLE_VERSION : Sparke Framework version +# BUILD_DIR : Alternative directory to build OBS in # ############################################################################## @@ -35,6 +37,7 @@ PRODUCT_NAME="OBS-Studio" CHECKOUT_DIR="$(git rev-parse --show-toplevel)" DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" +BUILD_DIR="${BUILD_DIR:-build}" CI_SCRIPTS="${CHECKOUT_DIR}/CI/scripts/macos" CI_WORKFLOW="${CHECKOUT_DIR}/.github/workflows/main.yml" CI_CEF_VERSION=$(cat ${CI_WORKFLOW} | sed -En "s/[ ]+CEF_BUILD_VERSION: '([0-9]+)'/\1/p") @@ -57,6 +60,10 @@ COLOR_BLUE=$(tput setaf 4) COLOR_ORANGE=$(tput setaf 3) COLOR_RESET=$(tput sgr0) +MACOS_VERSION="$(sw_vers -productVersion)" +MACOS_MAJOR="$(echo ${MACOS_VERSION} | cut -d '.' -f 1)" +MACOS_MINOR="$(echo ${MACOS_VERSION} | cut -d '.' -f 2)" + ## DEFINE UTILITIES ## hr() { @@ -84,7 +91,7 @@ ensure_dir() { } cleanup() { - rm -rf "${CHECKOUT_DIR}/build/settings.json" + rm -rf "${CHECKOUT_DIR}/${BUILD_DIR}/settings.json" unset CODESIGN_IDENT unset CODESIGN_IDENT_USER unset CODESIGN_IDENT_PASS @@ -105,6 +112,20 @@ install_homebrew_deps() { brew update brew bundle --file ${CI_SCRIPTS}/Brewfile + + check_curl +} + +check_curl() { + if [ "${MACOS_MAJOR}" -lt "11" ] && [ "${MACOS_MINOR}" -lt "15" ]; then + if [ ! -d /usr/local/opt/curl ]; then + step "Installing Homebrew curl.." + brew install curl + fi + export CURLCMD="/usr/local/opt/curl/bin/curl" + else + export CURLCMD="curl" + fi } check_ccache() { @@ -117,7 +138,7 @@ install_obs-deps() { hr "Setting up pre-built macOS OBS dependencies v${1}" ensure_dir ${DEPS_BUILD_DIR} step "Download..." - curl -s -L -C - -O https://github.com/obsproject/obs-deps/releases/download/${1}/macos-deps-${1}.tar.gz + ${CURLCMD} --progress-bar -L -C - -O https://github.com/obsproject/obs-deps/releases/download/${1}/macos-deps-${1}.tar.gz step "Unpack..." tar -xf ./macos-deps-${1}.tar.gz -C /tmp } @@ -126,7 +147,7 @@ install_qt-deps() { hr "Setting up pre-built dependency QT v${1}" ensure_dir ${DEPS_BUILD_DIR} step "Download..." - curl -s -L -C - -O https://github.com/obsproject/obs-deps/releases/download/${2}/macos-qt-${1}-${2}.tar.gz + ${CURLCMD} --progress-bar -L -C - -O https://github.com/obsproject/obs-deps/releases/download/${2}/macos-qt-${1}-${2}.tar.gz step "Unpack..." tar -xf ./macos-qt-${1}-${2}.tar.gz -C /tmp xattr -r -d com.apple.quarantine /tmp/obsdeps @@ -136,7 +157,7 @@ install_vlc() { hr "Setting up dependency VLC v${1}" ensure_dir ${DEPS_BUILD_DIR} step "Download..." - curl -s -L -C - -O https://downloads.videolan.org/vlc/${1}/vlc-${1}.tar.xz + ${CURLCMD} --progress-bar -L -C - -O https://downloads.videolan.org/vlc/${1}/vlc-${1}.tar.xz step "Unpack ..." tar -xf vlc-${1}.tar.xz } @@ -145,7 +166,7 @@ install_sparkle() { hr "Setting up dependency Sparkle v${1} (might prompt for password)" ensure_dir ${DEPS_BUILD_DIR}/sparkle step "Download..." - curl -s -L -C - -o sparkle.tar.bz2 https://github.com/sparkle-project/Sparkle/releases/download/${1}/Sparkle-${1}.tar.bz2 + ${CURLCMD} --progress-bar -L -C - -o sparkle.tar.bz2 https://github.com/sparkle-project/Sparkle/releases/download/${1}/Sparkle-${1}.tar.bz2 step "Unpack..." tar -xf ./sparkle.tar.bz2 step "Copy to destination..." @@ -160,7 +181,7 @@ install_cef() { hr "Building dependency CEF v${1}" ensure_dir ${DEPS_BUILD_DIR} step "Download..." - curl -s -L -C - -O https://obs-nightly.s3-us-west-2.amazonaws.com/cef_binary_${1}_macosx64.tar.bz2 + ${CURLCMD} --progress-bar -L -C - -O https://obs-nightly.s3-us-west-2.amazonaws.com/cef_binary_${1}_macosx64.tar.bz2 step "Unpack..." tar -xf ./cef_binary_${1}_macosx64.tar.bz2 cd ./cef_binary_${1}_macosx64 @@ -182,17 +203,6 @@ install_cef() { } ## CHECK AND INSTALL PACKAGING DEPENDENCIES ## -install_packages_app() { - if [ ! -d /Applications/Packages.app ]; then - hr "Installing Packages app" - ensure_dir ${DEPS_BUILD_DIR} - step "Download..." - curl -s -L -C - -O https://s3-us-west-2.amazonaws.com/obs-nightly/Packages.pkg - step "Install..." - sudo installer -pkg ./Packages.pkg -target / - fi -} - install_dmgbuild() { if ! exists dmgbuild; then if exists "pip3"; then @@ -210,7 +220,7 @@ install_dmgbuild() { ## OBS BUILD FROM SOURCE ## configure_obs_build() { - ensure_dir "${CHECKOUT_DIR}/build" + ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" CUR_DATE=$(date +"%Y-%m-%d@%H%M%S") NIGHTLY_DIR="${CHECKOUT_DIR}/nightly-${CUR_DATE}" @@ -218,17 +228,17 @@ configure_obs_build() { if [ -d ./OBS.app ]; then ensure_dir "${NIGHTLY_DIR}" - mv ../build/OBS.app . + mv ../${BUILD_DIR}/OBS.app . info "You can find OBS.app in ${NIGHTLY_DIR}" fi - ensure_dir "${CHECKOUT_DIR}/build" + ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" if ([ -n "${PACKAGE_NAME}" ] && [ -f ${PACKAGE_NAME} ]); then ensure_dir "${NIGHTLY_DIR}" - mv ../build/$(basename "${PACKAGE_NAME}") . + mv ../${BUILD_DIR}/$(basename "${PACKAGE_NAME}") . info "You can find ${PACKAGE_NAME} in ${NIGHTLY_DIR}" fi - ensure_dir "${CHECKOUT_DIR}/build" + ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" hr "Run CMAKE for OBS..." cmake -DENABLE_SPARKLE_UPDATER=ON \ @@ -248,14 +258,14 @@ configure_obs_build() { } run_obs_build() { - ensure_dir "${CHECKOUT_DIR}/build" + ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" hr "Build OBS..." make -j4 } ## OBS BUNDLE AS MACOS APPLICATION ## bundle_dylibs() { - ensure_dir "${CHECKOUT_DIR}/build" + ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" if [ ! -d ./OBS.app ]; then error "No OBS.app bundle found" @@ -265,7 +275,7 @@ bundle_dylibs() { hr "Bundle dylibs for macOS application" step "Run dylibBundler.." - ${CI_SCRIPTS}/app/dylibBundler -cd -of -a ./OBS.app -q -f \ + ${CI_SCRIPTS}/app/dylibbundler -cd -of -a ./OBS.app -q -f \ -s ./OBS.app/Contents/MacOS \ -s "${DEPS_BUILD_DIR}/sparkle/Sparkle.framework" \ -s ./rundir/RelWithDebInfo/bin/ \ @@ -306,7 +316,7 @@ bundle_dylibs() { } install_frameworks() { - ensure_dir "${CHECKOUT_DIR}/build" + ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" if [ ! -d ./OBS.app ]; then error "No OBS.app bundle found" @@ -320,7 +330,7 @@ install_frameworks() { } prepare_macos_bundle() { - ensure_dir "${CHECKOUT_DIR}/build" + ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" if [ ! -d ./rundir/RelWithDebInfo/bin ]; then error "No OBS build found" @@ -365,7 +375,7 @@ prepare_macos_bundle() { ## CREATE MACOS DISTRIBUTION AND INSTALLER IMAGE ## prepare_macos_image() { - ensure_dir "${CHECKOUT_DIR}/build" + ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" if [ ! -d ./OBS.app ]; then error "No OBS.app bundle found" @@ -435,7 +445,7 @@ read_codesign_pass() { codesign_bundle() { if [ ! -n "${CODESIGN_OBS}" ]; then step "Skipping application bundle code signing"; return; fi - ensure_dir "${CHECKOUT_DIR}/build" + ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" trap "caught_error 'code-signing app'" ERR if [ ! -d ./OBS.app ]; then @@ -475,7 +485,7 @@ codesign_bundle() { codesign_image() { if [ ! -n "${CODESIGN_OBS}" ]; then step "Skipping installer image code signing"; return; fi - ensure_dir "${CHECKOUT_DIR}/build" + ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" trap "caught_error 'code-signing image'" ERR if [ ! -f "${FILE_NAME}" ]; then @@ -499,18 +509,22 @@ codesign_image() { full-build-macos() { if [ -n "${SKIP_BUILD}" ]; then step "Skipping full build"; return; fi - hr "Installing Homebrew dependencies" - install_homebrew_deps + if [ ! -n "${SKIP_DEPS}" ]; then - for DEPENDENCY in "${BUILD_DEPS[@]}"; do - set -- ${DEPENDENCY} - trap "caught_error ${DEPENDENCY}" ERR - FUNC_NAME="install_${1}" - ${FUNC_NAME} ${2} ${3} - done + hr "Installing Homebrew dependencies" + install_homebrew_deps + + for DEPENDENCY in "${BUILD_DEPS[@]}"; do + set -- ${DEPENDENCY} + trap "caught_error ${DEPENDENCY}" ERR + FUNC_NAME="install_${1}" + ${FUNC_NAME} ${2} ${3} + done + + check_ccache + trap "caught_error 'cmake'" ERR + fi - check_ccache - trap "caught_error 'cmake'" ERR configure_obs_build run_obs_build } @@ -521,7 +535,6 @@ bundle_macos() { hr "Creating macOS app bundle" trap "caught_error 'bundle app'" ERR - install_packages_app ensure_dir ${CHECKOUT_DIR} prepare_macos_bundle } @@ -544,7 +557,7 @@ notarize_macos() { hr "Notarizing OBS for macOS" trap "caught_error 'notarizing app'" ERR - ensure_dir "${CHECKOUT_DIR}/build" + ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" if [ -f "${FILE_NAME}" ]; then NOTARIZE_TARGET="${FILE_NAME}" @@ -569,6 +582,7 @@ notarize_macos() { print_usage() { echo -e "full-build-macos.sh - Build helper script for OBS-Studio\n" echo -e "Usage: ${0}\n" \ + "-d: Skip dependency checks\n" \ "-b: Create macOS app bundle\n" \ "-c: Codesign macOS app bundle\n" \ "-p: Package macOS app into disk image\n" \ @@ -580,6 +594,7 @@ print_usage() { obs-build-main() { ensure_dir ${CHECKOUT_DIR} + step "Fetching OBS tags..." git fetch origin --tags GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) GIT_HASH=$(git rev-parse --short HEAD) @@ -600,9 +615,10 @@ obs-build-main() { # ########################################################################## - while getopts ":hsbnpc" OPTION; do + while getopts ":hdsbnpc" OPTION; do case ${OPTION} in h) print_usage ;; + d) SKIP_DEPS=1 ;; s) SKIP_BUILD=1 ;; b) BUNDLE_OBS=1 ;; n) CODESIGN_OBS=1; NOTARIZE_OBS=1 ;; @@ -622,4 +638,4 @@ obs-build-main() { cleanup } -obs-build-main $* +obs-build-main $* \ No newline at end of file