From 90e08d24e462588be867ca94f452637f0844b760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20=C5=BBy=C5=BAniewski?= Date: Fri, 12 May 2023 12:36:09 +0200 Subject: [PATCH] init: obs-plugintemplate --- .clang-format | 107 ++ .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 | 265 +++++ .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 + .github/scripts/check-changes.sh | 11 + .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/main.yml | 401 ++++++++ .gitignore | 13 + CMakeLists.txt | 92 ++ LICENSE | 339 +++++++ README.md | 59 ++ buildspec.json | 88 ++ cmake/ObsPluginHelpers.cmake | 699 +++++++++++++ cmake/bundle/macos/Plugin-Info.plist.in | 26 + cmake/bundle/macos/entitlements.plist | 17 + cmake/bundle/macos/installer-macos.pkgproj.in | 920 ++++++++++++++++++ cmake/bundle/windows/installer-Windows.iss.in | 64 ++ cmake/bundle/windows/resource.rc.in | 32 + data/locale/en-US.ini | 0 src/plugin-macros.h.in | 27 + src/plugin-main.c | 36 + 63 files changed, 5123 insertions(+) create mode 100644 .clang-format 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 create mode 100755 .github/scripts/check-changes.sh 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 create mode 100644 .github/workflows/main.yml create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 README.md create mode 100644 buildspec.json 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 create mode 100644 cmake/bundle/windows/installer-Windows.iss.in create mode 100644 cmake/bundle/windows/resource.rc.in create mode 100644 data/locale/en-US.ini create mode 100644 src/plugin-macros.h.in create mode 100644 src/plugin-main.c diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..c9dfc48 --- /dev/null +++ b/.clang-format @@ -0,0 +1,107 @@ +# please use clang-format version 8 or later + +Standard: Cpp11 +AccessModifierOffset: -8 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Left +AlignOperands: true +AlignTrailingComments: true +#AllowAllArgumentsOnNextLine: false # requires clang-format 9 +#AllowAllConstructorInitializersOnNextLine: false # requires clang-format 9 +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: false +#AllowShortLambdasOnASingleLine: Inline # requires clang-format 9 +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: false +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: true + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Custom +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeColon +BreakStringLiterals: false # apparently unpredictable +ColumnLimit: 80 +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 8 +ContinuationIndentWidth: 8 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +FixNamespaceComments: false +ForEachMacros: + - 'json_object_foreach' + - 'json_object_foreach_safe' + - 'json_array_foreach' +IncludeBlocks: Preserve +IndentCaseLabels: false +IndentPPDirectives: None +IndentWidth: 8 +IndentWrappedFunctionNames: false +KeepEmptyLinesAtTheStartOfBlocks: true +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +#ObjCBinPackProtocolList: Auto # requires clang-format 7 +ObjCBlockIndentWidth: 8 +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: true + +PenaltyBreakAssignment: 10 +PenaltyBreakBeforeFirstCallParameter: 30 +PenaltyBreakComment: 10 +PenaltyBreakFirstLessLess: 0 +PenaltyBreakString: 10 +PenaltyExcessCharacter: 100 +PenaltyReturnTypeOnItsOwnLine: 60 + +PointerAlignment: Right +ReflowComments: false +SortIncludes: false +SortUsingDeclarations: false +SpaceAfterCStyleCast: false +#SpaceAfterLogicalNot: false # requires clang-format 9 +SpaceAfterTemplateKeyword: false +SpaceBeforeAssignmentOperators: true +#SpaceBeforeCtorInitializerColon: true # requires clang-format 7 +#SpaceBeforeInheritanceColon: true # requires clang-format 7 +SpaceBeforeParens: ControlStatements +#SpaceBeforeRangeBasedForLoopColon: true # requires clang-format 7 +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInCStyleCastParentheses: false +SpacesInContainerLiterals: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +#StatementMacros: # requires clang-format 8 +# - 'Q_OBJECT' +TabWidth: 8 +#TypenameMacros: # requires clang-format 9 +# - 'DARRAY' +UseTab: ForContinuationAndIndentation +--- +Language: ObjC 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..e2171a7 --- /dev/null +++ b/.github/scripts/.build.zsh @@ -0,0 +1,265 @@ +#!/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