From a22b2efbbcfd89bf4382c9f4da940d851e792a17 Mon Sep 17 00:00:00 2001 From: Josh Wong <34504936+jbwong05@users.noreply.github.com> Date: Wed, 24 May 2023 21:58:13 -0700 Subject: [PATCH] Update to support OBS v28.0.0 and v29.0.0 (#53) * Updates from new plugin template * Removed old clang github action * Allowed building on all commits * buildspec updates * Fixed linux build * Fix windows pthread linking * Fix duplicate target_link_libraries calls * Include pthread.h * Try direct w32-pthread linking * Fixed windows build * Fixed CMakeLists.txt formatting * Fixed installation target for Ubuntu 22.04.1 * Refactored manual refresh on frontend startup Issue that was present on gdiplus now showed up in freetype2. Janky existing fix was refactored to be added to text-freetype2 * Re-added cmake installation call for macos cmake on linux will perform the local install after building while macos will not. This re-adds the installation call for macos so the packaging script does not fail * Fixed styling error * Pulled in missing commits from obs-studio main repo * Patch for non-interactive text sources on startup On startup and text creation there was an issue where the slideshow would not be interactable. For freetype2 this was due to the new text source returning a width and height of 0. Subsequent updates after the first update would fix the issue. Some code to dynamically keep track of the width and height when available was added to the video render callback. It is a janky fix until the freetype2 issue of not properly setting the width and height can be fixed * Switched to unordered_set for size patch over DARRAY * Cleared out of date sources and updated comment * Single file delimiter parsing fixes (#49) * Complete rewrite of delim parsing logic Complete rewrite of the delim parsing logic with a custom multi character strtok implmentation to fix a lot of the lingering delim parsing bugs due to strtok limitations * Refactor and rewrite delim file parsing Overhaul and refactor delimeter file reading and parsing * Fixed windows build errors * Fix for multi file support Fix for multi file support which was broken by the empty width/height patch * Attempt to fix Ubuntu locale install path (#50) --- .cmake-format.json | 16 + .github/actions/build-plugin/action.yml | 77 ++ .github/actions/package-plugin/action.yml | 99 ++ .github/scripts/.Aptfile | 9 + .github/scripts/.Brewfile | 6 + .github/scripts/.Wingetfile | 3 + .github/scripts/.build.zsh | 249 +++++ .github/scripts/.package.zsh | 193 ++++ .github/scripts/Build-Windows.ps1 | 101 ++ .github/scripts/Package-Windows.ps1 | 92 ++ .github/scripts/build-linux.sh | 13 + .github/scripts/build-linux.zsh | 1 + .github/scripts/build-macos.zsh | 1 + .../scripts/check-changes.sh | 0 .github/scripts/check-cmake.sh | 53 + .github/scripts/check-format.sh | 60 ++ .github/scripts/package-linux.sh | 13 + .github/scripts/package-linux.zsh | 1 + .github/scripts/package-macos.zsh | 1 + .github/scripts/utils.pwsh/Check-Git.ps1 | 25 + .../scripts/utils.pwsh/Ensure-Location.ps1 | 29 + .../scripts/utils.pwsh/Expand-ArchiveExt.ps1 | 70 ++ .../utils.pwsh/Install-BuildDependencies.ps1 | 60 ++ .../scripts/utils.pwsh/Invoke-External.ps1 | 40 + .../scripts/utils.pwsh/Invoke-GitCheckout.ps1 | 117 +++ .github/scripts/utils.pwsh/Logger.ps1 | 123 +++ .github/scripts/utils.pwsh/Setup-Host.ps1 | 103 ++ .github/scripts/utils.pwsh/Setup-Obs.ps1 | 84 ++ .github/scripts/utils.zsh/check_linux | 36 + .github/scripts/utils.zsh/check_macos | 20 + .github/scripts/utils.zsh/check_packages | 52 + .github/scripts/utils.zsh/log_debug | 3 + .github/scripts/utils.zsh/log_error | 3 + .github/scripts/utils.zsh/log_info | 7 + .github/scripts/utils.zsh/log_output | 7 + .github/scripts/utils.zsh/log_status | 7 + .github/scripts/utils.zsh/log_warning | 5 + .github/scripts/utils.zsh/mkcd | 1 + .github/scripts/utils.zsh/read_codesign | 7 + .../scripts/utils.zsh/read_codesign_installer | 7 + .github/scripts/utils.zsh/read_codesign_pass | 33 + .github/scripts/utils.zsh/read_codesign_user | 7 + .github/scripts/utils.zsh/set_loglevel | 17 + .github/scripts/utils.zsh/setup_ccache | 14 + .github/scripts/utils.zsh/setup_linux | 62 ++ .github/scripts/utils.zsh/setup_macos | 127 +++ .github/scripts/utils.zsh/setup_obs | 122 +++ .github/workflows/clang-format.yml | 20 - .github/workflows/main.yml | 495 +++++++--- .gitignore | 1 + CMakeLists.txt | 268 ++--- buildspec.json | 86 ++ ci/ci_includes.cmd.in | 2 - ci/ci_includes.sh.in | 4 - ci/linux/build-ubuntu.sh | 6 - ci/linux/install-dependencies-ubuntu.sh | 19 - ci/linux/package-ubuntu.sh | 20 - ci/macos/build-macos.sh | 26 - ci/macos/install-build-obs-macos.sh | 40 - ci/macos/install-dependencies-macos.sh | 35 - ci/macos/package-macos.sh | 88 -- ci/macos/qt.rb | 163 ---- ci/windows/download-obs-deps.cmd | 6 - ci/windows/install-qt-win.cmd | 8 - ci/windows/package-windows.cmd | 14 - ci/windows/prepare-obs-windows.cmd | 36 - ci/windows/prepare-windows.cmd | 15 - cmake/ObsPluginHelpers.cmake | 704 ++++++++++++++ cmake/bundle/macos/Plugin-Info.plist.in | 26 + cmake/bundle/macos/entitlements.plist | 17 + cmake/bundle/macos/installer-macos.pkgproj.in | 920 ++++++++++++++++++ .../bundle/windows}/installer-Windows.iss.in | 5 +- cmake/bundle/windows/resource.rc.in | 32 + external/FindLibObs.cmake | 107 -- formatcode.sh | 32 - installer/installer-macOS.pkgproj.in | 726 -------------- src/files.cpp | 174 +--- src/files.h | 6 +- src/obs-text-freetype2-slideshow.cpp | 7 +- src/obs-text-gdiplus-slideshow.cpp | 21 +- src/obs-text-slideshow-dock.cpp | 39 +- src/obs-text-slideshow.cpp | 167 +++- src/obs-text-slideshow.h | 5 + src/utils.cpp | 147 +++ src/utils.h | 17 + 85 files changed, 4777 insertions(+), 1903 deletions(-) create mode 100644 .cmake-format.json create mode 100644 .github/actions/build-plugin/action.yml create mode 100644 .github/actions/package-plugin/action.yml create mode 100644 .github/scripts/.Aptfile create mode 100644 .github/scripts/.Brewfile create mode 100644 .github/scripts/.Wingetfile create mode 100755 .github/scripts/.build.zsh create mode 100755 .github/scripts/.package.zsh create mode 100644 .github/scripts/Build-Windows.ps1 create mode 100644 .github/scripts/Package-Windows.ps1 create mode 100755 .github/scripts/build-linux.sh create mode 120000 .github/scripts/build-linux.zsh create mode 120000 .github/scripts/build-macos.zsh rename ci/check-format.sh => .github/scripts/check-changes.sh (100%) create mode 100755 .github/scripts/check-cmake.sh create mode 100755 .github/scripts/check-format.sh create mode 100755 .github/scripts/package-linux.sh create mode 120000 .github/scripts/package-linux.zsh create mode 120000 .github/scripts/package-macos.zsh create mode 100644 .github/scripts/utils.pwsh/Check-Git.ps1 create mode 100644 .github/scripts/utils.pwsh/Ensure-Location.ps1 create mode 100644 .github/scripts/utils.pwsh/Expand-ArchiveExt.ps1 create mode 100644 .github/scripts/utils.pwsh/Install-BuildDependencies.ps1 create mode 100644 .github/scripts/utils.pwsh/Invoke-External.ps1 create mode 100644 .github/scripts/utils.pwsh/Invoke-GitCheckout.ps1 create mode 100644 .github/scripts/utils.pwsh/Logger.ps1 create mode 100644 .github/scripts/utils.pwsh/Setup-Host.ps1 create mode 100644 .github/scripts/utils.pwsh/Setup-Obs.ps1 create mode 100644 .github/scripts/utils.zsh/check_linux create mode 100644 .github/scripts/utils.zsh/check_macos create mode 100644 .github/scripts/utils.zsh/check_packages create mode 100644 .github/scripts/utils.zsh/log_debug create mode 100644 .github/scripts/utils.zsh/log_error create mode 100644 .github/scripts/utils.zsh/log_info create mode 100644 .github/scripts/utils.zsh/log_output create mode 100644 .github/scripts/utils.zsh/log_status create mode 100644 .github/scripts/utils.zsh/log_warning create mode 100644 .github/scripts/utils.zsh/mkcd create mode 100644 .github/scripts/utils.zsh/read_codesign create mode 100644 .github/scripts/utils.zsh/read_codesign_installer create mode 100644 .github/scripts/utils.zsh/read_codesign_pass create mode 100644 .github/scripts/utils.zsh/read_codesign_user create mode 100644 .github/scripts/utils.zsh/set_loglevel create mode 100644 .github/scripts/utils.zsh/setup_ccache create mode 100644 .github/scripts/utils.zsh/setup_linux create mode 100644 .github/scripts/utils.zsh/setup_macos create mode 100644 .github/scripts/utils.zsh/setup_obs delete mode 100644 .github/workflows/clang-format.yml create mode 100644 buildspec.json delete mode 100644 ci/ci_includes.cmd.in delete mode 100644 ci/ci_includes.sh.in delete mode 100755 ci/linux/build-ubuntu.sh delete mode 100755 ci/linux/install-dependencies-ubuntu.sh delete mode 100755 ci/linux/package-ubuntu.sh delete mode 100755 ci/macos/build-macos.sh delete mode 100755 ci/macos/install-build-obs-macos.sh delete mode 100755 ci/macos/install-dependencies-macos.sh delete mode 100755 ci/macos/package-macos.sh delete mode 100644 ci/macos/qt.rb delete mode 100644 ci/windows/download-obs-deps.cmd delete mode 100644 ci/windows/install-qt-win.cmd delete mode 100644 ci/windows/package-windows.cmd delete mode 100644 ci/windows/prepare-obs-windows.cmd delete mode 100644 ci/windows/prepare-windows.cmd create mode 100644 cmake/ObsPluginHelpers.cmake create mode 100644 cmake/bundle/macos/Plugin-Info.plist.in create mode 100644 cmake/bundle/macos/entitlements.plist create mode 100644 cmake/bundle/macos/installer-macos.pkgproj.in rename {installer => cmake/bundle/windows}/installer-Windows.iss.in (95%) create mode 100644 cmake/bundle/windows/resource.rc.in delete mode 100644 external/FindLibObs.cmake delete mode 100755 formatcode.sh delete mode 100644 installer/installer-macOS.pkgproj.in create mode 100644 src/utils.cpp create mode 100644 src/utils.h diff --git a/.cmake-format.json b/.cmake-format.json new file mode 100644 index 0000000..eb7d554 --- /dev/null +++ b/.cmake-format.json @@ -0,0 +1,16 @@ +{ + "additional_commands": { + "find_qt": { + "flags": [], + "kwargs": { + "COMPONENTS": "+", + "COMPONENTS_WIN": "+", + "COMPONENTS_MACOS": "+", + "COMPONENTS_LINUX": "+" + } + } + }, + "format": { + "line_width": 100 + } +} diff --git a/.github/actions/build-plugin/action.yml b/.github/actions/build-plugin/action.yml new file mode 100644 index 0000000..1e91d15 --- /dev/null +++ b/.github/actions/build-plugin/action.yml @@ -0,0 +1,77 @@ +name: 'Setup and build plugin' +description: 'Builds the plugin for specified architecture and build config.' +inputs: + target: + description: 'Build target for dependencies' + required: true + config: + description: 'Build configuration' + required: false + default: 'Release' + codesign: + description: 'Enable codesigning (macOS only)' + required: false + default: 'false' + codesignIdent: + description: 'Developer ID for application codesigning (macOS only)' + required: false + default: '-' + visualStudio: + description: 'Visual Studio version (Windows only)' + required: false + default: 'Visual Studio 16 2019' + workingDirectory: + description: 'Working directory for packaging' + required: false + default: ${{ github.workspace }} +runs: + using: 'composite' + steps: + - name: Run macOS Build + if: ${{ runner.os == 'macOS' }} + shell: zsh {0} + env: + CODESIGN_IDENT: ${{ inputs.codesignIdent }} + run: | + build_args=( + -c ${{ inputs.config }} + -t macos-${{ inputs.target }} + ) + + if [[ '${{ inputs.codesign }}' == 'true' ]] build_args+=(-s) + if (( ${+CI} && ${+RUNNER_DEBUG} )) build_args+=(--debug) + + ${{ inputs.workingDirectory }}/.github/scripts/build-macos.zsh ${build_args} + + - name: Run Linux Build + if: ${{ runner.os == 'Linux' }} + shell: bash + run: | + build_args=( + -c ${{ inputs.config }} + -t linux-${{ inputs.target }} + ) + + if [[ -n "${CI}" && -n "${RUNNER_DEBUG}" ]]; then + build_args+=(--debug) + fi + + ${{ inputs.workingDirectory }}/.github/scripts/build-linux.sh "${build_args[@]}" + + - name: Run Windows Build + if: ${{ runner.os == 'Windows' }} + shell: pwsh + run: | + $BuildArgs = @{ + Target = '${{ inputs.target }}' + Configuration = '${{ inputs.config }}' + CMakeGenerator = '${{ inputs.visualStudio }}' + } + + if ( ( Test-Path env:CI ) -and ( Test-Path env:RUNNER_DEBUG ) ) { + $BuildArgs += @{ + Debug = $true + } + } + + ${{ inputs.workingDirectory }}/.github/scripts/Build-Windows.ps1 @BuildArgs diff --git a/.github/actions/package-plugin/action.yml b/.github/actions/package-plugin/action.yml new file mode 100644 index 0000000..094803e --- /dev/null +++ b/.github/actions/package-plugin/action.yml @@ -0,0 +1,99 @@ +name: 'Package plugin' +description: 'Packages the plugin for specified architecture and build config.' +inputs: + target: + description: 'Build target for dependencies' + required: true + config: + description: 'Build configuration' + required: false + default: 'Release' + codesign: + description: 'Enable codesigning (macOS only)' + required: false + default: 'false' + notarize: + description: 'Enable notarization (macOS only)' + required: false + default: 'false' + codesignIdent: + description: 'Developer ID for application codesigning (macOS only)' + required: false + default: '-' + installerIdent: + description: 'Developer ID for installer package codesigning (macOS only)' + required: false + default: '' + codesignUser: + description: 'Apple ID username for notarization (macOS only)' + required: false + default: '' + codesignPass: + description: 'Apple ID password for notarization (macOS only)' + required: false + default: '' + createInstaller: + description: 'Create InnoSetup installer (Windows only)' + required: false + default: 'false' + workingDirectory: + description: 'Working directory for packaging' + required: false + default: ${{ github.workspace }} +runs: + using: 'composite' + steps: + - name: Run macOS packaging + if: ${{ runner.os == 'macOS' }} + shell: zsh {0} + env: + CODESIGN_IDENT: ${{ inputs.codesignIdent }} + CODESIGN_IDENT_INSTALLER: ${{ inputs.installerIdent }} + CODESIGN_IDENT_USER: ${{ inputs.codesignUser }} + CODESIGN_IDENT_PASS: ${{ inputs.codesignPass }} + run: | + package_args=( + -c ${{ inputs.config }} + -t macos-${{ inputs.target }} + ) + + if [[ '${{ inputs.codesign }}' == 'true' ]] package_args+=(-s) + if [[ '${{ inputs.notarize }}' == 'true' ]] package_args+=(-n) + if (( ${+CI} && ${+RUNNER_DEBUG} )) build_args+=(--debug) + + ${{ inputs.workingDirectory }}/.github/scripts/package-macos.zsh ${package_args} + + - name: Run Linux packaging + if: ${{ runner.os == 'Linux' }} + shell: bash + run: | + package_args=( + -c ${{ inputs.config }} + -t linux-${{ inputs.target }} + ) + if [[ -n "${CI}" && -n "${RUNNER_DEBUG}" ]]; then + build_args+=(--debug) + fi + + ${{ inputs.workingDirectory }}/.github/scripts/package-linux.sh "${package_args[@]}" + + - name: Run Windows packaging + if: ${{ runner.os == 'Windows' }} + shell: pwsh + run: | + $PackageArgs = @{ + Target = '${{ inputs.target }}' + Configuration = '${{ inputs.config }}' + } + + if ( '${{ inputs.createInstaller }}' -eq 'true' ) { + $PackageArgs += @{BuildInstaller = $true} + } + + if ( ( Test-Path env:CI ) -and ( Test-Path env:RUNNER_DEBUG ) ) { + $BuildArgs += @{ + Debug = $true + } + } + + ${{ inputs.workingDirectory }}/.github/scripts/Package-Windows.ps1 @PackageArgs diff --git a/.github/scripts/.Aptfile b/.github/scripts/.Aptfile new file mode 100644 index 0000000..59196f0 --- /dev/null +++ b/.github/scripts/.Aptfile @@ -0,0 +1,9 @@ +package 'cmake' +package 'ccache' +package 'curl' +package 'git' +package 'jq' +package 'ninja-build', bin: 'ninja' +package 'pkg-config' +package 'clang' +package 'clang-format-13' diff --git a/.github/scripts/.Brewfile b/.github/scripts/.Brewfile new file mode 100644 index 0000000..6990ecf --- /dev/null +++ b/.github/scripts/.Brewfile @@ -0,0 +1,6 @@ +brew "ccache" +brew "coreutils" +brew "cmake" +brew "git" +brew "jq" +brew "ninja" diff --git a/.github/scripts/.Wingetfile b/.github/scripts/.Wingetfile new file mode 100644 index 0000000..4e7c46e --- /dev/null +++ b/.github/scripts/.Wingetfile @@ -0,0 +1,3 @@ +package '7zip.7zip', path: '7-zip', bin: '7z' +package 'cmake', path: 'Cmake\bin', bin: 'cmake' +package 'innosetup', path: 'Inno Setup 6', bin: 'iscc' diff --git a/.github/scripts/.build.zsh b/.github/scripts/.build.zsh new file mode 100755 index 0000000..c93dfa1 --- /dev/null +++ b/.github/scripts/.build.zsh @@ -0,0 +1,249 @@ +#!/usr/bin/env zsh + +builtin emulate -L zsh +setopt EXTENDED_GLOB +setopt PUSHD_SILENT +setopt ERR_EXIT +setopt ERR_RETURN +setopt NO_UNSET +setopt PIPE_FAIL +setopt NO_AUTO_PUSHD +setopt NO_PUSHD_IGNORE_DUPS +setopt FUNCTION_ARGZERO + +## Enable for script debugging +# setopt WARN_CREATE_GLOBAL +# setopt WARN_NESTED_VAR +# setopt XTRACE + +autoload -Uz is-at-least && if ! is-at-least 5.2; then + print -u2 -PR "%F{1}${funcstack[1]##*/}:%f Running on Zsh version %B${ZSH_VERSION}%b, but Zsh %B5.2%b is the minimum supported version. Upgrade Zsh to fix this issue." + exit 1 +fi + +_trap_error() { + print -u2 -PR '%F{1} ✖︎ script execution error%f' + print -PR -e " + Callstack: + ${(j:\n :)funcfiletrace} + " + exit 2 +} + +build() { + if (( ! ${+SCRIPT_HOME} )) typeset -g SCRIPT_HOME=${ZSH_ARGZERO:A:h} + local host_os=${${(s:-:)ZSH_ARGZERO:t:r}[2]} + local target="${host_os}-${CPUTYPE}" + local project_root=${SCRIPT_HOME:A:h:h} + local buildspec_file="${project_root}/buildspec.json" + + trap '_trap_error' ZERR + + fpath=("${SCRIPT_HOME}/utils.zsh" ${fpath}) + autoload -Uz log_info log_error log_output set_loglevel check_${host_os} setup_${host_os} setup_obs setup_ccache + + if [[ ! -r ${buildspec_file} ]] { + log_error \ + 'No buildspec.json found. Please create a build specification for your project.' \ + 'A buildspec.json.template file is provided in the repository to get you started.' + return 2 + } + + typeset -g -a skips=() + local -i _verbosity=1 + local -r _version='1.0.0' + local -r -a _valid_targets=( + macos-x86_64 + macos-arm64 + macos-universal + linux-x86_64 + linux-aarch64 + ) + local -r -a _valid_configs=(Debug RelWithDebInfo Release MinSizeRel) + if [[ ${host_os} == 'macos' ]] { + local -r -a _valid_generators=(Xcode Ninja 'Unix Makefiles') + local generator="${${CI:+Ninja}:-Xcode}" + } else { + local -r -a _valid_generators=(Ninja 'Unix Makefiles') + local generator='Ninja' + } + local -r _usage=" +Usage: %B${functrace[1]%:*}%b