浏览代码

CI: Update macOS build scripts

PatTheMav 3 年之前
父节点
当前提交
f8eea620da

+ 129 - 0
CI/build-macos.sh

@@ -0,0 +1,129 @@
+#!/bin/bash
+
+##############################################################################
+# macOS plugin build script
+##############################################################################
+#
+# This script contains all steps necessary to:
+#
+#   * Build libobs and obs-frontend-api with all required dependencies
+#   * Build your plugin
+#   * Create macOS module bundle
+#   * Create macOS plugin installer package
+#   * Notarize macOS plugin installer package
+#
+# Parameters:
+#   -h, --help                      : Print usage help
+#   -q, --quiet                     : Suppress most build process output
+#   -v, --verbose                   : Enable more verbose build process output
+#   -d, --skip-dependency-checks    : Skip dependency checks
+#   -p, --package                   : Create installer for plugin
+#   -c, --codesign                  : Codesign plugin and installer
+#   -n, --notarize                  : Notarize plugin installer
+#                                     (implies --codesign)
+#   -b, --build-dir                 : Specify alternative build directory
+#                                     (default: build)
+#
+# Environment Variables (optional):
+#   MACOS_DEPS_VERSION  : Pre-compiled macOS dependencies version
+#   QT_VERSION          : Pre-compiled Qt version
+#   OBS_VERSION         : OBS version
+#
+##############################################################################
+
+# Halt on errors
+set -eE
+
+## SET UP ENVIRONMENT ##
+_RUN_OBS_BUILD_SCRIPT=TRUE
+
+CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)"
+if [ -f "${CHECKOUT_DIR}/CI/include/build_environment.sh" ]; then
+    source "${CHECKOUT_DIR}/CI/include/build_environment.sh"
+fi
+PRODUCT_NAME="${PRODUCT_NAME:-obs-plugin}"
+DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies"
+OBS_BUILD_DIR="${CHECKOUT_DIR}/../obs-studio"
+source "${CHECKOUT_DIR}/CI/include/build_support.sh"
+source "${CHECKOUT_DIR}/CI/include/build_support_macos.sh"
+
+## DEPENDENCY INSTALLATION ##
+source "${CHECKOUT_DIR}/CI/macos/01_install_dependencies.sh"
+
+## OBS LIBRARY BUILD ##
+source "${CHECKOUT_DIR}/CI/macos/02_build_obs_libs.sh"
+
+## PLUGIN BUILD ##
+source "${CHECKOUT_DIR}/CI/macos/03_build_plugin.sh"
+
+## PLUGIN PACKAGE AND NOTARIZE ##
+source "${CHECKOUT_DIR}/CI/macos/04_package_plugin.sh"
+
+## MAIN SCRIPT FUNCTIONS ##
+print_usage() {
+    echo -e "build_macos.sh - Build script for ${PRODUCT_NAME}\n"
+    echo -e "Usage: ${0}\n" \
+        "-h, --help                     : Print this help\n" \
+        "-q, --quiet                    : Suppress most build process output\n" \
+        "-v, --verbose                  : Enable more verbose build process output\n" \
+        "-a, --architecture             : Specify build architecture (default: universal, alternative: x86_64, arm64)\n" \
+        "-d, --skip-dependency-checks   : Skip dependency checks\n" \
+        "-p, --package                  : Create installer for plugin\n" \
+        "-c, --codesign                 : Codesign plugin and installer\n" \
+        "-n, --notarize                 : Notarize plugin installer (implies --codesign)\n" \
+        "-b, --build-dir                : Specify alternative build directory (default: build)\n"
+}
+
+obs-build-main() {
+    while true; do
+        case "${1}" in
+            -h | --help ) print_usage; exit 0 ;;
+            -q | --quiet ) export QUIET=TRUE; shift ;;
+            -v | --verbose ) export VERBOSE=TRUE; shift ;;
+            -a | --architecture ) ARCH="${2}"; shift 2 ;;
+            -d | --skip-dependency-checks ) SKIP_DEP_CHECKS=TRUE; shift ;;
+            -p | --package ) PACKAGE=TRUE; shift ;;
+            -c | --codesign ) CODESIGN=TRUE; shift ;;
+            -n | --notarize ) NOTARIZE=TRUE; PACKAGE=TRUE CODESIGN=TRUE; shift ;;
+            -b | --build-dir ) BUILD_DIR="${2}"; shift 2 ;;
+            -- ) shift; break ;;
+            * ) break ;;
+        esac
+    done
+
+    ensure_dir "${CHECKOUT_DIR}"
+    check_macos_version
+    check_archs
+    step "Fetching version tags..."
+    /usr/bin/git fetch origin --tags
+    GIT_BRANCH=$(/usr/bin/git rev-parse --abbrev-ref HEAD)
+    GIT_HASH=$(/usr/bin/git rev-parse --short HEAD)
+    GIT_TAG=$(/usr/bin/git describe --tags --abbrev=0 2&>/dev/null || true)
+
+    if [ "${ARCH}" = "arm64" ]; then
+        FILE_NAME="${PRODUCT_NAME}-${GIT_TAG:-${PRODUCT_VERSION}}-${GIT_HASH}-macOS-Apple.pkg"
+    elif [ "${ARCH}" = "x86_64" ]; then
+        FILE_NAME="${PRODUCT_NAME}-${GIT_TAG:-${PRODUCT_VERSION}}-${GIT_HASH}-macOS-Intel.pkg"
+    else
+        FILE_NAME="${PRODUCT_NAME}-${GIT_TAG:-${PRODUCT_VERSION}}-${GIT_HASH}-macOS-Universal.pkg"
+    fi
+
+    if [ -z "${SKIP_DEP_CHECKS}" ]; then
+        install_dependencies
+    fi
+
+    build_obs_libs
+    build_obs_plugin
+
+    if [ -n "${PACKAGE}" ]; then
+        package_obs_plugin
+    fi
+
+    if [ -n "${NOTARIZE}" ]; then
+        notarize_obs_plugin
+    fi
+
+    cleanup
+}
+
+obs-build-main $*

+ 2 - 0
CI/include/Brewfile

@@ -0,0 +1,2 @@
+brew "cmake"
+brew "ninja"

+ 1 - 0
CI/include/Xcnotary

@@ -0,0 +1 @@
+brew "akeru-inc/tap/xcnotary"

+ 3 - 0
CI/include/build_environment.sh.in

@@ -0,0 +1,3 @@
+PRODUCT_NAME="@CMAKE_PROJECT_NAME@"
+PRODUCT_VERSION="@CMAKE_PROJECT_VERSION@"
+LINUX_MAINTAINER_EMAIL="@LINUX_MAINTAINER_EMAIL@"

+ 229 - 0
CI/include/build_support.sh

@@ -0,0 +1,229 @@
+#!/bin/bash
+
+##############################################################################
+# Unix support functions
+##############################################################################
+#
+# This script file can be included in build scripts for UNIX-compatible
+# shells to compose build scripts.
+#
+##############################################################################
+
+## DEFINE UTILITIES ##
+
+if [ -z "${QUIET}" ]; then
+    status() {
+        echo -e "${COLOR_BLUE}[${PRODUCT_NAME}] ${1}${COLOR_RESET}"
+    }
+
+    step() {
+        echo -e "${COLOR_GREEN}  + ${1}${COLOR_RESET}"
+    }
+
+    info() {
+        echo -e "${COLOR_ORANGE}  + ${1}${COLOR_RESET}"
+    }
+
+    error() {
+        echo -e "${COLOR_RED}  + ${1}${COLOR_RESET}"
+    }
+else
+    status() {
+        :
+    }
+
+    step() {
+        :
+    }
+
+    info() {
+        :
+    }
+
+    error() {
+        echo -e "${COLOR_RED}  + ${1}${COLOR_RESET}"
+    }
+fi
+
+exists() {
+  /usr/bin/command -v "$1" >/dev/null 2>&1
+}
+
+ensure_dir() {
+    [[ -n "${1}" ]] && /bin/mkdir -p "${1}" && builtin cd "${1}"
+}
+
+cleanup() {
+    :
+}
+
+caught_error() {
+    error "ERROR during build step: ${1}"
+    cleanup
+    exit 1
+}
+
+# Setup build environment
+
+BUILD_DIR="${BUILD_DIR:-build}"
+BUILD_CONFIG="${BUILD_CONFIG:-RelWithDebInfo}"
+CI_WORKFLOW="${CHECKOUT_DIR}/.github/workflows/main.yml"
+CURRENT_ARCH=$(uname -m)
+CURRENT_DATE="$(date +"%Y-%m-%d")"
+
+## Utility functions ##
+
+check_ccache() {
+    if ccache -V >/dev/null 2>&1; then
+        info "CCache available"
+        CMAKE_CCACHE_OPTIONS="-DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache"
+
+        if [ "${CI}" ]; then
+            ccache --set-config=cache_dir=${GITHUB_WORKSPACE:-${HOME}}/.ccache
+            ccache --set-config=max_size=${CCACHE_SIZE:-500M}
+            ccache --set-config=compression=true
+            ccache -z
+        fi
+    else
+        info "CCache not available"
+    fi
+}
+
+_add_ccache_to_path() {
+    if [ "${CMAKE_CCACHE_OPTIONS}" ]; then
+        PATH="/usr/local/opt/ccache/libexec:${PATH}"
+        status "Compiler Info:"
+        local IFS=$'\n'
+        for COMPILER_INFO in $(type cc c++ gcc g++ clang clang++ || true); do
+            info "${COMPILER_INFO}"
+        done
+    fi
+}
+
+safe_fetch() {
+    if [ $# -lt 2 ]; then
+        error "Usage: safe_fetch URL HASH"
+        return 1
+    fi
+
+    while true; do
+        case "${1}" in
+            -n | --nocontinue ) NOCONTINUE=TRUE; shift ;;
+            -- ) shift; break ;;
+            * ) break ;;
+        esac
+    done
+
+    DOWNLOAD_URL="${1}"
+    DOWNLOAD_HASH="${2}"
+    DOWNLOAD_FILE="$(basename ${DOWNLOAD_URL})"
+    CURLCMD=${CURLCMD:-curl}
+
+
+    if [ "${NOCONTINUE}" ]; then
+        ${CURLCMD/--continue-at -/} "${DOWNLOAD_URL}"
+    else
+        ${CURLCMD} "${DOWNLOAD_URL}"
+    fi
+
+    if [ "${DOWNLOAD_HASH}" = "$(sha256sum "${DOWNLOAD_FILE}" | cut -d " " -f 1)" ]; then
+        info "${DOWNLOAD_FILE} downloaded successfully and passed hash check"
+        return 0
+    else
+        error "${DOWNLOAD_FILE} downloaded successfully and failed hash check"
+        return 1
+    fi
+}
+
+check_and_fetch() {
+    if [ $# -lt 2 ]; then
+        caught_error "Usage: check_and_fetch URL HASH"
+    fi
+
+    while true; do
+        case "${1}" in
+            -n | --nocontinue ) NOCONTINUE=TRUE; shift ;;
+            -- ) shift; break ;;
+            * ) break ;;
+        esac
+    done
+
+    DOWNLOAD_URL="${1}"
+    DOWNLOAD_HASH="${2}"
+    DOWNLOAD_FILE="$(basename "${DOWNLOAD_URL}")"
+
+    if [ -f "${DOWNLOAD_FILE}" ] && [ "${DOWNLOAD_HASH}" = "$(sha256sum "${DOWNLOAD_FILE}" | cut -d " " -f 1)" ]; then
+        info "${DOWNLOAD_FILE} exists and passed hash check"
+        return 0
+    else
+        safe_fetch "${DOWNLOAD_URL}" "${DOWNLOAD_HASH}"
+    fi
+}
+
+github_fetch() {
+    if [ $# -ne 3 ]; then
+        error "Usage: github_fetch GITHUB_USER GITHUB_REPOSITORY GITHUB_COMMIT_HASH"
+        return 1
+    fi
+
+    GH_USER="${1}"
+    GH_REPO="${2}"
+    GH_REF="${3}"
+
+    if [ -d "./.git" ]; then
+        info "Repository ${GH_USER}/${GH_REPO} already exists, updating..."
+        git config advice.detachedHead false
+        git config remote.origin.url "https://github.com/${GH_USER}/${GH_REPO}.git"
+        git config remote.origin.fetch "+refs/heads/master:refs/remotes/origin/master"
+        git config remote.origin.tapOpt --no-tags
+
+        if ! git rev-parse -q --verify "${GH_COMMIT}^{commit}"; then
+            git fetch origin
+        fi
+
+        git checkout -f "${GH_REF}" --
+        git reset --hard "${GH_REF}" --
+        if [ -d "./.gitmodules" ]; then
+            git submodule foreach --recursive git submodule sync
+            git submodule update --init --recursive
+        fi
+
+    else
+        git clone "https://github.com/${GH_USER}/${GH_REPO}.git" "$(pwd)"
+        git config advice.detachedHead false
+        info "Checking out commit ${GH_REF}.."
+        git checkout -f "${GH_REF}" --
+
+        if [ -d "./.gitmodules" ]; then
+            git submodule foreach --recursive git submodule sync
+            git submodule update --init --recursive
+        fi
+    fi
+}
+
+apply_patch() {
+    if [ $# -ne 2 ]; then
+        error "Usage: apply_patch PATCH_URL PATCH_HASH"
+        return 1
+    fi
+
+    COMMIT_URL="${1}"
+    COMMIT_HASH="${2}"
+    PATCH_FILE="$(basename ${COMMIT_URL})"
+
+    if [ "${COMMIT_URL:0:5}" = "https" ]; then
+        ${CURLCMD:-curl} "${COMMIT_URL}"
+        if [ "${COMMIT_HASH}" = "$(sha256sum ${PATCH_FILE} | cut -d " " -f 1)" ]; then
+            info "${PATCH_FILE} downloaded successfully and passed hash check"
+        else
+            error "${PATCH_FILE} downloaded successfully and failed hash check"
+            return 1
+        fi
+
+        info "Applying patch ${COMMIT_URL}"
+    else
+        PATCH_FILE="${COMMIT_URL}"
+    fi
+
+    patch -g 0 -f -p1 -i "${PATCH_FILE}"
+}

+ 149 - 0
CI/include/build_support_macos.sh

@@ -0,0 +1,149 @@
+#!/bin/bash
+
+##############################################################################
+# macOS support functions
+##############################################################################
+#
+# This script file can be included in build scripts for macOS.
+#
+##############################################################################
+
+# Setup build environment
+
+CI_DEPS_VERSION=$(/bin/cat "${CI_WORKFLOW}" | /usr/bin/sed -En "s/[ ]+DEPS_VERSION_MAC: '([0-9\-]+)'/\1/p")
+CI_DEPS_HASH=$(/bin/cat "${CI_WORKFLOW}" | /usr/bin/sed -En "s/[ ]+DEPS_HASH_MAC: '([0-9a-f]+)'/\1/p")
+CI_QT_VERSION=$(/bin/cat "${CI_WORKFLOW}" | /usr/bin/sed -En "s/[ ]+QT_VERSION_MAC: '([0-9\.]+)'/\1/p" | /usr/bin/head -1)
+CI_QT_HASH=$(/bin/cat "${CI_WORKFLOW}" | /usr/bin/sed -En "s/[ ]+QT_HASH_MAC: '([0-9a-f]+)'/\1/p")
+CI_MACOSX_DEPLOYMENT_TARGET=$(/bin/cat "${CI_WORKFLOW}" | /usr/bin/sed -En "s/[ ]+MACOSX_DEPLOYMENT_TARGET: '([0-9\.]+)'/\1/p")
+CI_OBS_VERSION=$(/bin/cat "${CI_WORKFLOW}" | /usr/bin/sed -En "s/[ ]+OBS_VERSION: '([0-9\.]+)'/\1/p")
+
+MACOS_VERSION="$(/usr/bin/sw_vers -productVersion)"
+MACOS_MAJOR="$(echo ${MACOS_VERSION} | /usr/bin/cut -d '.' -f 1)"
+MACOS_MINOR="$(echo ${MACOS_VERSION} | /usr/bin/cut -d '.' -f 2)"
+
+if [ "${TERM-}" -a -z "${CI}" ]; then
+    COLOR_RED=$(/usr/bin/tput setaf 1)
+    COLOR_GREEN=$(/usr/bin/tput setaf 2)
+    COLOR_BLUE=$(/usr/bin/tput setaf 4)
+    COLOR_ORANGE=$(/usr/bin/tput setaf 3)
+    COLOR_RESET=$(/usr/bin/tput sgr0)
+else
+    COLOR_RED=""
+    COLOR_GREEN=""
+    COLOR_BLUE=""
+    COLOR_ORANGE=""
+    COLOR_RESET=""
+fi
+
+## DEFINE UTILITIES ##
+check_macos_version() {
+    step "Check macOS version..."
+    MIN_VERSION=${MACOSX_DEPLOYMENT_TARGET:-${CI_MACOSX_DEPLOYMENT_TARGET}}
+    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" ] && [ "${MACOS_MINOR}" -lt "${MIN_MINOR}" ]; then
+        error "WARNING: Minimum required macOS version is ${MIN_VERSION}, but running on ${MACOS_VERSION}"
+    fi
+
+    if [ "${MACOS_MAJOR}" -ge "11" ]; then
+        export CODESIGN_LINKER="ON"
+    fi
+}
+
+install_homebrew_deps() {
+    if ! exists brew; then
+        error "Homebrew not found - please install homebrew (https://brew.sh)"
+        exit 1
+    fi
+
+    brew bundle --file "${CHECKOUT_DIR}/CI/include/Brewfile" ${QUIET:+--quiet}
+
+    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
+
+        CURLCMD="/usr/local/opt/curl/bin/curl"
+    else
+        CURLCMD="curl"
+    fi
+
+    if [ "${CI}" -o "${QUIET}" ]; then
+        export CURLCMD="${CURLCMD} --silent --show-error --location -O"
+    else
+        export CURLCMD="${CURLCMD} --progress-bar --location --continue-at - -O"
+    fi
+}
+
+check_archs() {
+    step "Check Architecture..."
+    ARCH="${ARCH:-universal}"
+    if [ "${ARCH}" = "universal" ]; then
+        CMAKE_ARCHS="x86_64;arm64"
+    elif [ "${ARCH}" != "x86_64" -a "${ARCH}" != "arm64" ]; then
+        caught_error "Unsupported architecture '${ARCH}' provided"
+    else
+        CMAKE_ARCHS="${ARCH}"
+    fi
+}
+
+## SET UP CODE SIGNING AND NOTARIZATION CREDENTIALS ##
+##############################################################################
+# Apple Developer Identity needed:
+#
+#    + Signing the code requires a developer identity in the system's keychain
+#    + codesign will look up and find the identity automatically
+#
+##############################################################################
+read_codesign_ident() {
+    if [ ! -n "${CODESIGN_IDENT}" ]; then
+        step "Code-signing Setup"
+        read -p "${COLOR_ORANGE}  + Apple developer application identity: ${COLOR_RESET}" CODESIGN_IDENT
+    fi
+}
+
+read_codesign_ident_installer() {
+    if [ ! -n "${CODESIGN_IDENT_INSTALLER}" ]; then
+        step "Code-signing Setup for Installer"
+        read -p "${COLOR_ORANGE}  + Apple developer installer identity: ${COLOR_RESET}" CODESIGN_IDENT_INSTALLER
+    fi
+}
+
+##############################################################################
+# Apple Developer credentials necessary:
+#
+#   + Signing for distribution and notarization require an active Apple
+#     Developer membership
+#   + An Apple Development identity is needed for code signing
+#     (i.e. 'Apple Development: YOUR APPLE ID (PROVIDER)')
+#   + Your Apple developer ID is needed for notarization
+#   + An app-specific password is necessary for notarization from CLI
+#   + This password will be stored in your macOS keychain under the identifier
+#     'OBS-Codesign-Password'with access Apple's 'altool' only.
+##############################################################################
+
+read_codesign_pass() {
+    step "Notarization Setup"
+
+    if [ -z "${CODESIGN_IDENT_USER}" ]; then
+        read -p "${COLOR_ORANGE}  + Apple account id: ${COLOR_RESET}" CODESIGN_IDENT_USER
+    fi
+
+    if [ -z "${CODESIGN_IDENT_PASS}" ]; then
+        CODESIGN_IDENT_PASS=$(stty -echo; read -p "${COLOR_ORANGE}  + Apple developer password: ${COLOR_RESET}" secret; stty echo; echo $secret)
+        echo ""
+    fi
+
+    step "Updating notarization keychain"
+
+    echo -n "${COLOR_ORANGE}"
+    /usr/bin/xcrun altool --store-password-in-keychain-item "OBS-Codesign-Password" -u "${CODESIGN_IDENT_USER}" -p "${CODESIGN_IDENT_PASS}"
+    echo -n "${COLOR_RESET}"
+    CODESIGN_IDENT_SHORT=$(echo "${CODESIGN_IDENT}" | /usr/bin/sed -En "s/.+\((.+)\)/\1/p")
+}

+ 120 - 0
CI/macos/01_install_dependencies.sh

@@ -0,0 +1,120 @@
+#!/bin/bash
+
+##############################################################################
+# macOS dependency management function
+##############################################################################
+#
+# This script file can be included in build scripts for macOS or run directly
+#
+##############################################################################
+
+# 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}-universal.tar.xz" "${2}"
+    mkdir -p obs-deps
+    step "Unpack..."
+    /usr/bin/tar -xf "./macos-deps-${1}-universal.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..."
+    check_and_fetch "https://github.com/obsproject/obs-deps/releases/download/${1}/macos-deps-qt-${1}-universal.tar.xz" "${2}"
+    mkdir -p obs-deps
+    step "Unpack..."
+    /usr/bin/tar -xf "./macos-deps-qt-${1}-universal.tar.xz" -C ./obs-deps
+    /usr/bin/xattr -r -d com.apple.quarantine ./obs-deps
+}
+
+install_obs-studio() {
+    if [ "${OBS_BRANCH}" ]; then
+        CHECKOUT_REF="${OBS_BRANCH}"
+    else
+        CHECKOUT_REF="tags/${OBS_VERSION:-${CI_OBS_VERSION}}"
+    fi
+
+    ensure_dir "${OBS_BUILD_DIR}"
+
+    if [ ! -d "${OBS_BUILD_DIR}/.git" ]; then
+        /usr/bin/git clone --recursive https://github.com/obsproject/obs-studio "$(pwd)"
+        /usr/bin/git fetch origin --tags
+        /usr/bin/git checkout ${CHECKOUT_REF} -b obs-plugin-build
+    else
+        if ! /usr/bin/git show-ref --verify --quiet refs/heads/obs-plugin-build; then
+            /usr/bin/git checkout ${CHECKOUT_REF} -b obs-plugin-build
+        else
+            /usr/bin/git checkout obs-plugin-build
+        fi
+    fi
+}
+
+install_dependencies() {
+    status "Installing 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}}"
+        "obs-studio ${OBS_VERSION:-${CI_OBS_VERSION}}"
+    )
+
+    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
+}
+
+install-dependencies-standalone() {
+    CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)"
+    if [ -f "${CHECKOUT_DIR}/CI/include/build_environment.sh" ]; then
+        source "${CHECKOUT_DIR}/CI/include/build_environment.sh"
+    fi
+    PRODUCT_NAME="${PRODUCT_NAME:-obs-plugin}"
+    DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies"
+    OBS_BUILD_DIR="${CHECKOUT_DIR}/../obs-studio"
+    source "${CHECKOUT_DIR}/CI/include/build_support.sh"
+    source "${CHECKOUT_DIR}/CI/include/build_support_macos.sh"
+
+    status "Setting up plugin build dependencies"
+    check_macos_version
+    check_archs
+    install_dependencies
+}
+
+print_usage() {
+    echo -e "Usage: ${0}\n" \
+            "-h, --help                     : Print this help\n" \
+            "-q, --quiet                    : Suppress most build process output\n" \
+            "-v, --verbose                  : Enable more verbose build process output\n" \
+            "-a, --architecture             : Specify build architecture (default: universal, alternative: x86_64, arm64)\n"
+}
+
+install-dependencies-main() {
+    if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then
+        while true; do
+            case "${1}" in
+                -h | --help ) print_usage; exit 0 ;;
+                -q | --quiet ) export QUIET=TRUE; shift ;;
+                -v | --verbose ) export VERBOSE=TRUE; shift ;;
+                -a | --architecture ) ARCH="${2}"; shift 2 ;;
+                -- ) shift; break ;;
+                * ) break ;;
+            esac
+        done
+
+        install-dependencies-standalone
+    fi
+}
+
+install-dependencies-main $*

+ 79 - 0
CI/macos/02_build_obs_libs.sh

@@ -0,0 +1,79 @@
+#!/bin/bash
+
+##############################################################################
+# macOS libobs library build function
+##############################################################################
+#
+# This script file can be included in build scripts for macOS or run directly
+#
+##############################################################################
+
+# Halt on errors
+set -eE
+
+build_obs_libs() {
+    status "Build libobs and obs-frontend-api"
+    trap "caught_error 'build_obs_libs'" ERR
+
+    ensure_dir "${OBS_BUILD_DIR}"
+
+    step "Configuring OBS build system"
+    check_ccache
+    cmake -S . -B plugin_${BUILD_DIR} -G Ninja ${CMAKE_CCACHE_OPTIONS} \
+        -DCMAKE_OSX_ARCHITECTURES="${CMAKE_ARCHS}" \
+        -DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-${CI_MACOSX_DEPLOYMENT_TARGET}} \
+        -DOBS_CODESIGN_LINKER=${CODESIGN_LINKER:-OFF} \
+        -DCMAKE_BUILD_TYPE=${BUILD_CONFIG} \
+        -DENABLE_PLUGINS=OFF \
+        -DENABLE_UI=ON \
+        -DENABLE_SCRIPTING=OFF \
+        -DCMAKE_PREFIX_PATH="${DEPS_BUILD_DIR}/obs-deps" \
+        ${QUIET:+-Wno-deprecated -Wno-dev --log-level=ERROR}
+
+    step "Building libobs and obs-frontend-api"
+    cmake --build plugin_${BUILD_DIR} -t obs-frontend-api
+}
+
+build-obs-libs-standalone() {
+    CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)"
+    if [ -f "${CHECKOUT_DIR}/CI/include/build_environment.sh" ]; then
+        source "${CHECKOUT_DIR}/CI/include/build_environment.sh"
+    fi
+    PRODUCT_NAME="${PRODUCT_NAME:-obs-plugin}"
+    OBS_BUILD_DIR="${CHECKOUT_DIR}/../obs-studio"
+    source "${CHECKOUT_DIR}/CI/include/build_support.sh"
+    source "${CHECKOUT_DIR}/CI/include/build_support_macos.sh"
+
+    check_macos_version
+    check_archs
+    build_obs_libs
+}
+
+print_usage() {
+    echo -e "Usage: ${0}\n" \
+            "-h, --help                     : Print this help\n" \
+            "-q, --quiet                    : Suppress most build process output\n" \
+            "-v, --verbose                  : Enable more verbose build process output\n" \
+            "-a, --architecture             : Specify build architecture (default: universal, alternative: x86_64, arm64)\n" \
+            "--build-dir                    : Specify alternative build directory (default: build)\n"
+}
+
+build-obs-libs-main() {
+    if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then
+        while true; do
+            case "${1}" in
+                -h | --help ) print_usage; exit 0 ;;
+                -q | --quiet ) export QUIET=TRUE; shift ;;
+                -v | --verbose ) export VERBOSE=TRUE; shift ;;
+                -a | --architecture ) ARCH="${2}"; shift 2 ;;
+                --build-dir ) BUILD_DIR="${2}"; shift 2 ;;
+                -- ) shift; break ;;
+                * ) break ;;
+            esac
+        done
+
+        build-obs-libs-standalone
+    fi
+}
+
+build-obs-libs-main $*

+ 85 - 0
CI/macos/03_build_plugin.sh

@@ -0,0 +1,85 @@
+#!/bin/bash
+
+##############################################################################
+# macOS libobs plugin build function
+##############################################################################
+#
+# This script file can be included in build scripts for macOS or run directly
+#
+##############################################################################
+
+# Halt on errors
+set -eE
+
+build_obs_plugin() {
+    status "Build plugin ${PRODUCT_NAME}"
+    trap "caught_error 'builds_obs_plugin'" ERR
+
+    if [ "${CODESIGN}" ]; then
+        read_codesign_ident
+    fi
+
+    ensure_dir "${CHECKOUT_DIR}"
+    step "Configuring OBS plugin build system"
+    check_ccache
+
+    cmake -S . -B ${BUILD_DIR} -G Ninja ${CMAKE_CCACHE_OPTIONS} \
+        -DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-${CI_MACOSX_DEPLOYMENT_TARGET}} \
+        -DCMAKE_OSX_ARCHITECTURES="${CMAKE_ARCHS}" \
+        -DOBS_CODESIGN_LINKER=${CODESIGN_LINKER:-OFF} \
+        -DCMAKE_BUILD_TYPE=${BUILD_CONFIG} \
+        -DOBS_BUNDLE_CODESIGN_IDENTITY="${CODESIGN_IDENT:--}" \
+        -DCMAKE_PREFIX_PATH="${DEPS_BUILD_DIR}/obs-deps" \
+        ${QUIET:+-Wno-deprecated -Wno-dev --log-level=ERROR}
+
+    step "Building OBS plugin"
+    cmake --build ${BUILD_DIR}
+
+}
+
+build-plugin-standalone() {
+    CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)"
+    if [ -f "${CHECKOUT_DIR}/CI/include/build_environment.sh" ]; then
+        source "${CHECKOUT_DIR}/CI/include/build_environment.sh"
+    fi
+    PRODUCT_NAME="${PRODUCT_NAME:-obs-plugin}"
+    DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies"
+    source "${CHECKOUT_DIR}/CI/include/build_support.sh"
+    source "${CHECKOUT_DIR}/CI/include/build_support_macos.sh"
+
+    check_macos_version
+    check_archs
+
+    build_obs_plugin
+}
+
+print_usage() {
+    echo -e "Usage: ${0}\n" \
+            "-h, --help                     : Print this help\n" \
+            "-q, --quiet                    : Suppress most build process output\n" \
+            "-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" \
+            "--build-dir                    : Specify alternative build directory (default: build)\n"
+}
+
+build-plugin-main() {
+    if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then
+        while true; do
+            case "${1}" in
+                -h | --help ) print_usage; exit 0 ;;
+                -q | --quiet ) export QUIET=TRUE; shift ;;
+                -v | --verbose ) export VERBOSE=TRUE; shift ;;
+                -c | --codesign ) CODESIGN=TRUE; shift ;;
+                -a | --architecture ) ARCH="${2}"; shift 2 ;;
+                --build-dir ) BUILD_DIR="${2}"; shift 2 ;;
+                -- ) shift; break ;;
+                * ) break ;;
+            esac
+        done
+
+        build-plugin-standalone
+    fi
+}
+
+build-plugin-main $*

+ 150 - 0
CI/macos/04_package_plugin.sh

@@ -0,0 +1,150 @@
+#!/bin/bash
+
+##############################################################################
+# macOS libobs plugin package function
+##############################################################################
+#
+# This script file can be included in build scripts for macOS or run directly
+#
+##############################################################################
+
+# Halt on errors
+set -eE
+
+package_obs_plugin() {
+    if [ "${CODESIGN}" ]; then
+        read_codesign_ident
+    fi
+
+    status "Package OBS plugin ${PRODUCT_NAME}"
+    trap "caught_error 'package_obs_plugin'" ERR
+
+    ensure_dir "${CHECKOUT_DIR}"
+
+    if [ -d "${BUILD_DIR}/rundir/${PRODUCT_NAME}.plugin" ]; then
+        rm -rf "${BUILD_DIR}/rundir/${PRODUCT_NAME}.plugin"
+    fi
+
+    cmake --install ${BUILD_DIR}
+
+    if ! type packagesbuild &>/dev/null; then
+        status "Setting up dependency Packages.app"
+        step "Download..."
+        check_and_fetch "http://s.sudre.free.fr/Software/files/Packages.dmg" "70ac111417728c17b1f27d5520afd87c33f899f12de8ace0f703e3e1c500b28e"
+
+        step "Mount disk image..."
+        hdiutil attach -noverify Packages.dmg
+
+        step "Install Packages.app"
+        PACKAGES_VOLUME=$(hdiutil info -plist | grep "/Volumes/Packages" | sed 's/<string>\/Volumes\/\([^<]*\)<\/string>/\1/' | sed -e 's/^[[:space:]]*//')
+        sudo installer -pkg "/Volumes/${PACKAGES_VOLUME}/packages/Packages.pkg" -target /
+        hdiutil detach "/Volumes/${PACKAGES_VOLUME}"
+    fi
+
+    step "Package ${PRODUCT_NAME}..."
+    packagesbuild ./bundle/installer-macOS.generated.pkgproj
+
+    step "Codesigning installer package..."
+    read_codesign_ident_installer
+
+    /usr/bin/productsign --sign "${CODESIGN_IDENT_INSTALLER}" "${BUILD_DIR}/${PRODUCT_NAME}.pkg" "${FILE_NAME}"
+}
+
+notarize_obs_plugin() {
+    status "Notarize ${PRODUCT_NAME}"
+    trap "caught_error 'notarize_obs_plugin'" ERR
+
+    if ! exists brew; then
+        error "Homebrew not found - please install homebrew (https://brew.sh)"
+        exit 1
+    fi
+
+    if ! exists xcnotary; then
+        step "Install notarization dependency 'xcnotary'"
+        brew install akeru-inc/tap/xcnotary
+    fi
+
+    ensure_dir "${CHECKOUT_DIR}"
+
+    if [ -f "${FILE_NAME}" ]; then
+        xcnotary precheck "${FILE_NAME}"
+    else
+        error "No notarization package installer ('${FILE_NAME}') found"
+        return
+    fi
+
+    if [ "$?" -eq 0 ]; then
+        read_codesign_ident_installer
+        read_codesign_pass
+
+        step "Run xcnotary with ${FILE_NAME}..."
+        xcnotary notarize "${FILE_NAME}" --developer-account "${CODESIGN_IDENT_USER}" --developer-password-keychain-item "OBS-Codesign-Password" --provider "${CODESIGN_IDENT_SHORT}"
+    fi
+}
+
+package-plugin-standalone() {
+    CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)"
+    ensure_dir "${CHECKOUT_DIR}"
+    if [ -f "${CHECKOUT_DIR}/CI/include/build_environment.sh" ]; then
+        source "${CHECKOUT_DIR}/CI/include/build_environment.sh"
+    fi
+    PRODUCT_NAME="${PRODUCT_NAME:-obs-plugin}"
+    source "${CHECKOUT_DIR}/CI/include/build_support.sh"
+    source "${CHECKOUT_DIR}/CI/include/build_support_macos.sh"
+
+    GIT_BRANCH=$(/usr/bin/git rev-parse --abbrev-ref HEAD)
+    GIT_HASH=$(/usr/bin/git rev-parse --short HEAD)
+    GIT_TAG=$(/usr/bin/git describe --tags --abbrev=0 2&>/dev/null || true)
+
+    check_macos_version
+    check_archs
+
+    if [ "${ARCH}" = "arm64" ]; then
+        FILE_NAME="${PRODUCT_NAME}-${GIT_TAG:-${PRODUCT_VERSION}}-${GIT_HASH}-macOS-Apple.pkg"
+    elif [ "${ARCH}" = "x86_64" ]; then
+        FILE_NAME="${PRODUCT_NAME}-${GIT_TAG:-${PRODUCT_VERSION}}-${GIT_HASH}-macOS-Intel.pkg"
+    else
+        FILE_NAME="${PRODUCT_NAME}-${GIT_TAG:-${PRODUCT_VERSION}}-${GIT_HASH}-macOS-Universal.pkg"
+    fi
+
+    check_curl
+    package_obs_plugin
+
+    if [ "${NOTARIZE}" ]; then
+        notarize_obs_plugin
+    fi
+}
+
+print_usage() {
+    echo -e "Usage: ${0}\n" \
+            "-h, --help                     : Print this help\n" \
+            "-q, --quiet                    : Suppress most build process output\n" \
+            "-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" \
+            "-n, --notarize                 : Notarize OBS (default: off)\n" \
+            "--build-dir                    : Specify alternative build directory (default: build)\n"
+}
+
+package-plugin-main() {
+    if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then
+        while true; do
+            case "${1}" in
+                -h | --help ) print_usage; exit 0 ;;
+                -q | --quiet ) export QUIET=TRUE; shift ;;
+                -v | --verbose ) export VERBOSE=TRUE; shift ;;
+                -a | --architecture ) ARCH="${2}"; shift 2 ;;
+                -c | --codesign ) CODESIGN=TRUE; shift ;;
+                -n | --notarize ) NOTARIZE=TRUE; CODESIGN=TRUE; shift ;;
+                -s | --standalone ) STANDALONE=TRUE; shift ;;
+                --build-dir ) BUILD_DIR="${2}"; shift 2 ;;
+                -- ) shift; break ;;
+                * ) break ;;
+            esac
+        done
+
+        package-plugin-standalone
+    fi
+}
+
+package-plugin-main $*

+ 0 - 28
ci/macos/build-macos.sh

@@ -1,28 +0,0 @@
-#!/bin/sh
-
-OSTYPE=$(uname)
-
-if [ "${OSTYPE}" != "Darwin" ]; then
-    echo "[Error] macOS build script can be run on Darwin-type OS only."
-    exit 1
-fi
-
-HAS_CMAKE=$(type cmake 2>/dev/null)
-
-if [ "${HAS_CMAKE}" = "" ]; then
-    echo "[Error] CMake not installed - please run 'install-dependencies-macos.sh' first."
-    exit 1
-fi
-
-#export QT_PREFIX="$(find /usr/local/Cellar/qt5 -d 1 | tail -n 1)"
-
-echo "=> Building plugin for macOS."
-mkdir -p build && cd build
-cmake .. \
-	-DQTDIR=/usr/local/opt/qt \
-	-DLIBOBS_INCLUDE_DIR=../../obs-studio/libobs \
-	-DLIBOBS_LIB=../../obs-studio/libobs \
-	-DOBS_FRONTEND_LIB="$(pwd)/../../obs-studio/build/UI/obs-frontend-api/libobs-frontend-api.dylib" \
-	-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-	-DCMAKE_INSTALL_PREFIX=/usr \
-&& make -j4

+ 0 - 43
ci/macos/install-build-obs-macos.sh

@@ -1,43 +0,0 @@
-#!/bin/sh
-
-OSTYPE=$(uname)
-
-if [ "${OSTYPE}" != "Darwin" ]; then
-    echo "[Error] macOS obs-studio build script can be run on Darwin-type OS only."
-    exit 1
-fi
-
-HAS_CMAKE=$(type cmake 2>/dev/null)
-HAS_GIT=$(type git 2>/dev/null)
-
-if [ "${HAS_CMAKE}" = "" ]; then
-    echo "[Error] CMake not installed - please run 'install-dependencies-macos.sh' first."
-    exit 1
-fi
-
-if [ "${HAS_GIT}" = "" ]; then
-    echo "[Error] Git not installed - please install Xcode developer tools or via Homebrew."
-    exit 1
-fi
-
-echo "=> Downloading and unpacking OBS dependencies"
-wget --quiet --retry-connrefused --waitretry=1 https://obs-nightly.s3.amazonaws.com/osx-deps-2018-08-09.tar.gz
-tar -xf ./osx-deps-2018-08-09.tar.gz -C /tmp
-
-# Build obs-studio
-cd ..
-echo "=> Cloning obs-studio from GitHub.."
-git clone https://github.com/obsproject/obs-studio
-cd obs-studio
-OBSLatestTag=$(git describe --tags --abbrev=0)
-git checkout $OBSLatestTag
-mkdir build && cd build
-echo "=> Building obs-studio.."
-cmake .. \
-	-DBUILD_CAPTIONS=true \
-	-DCMAKE_OSX_DEPLOYMENT_TARGET=10.11 \
-	-DDISABLE_PLUGINS=true \
-    -DENABLE_SCRIPTING=0 \
-	-DDepsPath=/tmp/obsdeps \
-	-DCMAKE_PREFIX_PATH=/usr/local/opt/qt/lib/cmake \
-&& make -j4

+ 0 - 62
ci/macos/install-dependencies-macos.sh

@@ -1,62 +0,0 @@
-#!/bin/sh
-
-
-
-OSTYPE=$(uname)
-
-if [ "${OSTYPE}" != "Darwin" ]; then
-    echo "[Error] macOS install dependencies script can be run on Darwin-type OS only."
-    exit 1
-fi
-
-HAS_BREW=$(type brew 2>/dev/null)
-
-if [ "${HAS_BREW}" = "" ]; then
-    echo "[Error] Please install Homebrew (https://www.brew.sh/) to build this plugin on macOS."
-    exit 1
-fi
-
-# OBS Studio deps
-echo "=> Updating Homebrew.."
-brew update >/dev/null
-
-echo "[=> Checking installed Homebrew formulas.."
-BREW_PACKAGES=$(brew list)
-BREW_DEPENDENCIES="jack speexdsp ccache swig mbedtls"
-
-for DEPENDENCY in ${BREW_DEPENDENCIES}; do
-    if echo "${BREW_PACKAGES}" | grep -q "^${DEPENDENCY}\$"; then
-        echo "=> Upgrading OBS-Studio dependency '${DEPENDENCY}'.."
-        brew upgrade ${DEPENDENCY} 2>/dev/null
-    else
-        echo "=> Installing OBS-Studio dependency '${DEPENDENCY}'.."
-        brew install ${DEPENDENCY} 2>/dev/null
-    fi
-done
-
-# qtwebsockets deps
-echo "=> Installing plugin dependency 'QT 5.10.1'.."
-# =!= NOTICE =!=
-# When building QT5 from sources on macOS 10.13+, use local qt5 formula:
-# brew install ./CI/macos/qt.rb
-# Pouring from the bottle is much quicker though, so use bottle for now.
-# =!= NOTICE =!=
-
-brew install https://gist.githubusercontent.com/DDRBoxman/b3956fab6073335a4bf151db0dcbd4ad/raw/ed1342a8a86793ea8c10d8b4d712a654da121ace/qt.rb
-
-# Pin this version of QT5 to avoid `brew upgrade`
-# upgrading it to incompatible version
-brew pin qt
-
-# Fetch and install Packages app
-# =!= NOTICE =!=
-# Installs a LaunchDaemon under /Library/LaunchDaemons/fr.whitebox.packages.build.dispatcher.plist
-# =!= NOTICE =!=
-
-HAS_PACKAGES=$(type packagesbuild 2>/dev/null)
-
-if [ "${HAS_PACKAGES}" = "" ]; then
-    echo "=> Installing Packaging app (might require password due to 'sudo').."
-    curl -o './Packages.pkg' --retry-connrefused -s --retry-delay 1 'https://s3-us-west-2.amazonaws.com/obs-nightly/Packages.pkg'
-    sudo installer -pkg ./Packages.pkg -target /
-fi

+ 0 - 93
ci/macos/package-macos.sh

@@ -1,93 +0,0 @@
-#!/bin/bash
-
-set -e
-
-script_dir=$(dirname "$0")
-source "$script_dir/../ci_includes.generated.sh"
-
-OSTYPE=$(uname)
-
-if [ "${OSTYPE}" != "Darwin" ]; then
-    echo "[Error] macOS package script can be run on Darwin-type OS only."
-    exit 1
-fi
-
-echo "=> Preparing package build"
-export QT_CELLAR_PREFIX="$(/usr/bin/find /usr/local/Cellar/qt -d 1 | sort -t '.' -k 1,1n -k 2,2n -k 3,3n | tail -n 1)"
-
-GIT_HASH=$(git rev-parse --short HEAD)
-GIT_BRANCH_OR_TAG=$(git name-rev --name-only HEAD | awk -F/ '{print $NF}')
-
-PKG_VERSION="$GIT_HASH-$GIT_BRANCH_OR_TAG"
-
-FILENAME_UNSIGNED="$PLUGIN_NAME-$PKG_VERSION-Unsigned.pkg"
-FILENAME="$PLUGIN_NAME-$PKG_VERSION.pkg"
-
-echo "=> Modifying $PLUGIN_NAME.so"
-install_name_tool \
-	-change /usr/local/opt/qt/lib/QtWidgets.framework/Versions/5/QtWidgets \
-		@executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets \
-	-change /usr/local/opt/qt/lib/QtGui.framework/Versions/5/QtGui \
-		@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui \
-	-change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore \
-		@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore \
-	./build/$PLUGIN_NAME.so
-
-# Check if replacement worked
-echo "=> Dependencies for $PLUGIN_NAME"
-otool -L ./build/$PLUGIN_NAME.so
-
-if [[ "$RELEASE_MODE" == "True" ]]; then
-	echo "=> Signing plugin binary: $PLUGIN_NAME.so"
-	codesign --sign "$CODE_SIGNING_IDENTITY" ./build/$PLUGIN_NAME.so
-else
-	echo "=> Skipped plugin codesigning"
-fi
-
-echo "=> Actual package build"
-packagesbuild ./installer/installer-macOS.generated.pkgproj
-
-echo "=> Renaming $PLUGIN_NAME.pkg to $FILENAME"
-mv ./release/$PLUGIN_NAME.pkg ./release/$FILENAME_UNSIGNED
-
-if [[ "$RELEASE_MODE" == "True" ]]; then
-	echo "=> Signing installer: $FILENAME"
-	productsign \
-		--sign "$INSTALLER_SIGNING_IDENTITY" \
-		./release/$FILENAME_UNSIGNED \
-		./release/$FILENAME
-	rm ./release/$FILENAME_UNSIGNED
-
-	echo "=> Submitting installer $FILENAME for notarization"
-	zip -r ./release/$FILENAME.zip ./release/$FILENAME
-	UPLOAD_RESULT=$(xcrun altool \
-		--notarize-app \
-		--primary-bundle-id "$MACOS_BUNDLEID" \
-		--username "$AC_USERNAME" \
-		--password "$AC_PASSWORD" \
-		--asc-provider "$AC_PROVIDER_SHORTNAME" \
-		--file "./release/$FILENAME.zip")
-	rm ./release/$FILENAME.zip
-
-	REQUEST_UUID=$(echo $UPLOAD_RESULT | awk -F ' = ' '/RequestUUID/ {print $2}')
-	echo "Request UUID: $REQUEST_UUID"
-
-	echo "=> Wait for notarization result"
-	# Pieces of code borrowed from rednoah/notarized-app
-	while sleep 30 && date; do
-		CHECK_RESULT=$(xcrun altool \
-			--notarization-info "$REQUEST_UUID" \
-			--username "$AC_USERNAME" \
-			--password "$AC_PASSWORD" \
-			--asc-provider "$AC_PROVIDER_SHORTNAME")
-		echo $CHECK_RESULT
-
-		if ! grep -q "Status: in progress" <<< "$CHECK_RESULT"; then
-			echo "=> Staple ticket to installer: $FILENAME"
-			xcrun stapler staple ./release/$FILENAME
-			break
-		fi
-	done
-else
-	echo "=> Skipped installer codesigning and notarization"
-fi

+ 0 - 163
ci/macos/qt.rb

@@ -1,163 +0,0 @@
-# Patches for Qt must be at the very least submitted to Qt's Gerrit codereview
-# rather than their bug-report Jira. The latter is rarely reviewed by Qt.
-class Qt < Formula
-	desc "Cross-platform application and UI framework"
-	homepage "https://www.qt.io/"
-	url "https://download.qt.io/archive/qt/5.10/5.10.1/single/qt-everywhere-src-5.10.1.tar.xz"
-	mirror "https://mirrorservice.org/sites/download.qt-project.org/official_releases/qt/5.10/5.10.1/single/qt-everywhere-src-5.10.1.tar.xz"
-	sha256 "05ffba7b811b854ed558abf2be2ddbd3bb6ddd0b60ea4b5da75d277ac15e740a"
-	head "https://code.qt.io/qt/qt5.git", :branch => "5.10.1", :shallow => false
-
-	bottle do
-		sha256 "8b4bad005596a5f8790150fe455db998ac2406f4e0f04140d6656205d844d266" => :high_sierra
-		sha256 "9c488554935fb573554a4e36d36d3c81e47245b7fefc4b61edef894e67ba1740" => :sierra
-		sha256 "c0407afba5951df6cc4c6f6c1c315972bd41c99cecb4e029919c4c15ab6f7bdc" => :el_capitan
-	end
-
-	keg_only "Qt 5 has CMake issues when linked"
-
-	option "with-docs", "Build documentation"
-	option "with-examples", "Build examples"
-
-	deprecated_option "with-mysql" => "with-mysql-client"
-
-	# OS X 10.7 Lion is still supported in Qt 5.5, but is no longer a reference
-	# configuration and thus untested in practice. Builds on OS X 10.7 have been
-	# reported to fail: <https://github.com/Homebrew/homebrew/issues/45284>.
-	depends_on :macos => :mountain_lion
-
-	depends_on "pkg-config" => :build
-	depends_on :xcode => :build
-	depends_on "mysql-client" => :optional
-	depends_on "postgresql" => :optional
-
-	# Restore `.pc` files for framework-based build of Qt 5 on OS X. This
-	# partially reverts <https://codereview.qt-project.org/#/c/140954/> merged
-	# between the 5.5.1 and 5.6.0 releases. (Remove this as soon as feasible!)
-	#
-	# Core formulae known to fail without this patch (as of 2016-10-15):
-	#   * gnuplot  (with `--with-qt` option)
-	#   * mkvtoolnix (with `--with-qt` option, silent build failure)
-	#   * poppler    (with `--with-qt` option)
-	patch do
-		url "https://raw.githubusercontent.com/Homebrew/formula-patches/e8fe6567/qt5/restore-pc-files.patch"
-		sha256 "48ff18be2f4050de7288bddbae7f47e949512ac4bcd126c2f504be2ac701158b"
-	end
-
-	# Fix compile error on macOS 10.13 around QFixed:
-	# https://github.com/Homebrew/homebrew-core/issues/27095
-	# https://bugreports.qt.io/browse/QTBUG-67545
-	patch do
-		url "https://raw.githubusercontent.com/z00m1n/formula-patches/0de0e229/qt/QTBUG-67545.patch"
-		sha256 "4a115097c7582c7dce4207f5500d13feb8c990eb8a05a43f41953985976ebe6c"
-	end
-
-	# Fix compile error on macOS 10.13 caused by qtlocation dependency
-	# mapbox-gl-native using Boost 1.62.0 does not build with C++ 17:
-	# https://github.com/Homebrew/homebrew-core/issues/27095
-	# https://bugreports.qt.io/browse/QTBUG-67810
-	patch do
-		url "https://raw.githubusercontent.com/z00m1n/formula-patches/a1a1f0dd/qt/QTBUG-67810.patch"
-		sha256 "8ee0bf71df1043f08ebae3aa35036be29c4d9ebff8a27e3b0411a6bd635e9382"
-	end
-
-	def install
-		args = %W[
-			-verbose
-			-prefix #{prefix}
-			-release
-			-opensource -confirm-license
-			-system-zlib
-			-qt-libpng
-			-qt-libjpeg
-			-qt-freetype
-			-qt-pcre
-			-nomake tests
-			-no-rpath
-			-pkg-config
-			-dbus-runtime
-			-no-assimp
-		]
-
-		args << "-nomake" << "examples" if build.without? "examples"
-
-		if build.with? "mysql-client"
-			args << "-plugin-sql-mysql"
-			(buildpath/"brew_shim/mysql_config").write <<~EOS
-				#!/bin/sh
-				if [ x"$1" = x"--libs" ]; then
-					mysql_config --libs | sed "s/-lssl -lcrypto//"
-				else
-					exec mysql_config "$@"
-				fi
-			EOS
-			chmod 0755, "brew_shim/mysql_config"
-			args << "-mysql_config" << buildpath/"brew_shim/mysql_config"
-		end
-
-		args << "-plugin-sql-psql" if build.with? "postgresql"
-
-		system "./configure", *args
-		system "make"
-		ENV.deparallelize
-		system "make", "install"
-
-		if build.with? "docs"
-			system "make", "docs"
-			system "make", "install_docs"
-		end
-
-		# Some config scripts will only find Qt in a "Frameworks" folder
-		frameworks.install_symlink Dir["#{lib}/*.framework"]
-
-		# The pkg-config files installed suggest that headers can be found in the
-		# `include` directory. Make this so by creating symlinks from `include` to
-		# the Frameworks' Headers folders.
-		Pathname.glob("#{lib}/*.framework/Headers") do |path|
-			include.install_symlink path => path.parent.basename(".framework")
-		end
-
-		# Move `*.app` bundles into `libexec` to expose them to `brew linkapps` and
-		# because we don't like having them in `bin`.
-		# (Note: This move breaks invocation of Assistant via the Help menu
-		# of both Designer and Linguist as that relies on Assistant being in `bin`.)
-		libexec.mkpath
-		Pathname.glob("#{bin}/*.app") { |app| mv app, libexec }
-	end
-
-	def caveats; <<~EOS
-		We agreed to the Qt opensource license for you.
-		If this is unacceptable you should uninstall.
-		EOS
-	end
-
-	test do
-		(testpath/"hello.pro").write <<~EOS
-			QT       += core
-			QT       -= gui
-			TARGET = hello
-			CONFIG   += console
-			CONFIG   -= app_bundle
-			TEMPLATE = app
-			SOURCES += main.cpp
-		EOS
-
-		(testpath/"main.cpp").write <<~EOS
-			#include <QCoreApplication>
-			#include <QDebug>
-
-			int main(int argc, char *argv[])
-			{
-				QCoreApplication a(argc, argv);
-				qDebug() << "Hello World!";
-				return 0;
-			}
-		EOS
-
-		system bin/"qmake", testpath/"hello.pro"
-		system "make"
-		assert_predicate testpath/"hello", :exist?
-		assert_predicate testpath/"main.o", :exist?
-		system "./hello"
-	end
-end

+ 0 - 726
installer/installer-macOS.pkgproj.in

@@ -1,726 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>PROJECT</key>
-	<dict>
-		<key>PACKAGE_FILES</key>
-		<dict>
-			<key>DEFAULT_INSTALL_LOCATION</key>
-			<string>/</string>
-			<key>HIERARCHY</key>
-			<dict>
-				<key>CHILDREN</key>
-				<array>
-					<dict>
-						<key>CHILDREN</key>
-						<array>
-							<dict>
-								<key>CHILDREN</key>
-								<array>
-									<dict>
-										<key>CHILDREN</key>
-										<array>
-											<dict>
-												<key>CHILDREN</key>
-												<array>
-													<dict>
-														<key>CHILDREN</key>
-														<array>
-															<dict>
-																<key>CHILDREN</key>
-																<array>
-																	<dict>
-																		<key>CHILDREN</key>
-																		<array/>
-																		<key>GID</key>
-																		<integer>80</integer>
-																		<key>PATH</key>
-																		<string>../build/@CMAKE_PROJECT_NAME@.so</string>
-																		<key>PATH_TYPE</key>
-																		<integer>1</integer>
-																		<key>PERMISSIONS</key>
-																		<integer>493</integer>
-																		<key>TYPE</key>
-																		<integer>3</integer>
-																		<key>UID</key>
-																		<integer>0</integer>
-																	</dict>
-																</array>
-																<key>GID</key>
-																<integer>80</integer>
-																<key>PATH</key>
-																<string>bin</string>
-																<key>PATH_TYPE</key>
-																<integer>0</integer>
-																<key>PERMISSIONS</key>
-																<integer>493</integer>
-																<key>TYPE</key>
-																<integer>2</integer>
-																<key>UID</key>
-																<integer>0</integer>
-															</dict>
-															<dict>
-																<key>CHILDREN</key>
-																<array/>
-																<key>GID</key>
-																<integer>80</integer>
-																<key>PATH</key>
-																<string>../data</string>
-																<key>PATH_TYPE</key>
-																<integer>1</integer>
-																<key>PERMISSIONS</key>
-																<integer>493</integer>
-																<key>TYPE</key>
-																<integer>3</integer>
-																<key>UID</key>
-																<integer>0</integer>
-															</dict>
-														</array>
-														<key>GID</key>
-														<integer>80</integer>
-														<key>PATH</key>
-														<string>@CMAKE_PROJECT_NAME@</string>
-														<key>PATH_TYPE</key>
-														<integer>0</integer>
-														<key>PERMISSIONS</key>
-														<integer>493</integer>
-														<key>TYPE</key>
-														<integer>2</integer>
-														<key>UID</key>
-														<integer>0</integer>
-													</dict>
-												</array>
-												<key>GID</key>
-												<integer>80</integer>
-												<key>PATH</key>
-												<string>plugins</string>
-												<key>PATH_TYPE</key>
-												<integer>0</integer>
-												<key>PERMISSIONS</key>
-												<integer>493</integer>
-												<key>TYPE</key>
-												<integer>2</integer>
-												<key>UID</key>
-												<integer>0</integer>
-											</dict>
-										</array>
-										<key>GID</key>
-										<integer>80</integer>
-										<key>PATH</key>
-										<string>obs-studio</string>
-										<key>PATH_TYPE</key>
-										<integer>0</integer>
-										<key>PERMISSIONS</key>
-										<integer>493</integer>
-										<key>TYPE</key>
-										<integer>2</integer>
-										<key>UID</key>
-										<integer>0</integer>
-									</dict>
-								</array>
-								<key>GID</key>
-								<integer>80</integer>
-								<key>PATH</key>
-								<string>Application Support</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>Automator</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>Documentation</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>Extensions</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>Filesystems</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>Frameworks</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>Input Methods</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>Internet Plug-Ins</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>LaunchAgents</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>LaunchDaemons</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>PreferencePanes</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>Preferences</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>80</integer>
-								<key>PATH</key>
-								<string>Printers</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>PrivilegedHelperTools</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>QuickLook</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>QuickTime</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>Screen Savers</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>Scripts</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>Services</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>Widgets</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>493</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-						</array>
-						<key>GID</key>
-						<integer>0</integer>
-						<key>PATH</key>
-						<string>Library</string>
-						<key>PATH_TYPE</key>
-						<integer>0</integer>
-						<key>PERMISSIONS</key>
-						<integer>493</integer>
-						<key>TYPE</key>
-						<integer>1</integer>
-						<key>UID</key>
-						<integer>0</integer>
-					</dict>
-					<dict>
-						<key>CHILDREN</key>
-						<array>
-							<dict>
-								<key>CHILDREN</key>
-								<array/>
-								<key>GID</key>
-								<integer>0</integer>
-								<key>PATH</key>
-								<string>Shared</string>
-								<key>PATH_TYPE</key>
-								<integer>0</integer>
-								<key>PERMISSIONS</key>
-								<integer>1023</integer>
-								<key>TYPE</key>
-								<integer>1</integer>
-								<key>UID</key>
-								<integer>0</integer>
-							</dict>
-						</array>
-						<key>GID</key>
-						<integer>80</integer>
-						<key>PATH</key>
-						<string>Users</string>
-						<key>PATH_TYPE</key>
-						<integer>0</integer>
-						<key>PERMISSIONS</key>
-						<integer>493</integer>
-						<key>TYPE</key>
-						<integer>1</integer>
-						<key>UID</key>
-						<integer>0</integer>
-					</dict>
-				</array>
-				<key>GID</key>
-				<integer>0</integer>
-				<key>PATH</key>
-				<string>/</string>
-				<key>PATH_TYPE</key>
-				<integer>0</integer>
-				<key>PERMISSIONS</key>
-				<integer>493</integer>
-				<key>TYPE</key>
-				<integer>1</integer>
-				<key>UID</key>
-				<integer>0</integer>
-			</dict>
-			<key>PAYLOAD_TYPE</key>
-			<integer>0</integer>
-			<key>VERSION</key>
-			<integer>4</integer>
-		</dict>
-		<key>PACKAGE_SCRIPTS</key>
-		<dict>
-			<key>RESOURCES</key>
-			<array/>
-		</dict>
-		<key>PACKAGE_SETTINGS</key>
-		<dict>
-			<key>AUTHENTICATION</key>
-			<integer>1</integer>
-			<key>CONCLUSION_ACTION</key>
-			<integer>0</integer>
-			<key>IDENTIFIER</key>
-			<string>@MACOS_BUNDLEID@</string>
-			<key>OVERWRITE_PERMISSIONS</key>
-			<false/>
-			<key>VERSION</key>
-			<string>@CMAKE_PROJECT_VERSION@</string>
-		</dict>
-		<key>PROJECT_COMMENTS</key>
-		<dict>
-			<key>NOTES</key>
-			<data>
-			PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1M
-			IDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQv
-			c3RyaWN0LmR0ZCI+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1l
-			cXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7
-			IGNoYXJzZXQ9VVRGLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJDb250
-			ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KPHRp
-			dGxlPjwvdGl0bGU+CjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29u
-			dGVudD0iQ29jb2EgSFRNTCBXcml0ZXIiPgo8bWV0YSBuYW1lPSJD
-			b2NvYVZlcnNpb24iIGNvbnRlbnQ9IjE0MDQuMTMiPgo8c3R5bGUg
-			dHlwZT0idGV4dC9jc3MiPgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5
-			Pgo8L2JvZHk+CjwvaHRtbD4K
-			</data>
-		</dict>
-		<key>PROJECT_SETTINGS</key>
-		<dict>
-			<key>BUILD_PATH</key>
-			<dict>
-				<key>PATH</key>
-				<string>../release</string>
-				<key>PATH_TYPE</key>
-				<integer>1</integer>
-			</dict>
-			<key>EXCLUDED_FILES</key>
-			<array>
-				<dict>
-					<key>PATTERNS_ARRAY</key>
-					<array>
-						<dict>
-							<key>REGULAR_EXPRESSION</key>
-							<false/>
-							<key>STRING</key>
-							<string>.DS_Store</string>
-							<key>TYPE</key>
-							<integer>0</integer>
-						</dict>
-					</array>
-					<key>PROTECTED</key>
-					<true/>
-					<key>PROXY_NAME</key>
-					<string>Remove .DS_Store files</string>
-					<key>PROXY_TOOLTIP</key>
-					<string>Remove ".DS_Store" files created by the Finder.</string>
-					<key>STATE</key>
-					<true/>
-				</dict>
-				<dict>
-					<key>PATTERNS_ARRAY</key>
-					<array>
-						<dict>
-							<key>REGULAR_EXPRESSION</key>
-							<false/>
-							<key>STRING</key>
-							<string>.pbdevelopment</string>
-							<key>TYPE</key>
-							<integer>0</integer>
-						</dict>
-					</array>
-					<key>PROTECTED</key>
-					<true/>
-					<key>PROXY_NAME</key>
-					<string>Remove .pbdevelopment files</string>
-					<key>PROXY_TOOLTIP</key>
-					<string>Remove ".pbdevelopment" files created by ProjectBuilder or Xcode.</string>
-					<key>STATE</key>
-					<true/>
-				</dict>
-				<dict>
-					<key>PATTERNS_ARRAY</key>
-					<array>
-						<dict>
-							<key>REGULAR_EXPRESSION</key>
-							<false/>
-							<key>STRING</key>
-							<string>CVS</string>
-							<key>TYPE</key>
-							<integer>1</integer>
-						</dict>
-						<dict>
-							<key>REGULAR_EXPRESSION</key>
-							<false/>
-							<key>STRING</key>
-							<string>.cvsignore</string>
-							<key>TYPE</key>
-							<integer>0</integer>
-						</dict>
-						<dict>
-							<key>REGULAR_EXPRESSION</key>
-							<false/>
-							<key>STRING</key>
-							<string>.cvspass</string>
-							<key>TYPE</key>
-							<integer>0</integer>
-						</dict>
-						<dict>
-							<key>REGULAR_EXPRESSION</key>
-							<false/>
-							<key>STRING</key>
-							<string>.svn</string>
-							<key>TYPE</key>
-							<integer>1</integer>
-						</dict>
-						<dict>
-							<key>REGULAR_EXPRESSION</key>
-							<false/>
-							<key>STRING</key>
-							<string>.git</string>
-							<key>TYPE</key>
-							<integer>1</integer>
-						</dict>
-						<dict>
-							<key>REGULAR_EXPRESSION</key>
-							<false/>
-							<key>STRING</key>
-							<string>.gitignore</string>
-							<key>TYPE</key>
-							<integer>0</integer>
-						</dict>
-					</array>
-					<key>PROTECTED</key>
-					<true/>
-					<key>PROXY_NAME</key>
-					<string>Remove SCM metadata</string>
-					<key>PROXY_TOOLTIP</key>
-					<string>Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems.</string>
-					<key>STATE</key>
-					<true/>
-				</dict>
-				<dict>
-					<key>PATTERNS_ARRAY</key>
-					<array>
-						<dict>
-							<key>REGULAR_EXPRESSION</key>
-							<false/>
-							<key>STRING</key>
-							<string>classes.nib</string>
-							<key>TYPE</key>
-							<integer>0</integer>
-						</dict>
-						<dict>
-							<key>REGULAR_EXPRESSION</key>
-							<false/>
-							<key>STRING</key>
-							<string>designable.db</string>
-							<key>TYPE</key>
-							<integer>0</integer>
-						</dict>
-						<dict>
-							<key>REGULAR_EXPRESSION</key>
-							<false/>
-							<key>STRING</key>
-							<string>info.nib</string>
-							<key>TYPE</key>
-							<integer>0</integer>
-						</dict>
-					</array>
-					<key>PROTECTED</key>
-					<true/>
-					<key>PROXY_NAME</key>
-					<string>Optimize nib files</string>
-					<key>PROXY_TOOLTIP</key>
-					<string>Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles.</string>
-					<key>STATE</key>
-					<true/>
-				</dict>
-				<dict>
-					<key>PATTERNS_ARRAY</key>
-					<array>
-						<dict>
-							<key>REGULAR_EXPRESSION</key>
-							<false/>
-							<key>STRING</key>
-							<string>Resources Disabled</string>
-							<key>TYPE</key>
-							<integer>1</integer>
-						</dict>
-					</array>
-					<key>PROTECTED</key>
-					<true/>
-					<key>PROXY_NAME</key>
-					<string>Remove Resources Disabled folders</string>
-					<key>PROXY_TOOLTIP</key>
-					<string>Remove "Resources Disabled" folders.</string>
-					<key>STATE</key>
-					<true/>
-				</dict>
-				<dict>
-					<key>SEPARATOR</key>
-					<true/>
-				</dict>
-			</array>
-			<key>NAME</key>
-			<string>@CMAKE_PROJECT_NAME@</string>
-		</dict>
-	</dict>
-	<key>TYPE</key>
-	<integer>1</integer>
-	<key>VERSION</key>
-	<integer>2</integer>
-</dict>
-</plist>