Skip to content

Commit

Permalink
CI: Update macOS build scripts to use new CMake presets
Browse files Browse the repository at this point in the history
  • Loading branch information
PatTheMav authored and RytoEX committed Mar 26, 2023
1 parent 349372b commit f0dee07
Show file tree
Hide file tree
Showing 9 changed files with 334 additions and 208 deletions.
16 changes: 1 addition & 15 deletions CI/build-macos.sh
Expand Up @@ -24,16 +24,6 @@
# -c, --codesign : Codesign OBS and all libraries
# (default: ad-hoc only)
# -n, --notarize : Notarize OBS (default: off)
# --xcode : Create Xcode build environment instead
# of Ninja
# --build-dir : Specify alternative build directory
# (default: build)"
# Environment Variables (optional):
#
# MACOS_DEPS_VERSION : Precompiled macOS dependencies version
# MACOS_CEF_BUILD_VERSION : Chromium Embedded Framework version
# VLC_VERSION : VLC version
# SPARKLE_VERSION : Sparkle Framework version
#
##############################################################################

Expand Down Expand Up @@ -70,9 +60,7 @@ print_usage() {
"-b, --bundle : Create relocatable application bundle (default: off)\n" \
"-p, --package : Create distributable disk image (default: off)\n" \
"-c, --codesign : Codesign OBS and all libraries (default: ad-hoc only)\n" \
"-n, --notarize : Notarize OBS (default: off)\n" \
"--xcode : Create Xcode build environment instead of Ninja\n" \
"--build-dir : Specify alternative build directory (default: build)\n"
"-n, --notarize : Notarize OBS (default: off)\n"
}

print_deprecation() {
Expand Down Expand Up @@ -101,8 +89,6 @@ obs-build-main() {
-c | --codesign ) CODESIGN=TRUE; shift ;;
-n | --notarize ) NOTARIZE=TRUE; PACKAGE=TRUE CODESIGN=TRUE; shift ;;
-b | --bundle ) BUNDLE=TRUE; shift ;;
--xcode ) XCODE=TRUE; shift ;;
--build-dir ) BUILD_DIR="${2}"; shift 2 ;;
-s ) print_deprecation ${1}; exit 1 ;;
-- ) shift; break ;;
* ) break ;;
Expand Down
3 changes: 2 additions & 1 deletion CI/check-cmake.sh
Expand Up @@ -36,7 +36,8 @@ if ! type cmake-format 2> /dev/null ; then
fi

find . -type d \( \
-path ./\*build -o \
-path ./.deps -o \
-path ./\*build\* -o \
-path ./deps/jansson -o \
-path ./plugins/decklink/\*/decklink-sdk -o \
-path ./plugins/enc-amf -o \
Expand Down
3 changes: 2 additions & 1 deletion CI/check-format.sh
Expand Up @@ -42,7 +42,8 @@ else
fi

find . -type d \( \
-path ./\*build -o \
-path ./.deps -o \
-path ./\*build\* -o \
-path ./cmake -o \
-path ./plugins/decklink/\*/decklink-sdk -o \
-path ./plugins/enc-amf -o \
Expand Down
1 change: 1 addition & 0 deletions CI/include/Brewfile
Expand Up @@ -2,3 +2,4 @@ brew "cmake"
brew "ccache"
brew "ninja"
brew "coreutils"
brew "xcbeautify"
41 changes: 8 additions & 33 deletions CI/include/build_support_macos.sh
Expand Up @@ -10,22 +10,6 @@

# Setup build environment
WORKFLOW_CONTENT=$(/bin/cat "${CI_WORKFLOW}")
CI_DEPS_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+DEPS_VERSION_MAC: '([0-9\-]+)'/\1/p")
CI_DEPS_HASH_X86_64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+DEPS_HASH_MAC_X86_64: '([0-9a-f]+)'/\1/p")
CI_DEPS_HASH_ARM64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+DEPS_HASH_MAC_ARM64: '([0-9a-f]+)'/\1/p")
CI_VLC_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+VLC_VERSION_MAC: '([0-9\.]+)'/\1/p")
CI_VLC_HASH=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+VLC_HASH_MAC: '([0-9a-f]+)'/\1/p")
CI_SPARKLE_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+SPARKLE_VERSION: '([0-9\.]+)'/\1/p")
CI_SPARKLE_HASH=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+SPARKLE_HASH: '([0-9a-f]+)'/\1/p")
CI_QT_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+QT_VERSION_MAC: '([0-9\.]+)'/\1/p" | /usr/bin/head -1)
CI_QT_HASH_X86_64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+QT_HASH_MAC_X86_64: '([0-9a-f]+)'/\1/p")
CI_QT_HASH_ARM64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+QT_HASH_MAC_ARM64: '([0-9a-f]+)'/\1/p")
CI_QT_HASH_UNIVERSAL=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+QT_HASH_MAC_UNIVERSAL: '([0-9a-f]+)'/\1/p")
CI_MACOSX_DEPLOYMENT_TARGET_X86_64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+MACOSX_DEPLOYMENT_TARGET_X86_64: '([0-9\.]+)'/\1/p")
CI_MACOSX_DEPLOYMENT_TARGET_ARM64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+MACOSX_DEPLOYMENT_TARGET_ARM64: '([0-9\.]+)'/\1/p")
CI_MACOS_CEF_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+CEF_BUILD_VERSION_MAC: '([0-9]+)'/\1/p")
CI_CEF_HASH_X86_64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+CEF_HASH_MAC_X86_64: '([0-9a-f]+)'/\1/p")
CI_CEF_HASH_ARM64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+CEF_HASH_MAC_ARM64: '([0-9a-f]+)'/\1/p")

MACOS_VERSION="$(/usr/bin/sw_vers -productVersion)"
MACOS_MAJOR="$(echo ${MACOS_VERSION} | /usr/bin/cut -d '.' -f 1)"
Expand All @@ -48,32 +32,23 @@ fi
## DEFINE UTILITIES ##
check_macos_version() {
ARCH="${ARCH:-${CURRENT_ARCH}}"
if [ "${ARCH}" = "x86_64" ]; then
CI_MACOSX_DEPLOYMENT_TARGET="${CI_MACOSX_DEPLOYMENT_TARGET_X86_64}"
CI_CEF_HASH="${CI_CEF_HASH_X86_64}"
CI_QT_HASH="${CI_QT_HASH_X86_64}"
CI_DEPS_HASH="${CI_DEPS_HASH_X86_64}"
elif [ "${ARCH}" = "arm64" ]; then
CI_MACOSX_DEPLOYMENT_TARGET="${CI_MACOSX_DEPLOYMENT_TARGET_ARM64}"
CI_CEF_HASH="${CI_CEF_HASH_ARM64}"
CI_QT_HASH="${CI_QT_HASH_ARM64}"
CI_DEPS_HASH="${CI_DEPS_HASH_ARM64}"
else
caught_error "Unsupported architecture '${ARCH}' provided"
fi

case "${ARCH}" in
x86_64) ;;
arm64) ;;
*) caught_error "Unsupported architecture '${ARCH}' provided" ;;
esac

step "Check macOS version..."
MIN_VERSION=${MACOSX_DEPLOYMENT_TARGET:-${CI_MACOSX_DEPLOYMENT_TARGET}}
MIN_VERSION="11.0"
MIN_MAJOR=$(echo ${MIN_VERSION} | /usr/bin/cut -d '.' -f 1)
MIN_MINOR=$(echo ${MIN_VERSION} | /usr/bin/cut -d '.' -f 2)

if [ "${MACOS_MAJOR}" -lt "11" -a "${MACOS_MINOR}" -lt "${MIN_MINOR}" ]; then
error "ERROR: Minimum required macOS version is ${MIN_VERSION}, but running on ${MACOS_VERSION}"
fi

if [ "${MACOS_MAJOR}" -ge "11" ]; then
export CODESIGN_LINKER="ON"
fi
export CODESIGN_LINKER="ON"
}

install_homebrew_deps() {
Expand Down
131 changes: 0 additions & 131 deletions CI/macos/01_install_dependencies.sh
Expand Up @@ -11,143 +11,12 @@
# Halt on errors
set -eE

install_obs-deps() {
status "Set up precompiled macOS OBS dependencies v${1}"
ensure_dir "${DEPS_BUILD_DIR}"
step "Download..."
check_and_fetch "https://github.com/obsproject/obs-deps/releases/download/${1}/macos-deps-${1}-${ARCH:-x86_64}.tar.xz" "${2}"
mkdir -p obs-deps
step "Unpack..."
/usr/bin/tar -xf "./macos-deps-${1}-${ARCH:-x86_64}.tar.xz" -C ./obs-deps
/usr/bin/xattr -r -d com.apple.quarantine ./obs-deps
}

install_qt-deps() {
status "Set up precompiled dependency Qt v${1}"
ensure_dir "${DEPS_BUILD_DIR}"
step "Download..."

if [[ -n ${CI} ]]; then
_ARCH='universal'
_HASH=${CI_QT_HASH_UNIVERSAL}
else
_ARCH="${ARCH:-x86_64}"
_HASH="${2}"
fi

check_and_fetch "https://github.com/obsproject/obs-deps/releases/download/${1}/macos-deps-qt6-${1}-${_ARCH}.tar.xz" "${_HASH}"
mkdir -p obs-deps
step "Unpack..."
/usr/bin/tar -xf "./macos-deps-qt6-${1}-${_ARCH}.tar.xz" -C ./obs-deps
/usr/bin/xattr -r -d com.apple.quarantine ./obs-deps
}

install_vlc() {
status "Set up dependency VLC v${1}"
ensure_dir "${DEPS_BUILD_DIR}"
unset _SKIP

if [ "${CI}" -a "${RESTORED_VLC}" ]; then
_SKIP=TRUE
elif [ -d "${DEPS_BUILD_DIR}/vlc-${1}" -a -f "${DEPS_BUILD_DIR}/vlc-${1}/include/vlc/vlc.h" ]; then
_SKIP=TRUE
fi

if [ -z "${_SKIP}" ]; then
step "Download..."
check_and_fetch "https://downloads.videolan.org/vlc/${1}/vlc-${1}.tar.xz" "${2}"
step "Unpack..."
/usr/bin/tar -xf vlc-${1}.tar.xz
else
step "Found existing VLC..."
fi
}

install_sparkle() {
status "Set up dependency Sparkle v${1}"
ensure_dir "${DEPS_BUILD_DIR}"
unset _SKIP

if [ "${CI}" -a "${RESTORED_SPARKLE}" ]; then
_SKIP=TRUE
elif [ -d "${DEPS_BUILD_DIR}/obs-deps/lib/Sparkle.framework" -a -f "${DEPS_BUILD_DIR}/obs-deps/lib/Sparkle.framework/Sparkle" ]; then
_SKIP=TRUE
fi

if [ -z "${_SKIP}" ]; then
step "Download..."
check_and_fetch "https://github.com/sparkle-project/Sparkle/releases/download/${1}/Sparkle-${1}.tar.xz" "${2}"
step "Unpack..."
ensure_dir "${DEPS_BUILD_DIR}/sparkle"
/usr/bin/tar -xf ../Sparkle-${1}.tar.xz
cp -cpR "${DEPS_BUILD_DIR}"/sparkle/Sparkle.framework "${DEPS_BUILD_DIR}"/obs-deps/lib/
else
step "Found existing Sparkle Framework..."
fi
}

install_cef() {
status "Set up dependency CEF v${1}"
ensure_dir "${DEPS_BUILD_DIR}"
unset _SKIP

if [ "${CI}" -a "${RESTORED_CEF}" ]; then
_SKIP=TRUE
elif [ -d "${DEPS_BUILD_DIR}/cef_binary_${1}_macos_${ARCH:-x86_64}" -a -f "${DEPS_BUILD_DIR}/cef_binary_${1}_macos_${ARCH:-x86_64}/build/libcef_dll_wrapper/libcef_dll_wrapper.a" ]; then
_SKIP=TRUE
fi

if [ -z "${_SKIP}" ]; then
step "Download..."
check_and_fetch "https://cdn-fastly.obsproject.com/downloads/cef_binary_${1}_macos_${ARCH:-x86_64}.tar.xz" "${2}"
step "Unpack..."
/usr/bin/tar -xf cef_binary_${1}_macos_${ARCH:-x86_64}.tar.xz
cd cef_binary_${1}_macos_${ARCH:-x86_64}
step "Fix tests..."

/usr/bin/sed -i '.orig' '/add_subdirectory(tests\/ceftests)/d' ./CMakeLists.txt
/usr/bin/sed -E -i '' 's/"10.(9|10|11)"/"'${MACOSX_DEPLOYMENT_TARGET:-${CI_MACOSX_DEPLOYMENT_TARGET}}'"/' ./cmake/cef_variables.cmake

step "Run CMake..."
check_ccache
cmake ${CCACHE_OPTIONS} ${QUIET:+-Wno-deprecated -Wno-dev --log-level=ERROR} \
-S . -B build \
-G Ninja \
-DPROJECT_ARCH=${CMAKE_ARCHS:-x86_64} \
-DCEF_COMPILER_FLAGS="-Wno-deprecated-copy" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS="-std=c++11 -stdlib=libc++ -Wno-deprecated-declarations -Wno-unknown-warning-option" \
-DCMAKE_EXE_LINKER_FLAGS="-std=c++11 -stdlib=libc++" \
-DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-${CI_MACOSX_DEPLOYMENT_TARGET}}

step "Build CEF v${1}..."
cmake --build build
mkdir -p build/libcef_dll
else
step "Found existing Chromium Embedded Framework and loader library..."
fi
}

install_dependencies() {
status "Install Homebrew dependencies"
trap "caught_error 'install_dependencies'" ERR

BUILD_DEPS=(
"obs-deps ${MACOS_DEPS_VERSION:-${CI_DEPS_VERSION}} ${MACOS_DEPS_HASH:-${CI_DEPS_HASH}}"
"qt-deps ${MACOS_DEPS_VERSION:-${CI_DEPS_VERSION}} ${QT_HASH:-${CI_QT_HASH}}"
"cef ${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}} ${CEF_HASH:-${CI_CEF_HASH}}"
"vlc ${VLC_VERSION:-${CI_VLC_VERSION}} ${VLC_HASH:-${CI_VLC_HASH}}"
"sparkle ${SPARKLE_VERSION:-${CI_SPARKLE_VERSION}} ${SPARKLE_HASH:-${CI_SPARKLE_HASH}}"
)

install_homebrew_deps

for DEPENDENCY in "${BUILD_DEPS[@]}"; do
set -- ${DEPENDENCY}
trap "caught_error ${DEPENDENCY}" ERR
FUNC_NAME="install_${1}"
${FUNC_NAME} ${2} ${3} ${4}
done
}

install-dependencies-standalone() {
Expand Down
63 changes: 38 additions & 25 deletions CI/macos/02_build_obs.sh
Expand Up @@ -23,7 +23,16 @@ build_obs() {

ensure_dir "${CHECKOUT_DIR}/"
step "Build OBS targets..."
cmake --build ${BUILD_DIR}

if [ "${PRESET}" != "macos-ci-${ARCH}" ]; then
export NSUnbufferedIO=YES

set -o pipefail && cmake --build --preset macos-${ARCH} --parallel 2>&1 | xcbeautify

unset NSUnbufferedIO
else
cmake --build --preset macos-${ARCH}
fi
}

bundle_obs() {
Expand All @@ -33,7 +42,8 @@ bundle_obs() {
ensure_dir "${CHECKOUT_DIR}"

step "Install OBS application bundle..."
cmake --install ${BUILD_DIR}

find "build_${ARCH}/UI/${BUILD_CONFIG}" -type d -name "OBS.app" | xargs -I{} cp -r {} "build_${ARCH}"/
}

# Function to configure OBS build
Expand All @@ -59,34 +69,41 @@ _configure_obs() {
YOUTUBE_OPTIONS="-DYOUTUBE_CLIENTID='${YOUTUBE_CLIENTID}' -DYOUTUBE_CLIENTID_HASH='${YOUTUBE_CLIENTID_HASH}' -DYOUTUBE_SECRET='${YOUTUBE_SECRET}' -DYOUTUBE_SECRET_HASH='${YOUTUBE_SECRET_HASH}'"
fi

if [ "${XCODE}" ]; then
GENERATOR="Xcode"
else
GENERATOR="Ninja"
fi

if [ "${SPARKLE_APPCAST_URL}" -a "${SPARKLE_PUBLIC_KEY}" ]; then
SPARKLE_OPTIONS="-DSPARKLE_APPCAST_URL=\"${SPARKLE_APPCAST_URL}\" -DSPARKLE_PUBLIC_KEY=\"${SPARKLE_PUBLIC_KEY}\""
fi

cmake -S . -B ${BUILD_DIR} -G ${GENERATOR} \
-DCEF_ROOT_DIR="${DEPS_BUILD_DIR}/cef_binary_${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}_macos_${ARCH:-x86_64}" \
-DENABLE_BROWSER=ON \
-DVLC_PATH="${DEPS_BUILD_DIR}/vlc-${VLC_VERSION:-${CI_VLC_VERSION}}" \
-DENABLE_VLC=ON \
-DCMAKE_PREFIX_PATH="${DEPS_BUILD_DIR}/obs-deps" \
-DBROWSER_LEGACY=$(test "${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}" -le 3770 && echo "ON" || echo "OFF") \
-DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-${CI_MACOSX_DEPLOYMENT_TARGET}} \
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_ARCHS} \
-DOBS_CODESIGN_LINKER=${CODESIGN_LINKER:-OFF} \
PRESET="macos-${ARCH}"

if [ "${CI}" ]; then
case "${GITHUB_EVENT_NAME}" in
schedule) PRESET="macos-${ARCH}" ;;
push)
if [ "${GITHUB_REF_TYPE}" == 'tag' ]; then
PRESET="macos-release-${ARCH}"
else
PRESET="macos-ci-${ARCH}"
fi
;;
pull_request)
if [ "${SEEKING_TESTERS}" == '1' ]; then
PRESET="macos-${ARCH}"
else
PRESET="macos-ci-${ARCH}"
fi
;;
*) PRESET="macos-ci-${ARCH}" ;;
esac
fi

cmake -S . --preset ${PRESET} \
-DCMAKE_INSTALL_PREFIX=${BUILD_DIR}/install \
-DCMAKE_BUILD_TYPE=${BUILD_CONFIG} \
-DOBS_BUNDLE_CODESIGN_IDENTITY="${CODESIGN_IDENT:--}" \
-DOBS_CODESIGN_IDENTITY="${CODESIGN_IDENT:--}" \
${YOUTUBE_OPTIONS} \
${TWITCH_OPTIONS} \
${RESTREAM_OPTIONS} \
${SPARKLE_OPTIONS} \
${CI:+-DBUILD_FOR_DISTRIBUTION=${BUILD_FOR_DISTRIBUTION} -DOBS_BUILD_NUMBER=${GITHUB_RUN_ID}} \
${QUIET:+-Wno-deprecated -Wno-dev --log-level=ERROR}
}

Expand Down Expand Up @@ -139,9 +156,7 @@ print_usage() {
"-v, --verbose : Enable more verbose build process output\n" \
"-a, --architecture : Specify build architecture (default: x86_64, alternative: arm64)\n" \
"-c, --codesign : Codesign OBS and all libraries (default: ad-hoc only)\n" \
"-b, --bundle : Create relocatable OBS application bundle in build directory (default: build/install/OBS.app)\n" \
"--xcode : Create Xcode build environment instead of Ninja\n" \
"--build-dir : Specify alternative build directory (default: build)\n"
"-b, --bundle : Create relocatable OBS application bundle in build directory (default: build/install/OBS.app)\n"
}

build-obs-main() {
Expand All @@ -154,8 +169,6 @@ build-obs-main() {
-a | --architecture ) ARCH="${2}"; shift 2 ;;
-c | --codesign ) CODESIGN=TRUE; shift ;;
-b | --bundle ) BUNDLE=TRUE; shift ;;
--xcode ) XCODE=TRUE; shift ;;
--build-dir ) BUILD_DIR="${2}"; shift 2 ;;
-- ) shift; break ;;
* ) break ;;
esac
Expand Down
8 changes: 6 additions & 2 deletions CI/macos/03_package_obs.sh
Expand Up @@ -24,9 +24,13 @@ package_obs() {
ensure_dir "${CHECKOUT_DIR}"

step "Package OBS..."
cmake --build ${BUILD_DIR} -t package
BUILD_DIR="build_${ARCH}"

DMG_NAME=$(/usr/bin/find "${BUILD_DIR}" -type f -name "OBS-*.dmg" -depth 1 | sort -rn | head -1)
pushd "${BUILD_DIR}" > /dev/null > /dev/null
cpack -C ${BUILD_CONFIG:-RelWithDebInfo}
popd > /dev/null

DMG_NAME=$(/usr/bin/find "${BUILD_DIR}" -type f -name "obs-studio-*.dmg" -depth 1 | sort -rn | head -1)

if [ "${DMG_NAME}" ]; then
mv "${DMG_NAME}" "${BUILD_DIR}/${FILE_NAME}"
Expand Down

0 comments on commit f0dee07

Please sign in to comment.