CI: Update macOS CLI build script

This commit is contained in:
PatTheMav 2020-08-19 15:24:00 +02:00
parent a4535915fe
commit 6895ffc8fa
No known key found for this signature in database
GPG key ID: F8BCC3052CE91D29

View file

@ -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 $*