diff --git a/.clang-format b/.clang-format index c9dfc48e9..38b431e17 100644 --- a/.clang-format +++ b/.clang-format @@ -1,6 +1,6 @@ -# please use clang-format version 8 or later +# please use clang-format version 16 or later -Standard: Cpp11 +Standard: c++17 AccessModifierOffset: -8 AlignAfterOpenBracket: Align AlignConsecutiveAssignments: false @@ -8,14 +8,14 @@ AlignConsecutiveDeclarations: false AlignEscapedNewlines: Left AlignOperands: true AlignTrailingComments: true -#AllowAllArgumentsOnNextLine: false # requires clang-format 9 -#AllowAllConstructorInitializersOnNextLine: false # requires clang-format 9 +AllowAllArgumentsOnNextLine: false +AllowAllConstructorInitializersOnNextLine: false AllowAllParametersOfDeclarationOnNextLine: false AllowShortBlocksOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false AllowShortFunctionsOnASingleLine: Inline AllowShortIfStatementsOnASingleLine: false -#AllowShortLambdasOnASingleLine: Inline # requires clang-format 9 +AllowShortLambdasOnASingleLine: Inline AllowShortLoopsOnASingleLine: false AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None @@ -52,11 +52,12 @@ ContinuationIndentWidth: 8 Cpp11BracedListStyle: true DerivePointerAlignment: false DisableFormat: false -FixNamespaceComments: false -ForEachMacros: +FixNamespaceComments: true +ForEachMacros: - 'json_object_foreach' - 'json_object_foreach_safe' - 'json_array_foreach' + - 'HASH_ITER' IncludeBlocks: Preserve IndentCaseLabels: false IndentPPDirectives: None @@ -65,7 +66,7 @@ IndentWrappedFunctionNames: false KeepEmptyLinesAtTheStartOfBlocks: true MaxEmptyLinesToKeep: 1 NamespaceIndentation: None -#ObjCBinPackProtocolList: Auto # requires clang-format 7 +ObjCBinPackProtocolList: Auto ObjCBlockIndentWidth: 8 ObjCSpaceAfterProperty: true ObjCSpaceBeforeProtocolList: true @@ -83,13 +84,13 @@ ReflowComments: false SortIncludes: false SortUsingDeclarations: false SpaceAfterCStyleCast: false -#SpaceAfterLogicalNot: false # requires clang-format 9 +SpaceAfterLogicalNot: false SpaceAfterTemplateKeyword: false SpaceBeforeAssignmentOperators: true -#SpaceBeforeCtorInitializerColon: true # requires clang-format 7 -#SpaceBeforeInheritanceColon: true # requires clang-format 7 +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true SpaceBeforeParens: ControlStatements -#SpaceBeforeRangeBasedForLoopColon: true # requires clang-format 7 +SpaceBeforeRangeBasedForLoopColon: true SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 1 SpacesInAngles: false @@ -97,11 +98,111 @@ SpacesInCStyleCastParentheses: false SpacesInContainerLiterals: false SpacesInParentheses: false SpacesInSquareBrackets: false -#StatementMacros: # requires clang-format 8 -# - 'Q_OBJECT' +StatementMacros: + - 'Q_OBJECT' TabWidth: 8 -#TypenameMacros: # requires clang-format 9 -# - 'DARRAY' +TypenameMacros: + - 'DARRAY' UseTab: ForContinuationAndIndentation --- Language: ObjC +AccessModifierOffset: 2 +AlignArrayOfStructures: Right +AlignConsecutiveAssignments: None +AlignConsecutiveBitFields: None +AlignConsecutiveDeclarations: None +AlignConsecutiveMacros: + Enabled: true + AcrossEmptyLines: false + AcrossComments: true +AllowShortBlocksOnASingleLine: Never +AllowShortEnumsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Empty +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: None +AttributeMacros: ['__unused', '__autoreleasing', '_Nonnull', '__bridge'] +BitFieldColonSpacing: Both +#BreakBeforeBraces: Webkit +BreakBeforeBraces: Custom +BraceWrapping: + AfterCaseLabel: false + AfterClass: true + AfterControlStatement: Never + AfterEnum: false + AfterFunction: true + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: false + SplitEmptyRecord: false + SplitEmptyNamespace: true +BreakAfterAttributes: Never +BreakArrays: false +BreakBeforeConceptDeclarations: Allowed +BreakBeforeInlineASMColon: OnlyMultiline +BreakConstructorInitializers: AfterColon +BreakInheritanceList: AfterComma +ColumnLimit: 120 +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +IndentAccessModifiers: false +IndentCaseBlocks: false +IndentCaseLabels: true +IndentExternBlock: Indent +IndentGotoLabels: false +IndentRequiresClause: true +IndentWidth: 4 +IndentWrappedFunctionNames: true +InsertBraces: false +InsertNewlineAtEOF: true +KeepEmptyLinesAtTheStartOfBlocks: false +LambdaBodyIndentation: Signature +NamespaceIndentation: All +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 4 +ObjCBreakBeforeNestedBlockParam: false +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: true +PPIndentWidth: -1 +PackConstructorInitializers: NextLine +QualifierAlignment: Leave +ReferenceAlignment: Right +RemoveSemicolon: false +RequiresClausePosition: WithPreceding +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Always +ShortNamespaceLines: 1 +SortIncludes: false +#SortUsingDeclarations: LexicographicNumeric +SortUsingDeclarations: true +SpaceAfterCStyleCast: true +SpaceAfterLogicalNot: false +SpaceAroundPointerQualifiers: Default +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: true +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 2 +SpacesInConditionalStatement: false +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +Standard: c++17 +TabWidth: 4 +UseTab: Never diff --git a/.cmake-format.json b/.cmake-format.json new file mode 100644 index 000000000..67919c2cf --- /dev/null +++ b/.cmake-format.json @@ -0,0 +1,40 @@ +{ + "format": { + "line_width": 80, + "tab_size": 2, + "enable_sort": true, + "autosort": true + }, + "additional_commands": { + "find_qt": { + "flags": [], + "kwargs": { + "COMPONENTS": "+", + "COMPONENTS_WIN": "+", + "COMPONENTS_MACOS": "+", + "COMPONENTS_LINUX": "+" + } + }, + "set_target_properties_obs": { + "pargs": 1, + "flags": [], + "kwargs": { + "PROPERTIES": { + "kwargs": { + "PREFIX": 1, + "OUTPUT_NAME": 1, + "FOLDER": 1, + "VERSION": 1, + "SOVERSION": 1, + "AUTOMOC": 1, + "AUTOUIC": 1, + "AUTORCC": 1, + "AUTOUIC_SEARCH_PATHS": 1, + "BUILD_RPATH": 1, + "INSTALL_RPATH": 1 + } + } + } + } + } +} diff --git a/.github/actions/build-dependencies/action.yml b/.github/actions/build-dependencies/action.yaml similarity index 80% rename from .github/actions/build-dependencies/action.yml rename to .github/actions/build-dependencies/action.yaml index 1aa77e48b..838f1fd25 100644 --- a/.github/actions/build-dependencies/action.yml +++ b/.github/actions/build-dependencies/action.yaml @@ -26,7 +26,7 @@ runs: - name: Restore cached dependencies id: restore-cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ env.DEP_DIR }} key: ${{ env.DEP_DIR }}-${{ runner.os }}-${{ inputs.target }} @@ -37,12 +37,13 @@ runs: run: | build_args=( -c ${{ inputs.config }} - -t macos-${{ inputs.target }} + -t ${{ inputs.target }} + -o ${{ env.DEP_DIR }} ) if (( ${+CI} && ${+RUNNER_DEBUG} )) build_args+=(--debug) - ${{ inputs.workingDirectory }}/.github/scripts/build-deps-macos.zsh -o ${{ env.DEP_DIR }} ${build_args} + .github/scripts/build-deps-macos.zsh -o ${{ env.DEP_DIR }} ${build_args} - name: Run Linux Build if: ${{ runner.os == 'Linux' && steps.restore-cache.outputs.cache-hit != 'true' }} @@ -57,7 +58,7 @@ runs: build_args+=(--debug) fi - ${{ inputs.workingDirectory }}/.github/scripts/build-deps-linux.sh -o ${{ env.DEP_DIR }} "${build_args[@]}" + .github/scripts/build-deps-linux.sh -o ${{ env.DEP_DIR }} "${build_args[@]}" - name: Run Windows Build if: ${{ runner.os == 'Windows' && steps.restore-cache.outputs.cache-hit != 'true' }} @@ -66,7 +67,7 @@ runs: $BuildArgs = @{ Target = '${{ inputs.target }}' Configuration = '${{ inputs.config }}' - CMakeGenerator = '${{ inputs.visualStudio }}' + OutDirName = '${{ env.DEP_DIR }}' } if ( ( Test-Path env:CI ) -and ( Test-Path env:RUNNER_DEBUG ) ) { @@ -75,5 +76,5 @@ runs: } } - ${{ inputs.workingDirectory }}/.github/scripts/Build-Deps-Windows.ps1 -OutDirName ${{ env.DEP_DIR }} @BuildArgs + .github/scripts/Build-Deps-Windows.ps1 -OutDirName ${{ env.DEP_DIR }} @BuildArgs diff --git a/.github/actions/build-plugin/action.yaml b/.github/actions/build-plugin/action.yaml new file mode 100644 index 000000000..0fde0ed8e --- /dev/null +++ b/.github/actions/build-plugin/action.yaml @@ -0,0 +1,110 @@ +name: 'Set up and build plugin' +description: 'Builds the plugin for specified architecture and build config' +inputs: + target: + description: 'Target architecture for dependencies' + required: true + config: + description: 'Build configuration' + required: false + default: 'RelWithDebInfo' + codesign: + description: 'Enable codesigning (macOS only)' + required: false + default: 'false' + codesignIdent: + description: 'Developer ID for application codesigning (macOS only)' + required: false + default: '-' + 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 --no-rcs --errexit --pipefail {0} + working-directory: ${{ inputs.workingDirectory }} + env: + CODESIGN_IDENT: ${{ inputs.codesignIdent }} + CODESIGN_TEAM: ${{ inputs.codesignTeam }} + run: | + : Run macOS Build + + local -a build_args=( + --config ${{ inputs.config }} + --dep ${{ env.DEP_DIR }} + ) + if (( ${+RUNNER_DEBUG} )) build_args+=(--debug) + + if [[ '${{ inputs.codesign }}' == 'true' ]] build_args+=(--codesign) + + .github/scripts/build-macos ${build_args} + + - name: Install Dependencies 🛍️ + if: runner.os == 'Linux' + shell: bash + run: | + : Install Dependencies 🛍️ + echo ::group::Install Dependencies + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" + echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH + brew install --quiet zsh + echo ::endgroup:: + + - name: Run Ubuntu Build + if: runner.os == 'Linux' + shell: zsh --no-rcs --errexit --pipefail {0} + working-directory: ${{ inputs.workingDirectory }} + run: | + : Run Ubuntu Build + + local -a build_args=( + --target linux-${{ inputs.target }} + --config ${{ inputs.config }} + ) + if (( ${+RUNNER_DEBUG} )) build_args+=(--debug) + + .github/scripts/build-linux ${build_args} + + - name: Run Windows Build + if: runner.os == 'Windows' + shell: pwsh + run: | + # Run Windows Build + if ( $Env:RUNNER_DEBUG -ne $null ) { + Set-PSDebug -Trace 1 + } + + $BuildArgs = @{ + Target = '${{ inputs.target }}' + Configuration = '${{ inputs.config }}' + ADVSSDepName = '${{ env.DEP_DIR }}' + } + + .github/scripts/Build-Windows.ps1 @BuildArgs + + - name: Create Summary 📊 + if: contains(fromJSON('["Linux", "macOS"]'),runner.os) + shell: zsh --no-rcs --errexit --pipefail {0} + env: + CCACHE_CONFIGPATH: ${{ inputs.workingDirectory }}/.ccache.conf + run: | + : Create Summary 📊 + + local -a ccache_data + if (( ${+RUNNER_DEBUG} )) { + setopt XTRACE + ccache_data=("${(fA)$(ccache -s -vv)}") + } else { + ccache_data=("${(fA)$(ccache -s)}") + } + + print '### ${{ runner.os }} Ccache Stats (${{ inputs.target }})' >> $GITHUB_STEP_SUMMARY + print '```' >> $GITHUB_STEP_SUMMARY + for line (${ccache_data}) { + print ${line} >> $GITHUB_STEP_SUMMARY + } + print '```' >> $GITHUB_STEP_SUMMARY diff --git a/.github/actions/build-plugin/action.yml b/.github/actions/build-plugin/action.yml deleted file mode 100644 index 9405cae19..000000000 --- a/.github/actions/build-plugin/action.yml +++ /dev/null @@ -1,89 +0,0 @@ -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' - portable: - description: 'Set portable mode (Linux only)' - required: false - default: 'false' - workingDirectory: - description: 'Working directory for packaging' - required: false - default: ${{ github.workspace }} -runs: - using: 'composite' - steps: - - name: Setup cmake - uses: jwlawson/actions-setup-cmake@v1.13 - with: - cmake-version: '3.24.x' - - 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 -d ${{ env.DEP_DIR }} ${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 - - if [[ '${{ inputs.portable }}' == 'true' ]]; then - build_args+=(-p) - fi - - ${{ inputs.workingDirectory }}/.github/scripts/build-linux.sh -d ${{ env.DEP_DIR }} "${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 -ADVSSDepName ${{ env.DEP_DIR }} @BuildArgs diff --git a/.github/actions/package-plugin/action.yaml b/.github/actions/package-plugin/action.yaml new file mode 100644 index 000000000..13e78071e --- /dev/null +++ b/.github/actions/package-plugin/action.yaml @@ -0,0 +1,117 @@ +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: 'RelWithDebInfo' + 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: '' + codesignTeam: + description: 'Developer team for 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: '' + package: + description: 'Create Windows or macOS installation package' + required: false + default: 'true' + 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 --no-rcs --errexit --pipefail {0} + working-directory: ${{ inputs.workingDirectory }} + env: + CODESIGN_IDENT: ${{ inputs.codesignIdent }} + CODESIGN_IDENT_INSTALLER: ${{ inputs.installerIdent }} + CODESIGN_TEAM: ${{ inputs.codesignTeam }} + CODESIGN_IDENT_USER: ${{ inputs.codesignUser }} + CODESIGN_IDENT_PASS: ${{ inputs.codesignPass }} + run: | + : Run macOS Packaging + + local -a package_args=(--config ${{ inputs.config }}) + if (( ${+RUNNER_DEBUG} )) package_args+=(--debug) + + if [[ '${{ inputs.codesign }}' == 'true' ]] package_args+=(--codesign) + if [[ '${{ inputs.notarize }}' == 'true' ]] package_args+=(--notarize) + if [[ '${{ inputs.package }}' == 'true' ]] package_args+=(--package) + + .github/scripts/package-macos ${package_args} + + - name: Install Dependencies 🛍️ + if: runner.os == 'Linux' + shell: bash + run: | + : Install Dependencies 🛍️ + echo ::group::Install Dependencies + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" + echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH + brew install --quiet zsh + echo ::endgroup:: + + - name: Run Ubuntu Packaging + if: runner.os == 'Linux' + shell: zsh --no-rcs --errexit --pipefail {0} + working-directory: ${{ inputs.workingDirectory }} + run: | + : Run Ubuntu Packaging + package_args=( + --target linux-${{ inputs.target }} + --config ${{ inputs.config }} + ) + if (( ${+RUNNER_DEBUG} )) build_args+=(--debug) + + if [[ '${{ inputs.package }}' == 'true' ]] package_args+=(--package) + + .github/scripts/package-linux ${package_args} + + - name: Run Windows Packaging + if: runner.os == 'Windows' + shell: pwsh + run: | + # Run Windows Packaging + if ( $Env:RUNNER_DEBUG -ne $null ) { + Set-PSDebug -Trace 1 + } + + $PackageArgs = @{ + Target = '${{ inputs.target }}' + Configuration = '${{ inputs.config }}' + } + + if ( '${{ inputs.package }}' -eq 'true' ) { + $PackageArgs += @{BuildInstaller = $true} + } + + .github/scripts/Package-Windows.ps1 @PackageArgs diff --git a/.github/actions/package-plugin/action.yml b/.github/actions/package-plugin/action.yml deleted file mode 100644 index dbe5f9da2..000000000 --- a/.github/actions/package-plugin/action.yml +++ /dev/null @@ -1,109 +0,0 @@ -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' - portable: - description: 'Create deb package / portable archive (Linux 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) - - package_args+=(-z) - - ${{ 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 - - if [[ '${{ inputs.portable }}' == 'true' ]]; then - package_args+=(-z) - 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/actions/run-clang-format/action.yaml b/.github/actions/run-clang-format/action.yaml new file mode 100644 index 000000000..9e873b4dd --- /dev/null +++ b/.github/actions/run-clang-format/action.yaml @@ -0,0 +1,61 @@ +name: Run clang-format +description: Runs clang-format and checks for any changes introduced by it +inputs: + failCondition: + description: Controls whether failed checks also fail the workflow run + required: false + default: 'never' + workingDirectory: + description: Working directory for checks + required: false + default: ${{ github.workspace }} +runs: + using: composite + steps: + - name: Check Runner Operating System 🏃‍♂️ + if: runner.os == 'Windows' + shell: bash + run: | + : Check Runner Operating System 🏃‍♂️ + echo "::notice::run-clang-format action requires a macOS-based or Linux-based runner." + exit 2 + + - name: Install Dependencies 🛍️ + if: runner.os == 'Linux' + shell: bash + run: | + : Install Dependencies 🛍️ + echo ::group::Install Dependencies + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" + echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH + echo "/home/linuxbrew/.linuxbrew/opt/clang-format@16/bin" >> $GITHUB_PATH + brew install --quiet zsh + echo ::endgroup:: + + - name: Run clang-format 🐉 + id: result + shell: zsh --no-rcs --errexit --pipefail {0} + working-directory: ${{ inputs.workingDirectory }} + env: + GITHUB_EVENT_FORCED: ${{ github.event.forced }} + GITHUB_REF_BEFORE: ${{ github.event.before }} + run: | + : Run clang-format 🐉 + if (( ${+RUNNER_DEBUG} )) setopt XTRACE + + local -a changes=($(git diff --name-only HEAD~1 HEAD)) + case ${GITHUB_EVENT_NAME} { + pull_request) changes=($(git diff --name-only origin/${GITHUB_BASE_REF} HEAD)) ;; + push) if [[ ${GITHUB_EVENT_FORCED} != true ]] changes=($(git diff --name-only ${GITHUB_REF_BEFORE} HEAD)) ;; + *) ;; + } + + if (( ${changes[(I)(*.c|*.h|*.cpp|*.hpp|*.m|*.mm)]} )) { + echo ::group::Install clang-format-16 + brew install --quiet obsproject/tools/clang-format@16 + echo ::endgroup:: + + echo ::group::Run clang-format-16 + ./build-aux/run-clang-format --fail-${{ inputs.failCondition }} --check + echo ::endgroup:: + } diff --git a/.github/actions/run-cmake-format/action.yaml b/.github/actions/run-cmake-format/action.yaml new file mode 100644 index 000000000..403602638 --- /dev/null +++ b/.github/actions/run-cmake-format/action.yaml @@ -0,0 +1,59 @@ +name: Run cmake-format +description: Runs cmake-format and checks for any changes introduced by it +inputs: + failCondition: + description: Controls whether failed checks also fail the workflow run + required: false + default: 'never' + workingDirectory: + description: Working directory for checks + required: false + default: ${{ github.workspace }} +runs: + using: composite + steps: + - name: Check Runner Operating System 🏃‍♂️ + if: runner.os == 'Windows' + shell: bash + run: | + : Check Runner Operating System 🏃‍♂️ + echo "::notice::run-cmake-format action requires a macOS-based or Linux-based runner." + exit 2 + + - name: Install Dependencies 🛍️ + if: runner.os == 'Linux' + shell: bash + run: | + : Install Dependencies 🛍️ + echo ::group::Install Dependencies + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" + echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH + brew install --quiet zsh + echo ::endgroup:: + + - name: Run cmake-format 🎛️ + id: result + shell: zsh --no-rcs --errexit --pipefail {0} + working-directory: ${{ github.workspace }} + env: + GITHUB_EVENT_FORCED: ${{ github.event.forced }} + GITHUB_REF_BEFORE: ${{ github.event.before }} + run: | + : Run cmake-format 🎛️ + if (( ${+RUNNER_DEBUG} )) setopt XTRACE + + local -a changes=($(git diff --name-only HEAD~1 HEAD)) + case ${GITHUB_EVENT_NAME} { + pull_request) changes=($(git diff --name-only origin/${GITHUB_BASE_REF} HEAD)) ;; + push) if [[ ${GITHUB_EVENT_FORCED} != true ]] changes=($(git diff --name-only ${GITHUB_REF_BEFORE} HEAD)) ;; + *) ;; + } + + if (( ${changes[(I)*.cmake|*CMakeLists.txt]} )) { + echo ::group::Install cmakelang + pip3 install cmakelang + echo ::endgroup:: + echo ::group::Run cmake-format + ./build-aux/run-cmake-format --fail-${{ inputs.failCondition }} --check + echo ::endgroup:: + } diff --git a/.github/actions/run-tests/action.yml b/.github/actions/run-tests/action.yml deleted file mode 100644 index 91332fea9..000000000 --- a/.github/actions/run-tests/action.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: 'Package plugin' -description: 'Packages the plugin for specified architecture and build config.' -inputs: - target: - description: 'Build target' - required: true - workingDirectory: - description: 'Working directory' - required: false - default: ${{ github.workspace }} -runs: - using: 'composite' - steps: - - name: Run macOS tests - if: ${{ runner.os == 'macOS' }} - shell: zsh {0} - run: | - if [[ '${{ inputs.target }}' != 'x86_64' ]]; then - echo tests skipped! - exit 0 - fi - ${{ inputs.workingDirectory }}/build_x86_64/tests/advanced-scene-switcher-tests - - - name: Run Linux packaging - if: ${{ runner.os == 'Linux' }} - shell: bash - run: | - if [[ '${{ inputs.target }}' != 'x86_64' ]]; then - exit 0 - fi - ${{ inputs.workingDirectory }}/build_x86_64/tests/advanced-scene-switcher-tests - - - name: Run Windows packaging - if: ${{ runner.os == 'Windows' }} - shell: pwsh - run: | - ${{ inputs.workingDirectory }}/build_x64/tests/RelWithDebInfo/advanced-scene-switcher-tests.exe diff --git a/.github/actions/setup-macos-codesigning/action.yaml b/.github/actions/setup-macos-codesigning/action.yaml new file mode 100644 index 000000000..5f24114b3 --- /dev/null +++ b/.github/actions/setup-macos-codesigning/action.yaml @@ -0,0 +1,154 @@ +name: Set up macOS codesigning +description: Sets up code signing certificates, provisioning profiles, and notarization information +inputs: + codesignIdentity: + description: Codesigning identity + required: true + installerIdentity: + description: Codesigning identity for package installer + required: false + codesignCertificate: + description: PKCS12 certificate in base64 format + required: true + certificatePassword: + description: Password required to install PKCS12 certificate + required: true + keychainPassword: + description: Password to use for temporary keychain + required: false + notarizationUser: + description: Apple ID to use for notarization + required: false + notarizationPassword: + description: Application password for notarization + provisioningProfile: + description: Provisioning profile in base64 format + required: false +outputs: + haveCodesignIdent: + description: True if necessary codesigning credentials were found + value: ${{ steps.codesign.outputs.haveCodesignIdent }} + haveProvisioningProfile: + description: True if necessary provisioning profile credentials were found + value: ${{ steps.provisioning.outputs.haveProvisioningProfile }} + haveNotarizationUser: + description: True if necessary notarization credentials were found + value: ${{ steps.notarization.outputs.haveNotarizationUser }} + codesignIdent: + description: Codesigning identity + value: ${{ steps.codesign.outputs.codesignIdent }} + installerIdent: + description: Codesigning identity for package installer + value: ${{ steps.codesign.outputs.installerIdent }} + codesignTeam: + description: Codesigning team + value: ${{ steps.codesign.outputs.codesignTeam }} +runs: + using: composite + steps: + - name: Check Runner Operating System 🏃‍♂️ + if: runner.os != 'macOS' + shell: bash + run: | + : Check Runner Operating System 🏃‍♂️ + echo "setup-macos-codesigning action requires a macOS-based runner." + exit 2 + + - name: macOS Codesigning ✍️ + shell: zsh --no-rcs --errexit --pipefail {0} + id: codesign + env: + MACOS_SIGNING_IDENTITY: ${{ inputs.codesignIdentity }} + MACOS_SIGNING_IDENTITY_INSTALLER: ${{ inputs.installerIdentity}} + MACOS_SIGNING_CERT: ${{ inputs.codesignCertificate }} + MAOCS_SIGNING_CERT_PASSWORD: ${{ inputs.certificatePassword }} + MACOS_KEYCHAIN_PASSWORD: ${{ inputs.keychainPassword }} + run: | + : macOS Codesigning ✍️ + if (( ${+RUNNER_DEBUG} )) setopt XTRACE + + if [[ ${MACOS_SIGNING_IDENTITY} && ${MACOS_SIGNING_IDENTITY_INSTALLER} && ${MACOS_SIGNING_CERT} ]] { + print 'haveCodesignIdent=true' >> $GITHUB_OUTPUT + + local -r certificate_path="${RUNNER_TEMP}/build_certificate.p12" + local -r keychain_path="${RUNNER_TEMP}/app-signing.keychain-db" + + print -n "${MACOS_SIGNING_CERT}" | base64 --decode --output="${certificate_path}" + + : "${MACOS_KEYCHAIN_PASSWORD:="$(print ${RANDOM} | shasum | head -c 32)"}" + + print '::group::Keychain setup' + security create-keychain -p "${MACOS_KEYCHAIN_PASSWORD}" ${keychain_path} + security set-keychain-settings -lut 21600 ${keychain_path} + security unlock-keychain -p "${MACOS_KEYCHAIN_PASSWORD}" ${keychain_path} + + security import "${certificate_path}" -P "${MAOCS_SIGNING_CERT_PASSWORD}" -A \ + -t cert -f pkcs12 -k ${keychain_path} \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/xcrun + + security set-key-partition-list -S 'apple-tool:,apple:' -k "${MACOS_KEYCHAIN_PASSWORD}" \ + ${keychain_path} &> /dev/null + + security list-keychain -d user -s ${keychain_path} 'login-keychain' + print '::endgroup::' + + local -r team_id="${${MACOS_SIGNING_IDENTITY##* }//(\(|\))/}" + + print "codesignIdent=${MACOS_SIGNING_IDENTITY}" >> $GITHUB_OUTPUT + print "installerIdent=${MACOS_SIGNING_IDENTITY_INSTALLER}" >> $GITHUB_OUTPUT + print "MACOS_KEYCHAIN_PASSWORD=${MACOS_KEYCHAIN_PASSWORD}" >> $GITHUB_ENV + print "codesignTeam=${team_id}" >> $GITHUB_OUTPUT + } else { + print 'haveCodesignIdent=false' >> $GITHUB_OUTPUT + } + + - name: Provisioning Profile 👤 + shell: zsh --no-rcs --errexit --pipefail {0} + id: provisioning + if: ${{ fromJSON(steps.codesign.outputs.haveCodesignIdent) }} + env: + MACOS_SIGNING_PROVISIONING_PROFILE: ${{ inputs.provisioningProfile }} + run: | + : Provisioning Profile 👤 + if (( ${+RUNNER_DEBUG} )) setopt XTRACE + + if [[ ${MACOS_SIGNING_PROVISIONING_PROFILE} ]] { + print 'haveProvisioningProfile=true' >> $GITHUB_OUTPUT + + local -r profile_path="${RUNNER_TEMP}/build_profile.provisionprofile" + print -n "${MACOS_SIGNING_PROVISIONING_PROFILE}" \ + | base64 --decode --output ${profile_path} + + print '::group::Provisioning Profile Setup' + mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles + security cms -D -i ${profile_path} -o ${RUNNER_TEMP}/build_profile.plist + local -r uuid="$(plutil -extract UUID raw ${RUNNER_TEMP}/build_profile.plist)" + local -r team_id="$(plutil -extract TeamIdentifier.0 raw -expect string ${RUNNER_TEMP}/build_profile.plist)" + + if [[ ${team_id} != '${{ steps.codesign.codesignTeam }}' ]] { + print '::notice::Code Signing team in provisioning profile does not match certificate.' + } + + cp ${profile_path} ~/Library/MobileDevice/Provisioning\ Profiles/${uuid}.provisionprofile + print "provisioningProfileUUID=${uuid}" >> $GITHUB_OUTPUT + print '::endgroup::' + } else { + print 'haveProvisioningProfile=false' >> $GITHUB_OUTPUT + } + + - name: Notarization 🧑‍💼 + shell: zsh --no-rcs --errexit --pipefail {0} + id: notarization + if: ${{ fromJSON(steps.codesign.outputs.haveCodesignIdent) }} + env: + MACOS_NOTARIZATION_USERNAME: ${{ inputs.notarizationUser }} + MACOS_NOTARIZATION_PASSWORD: ${{ inputs.notarizationPassword }} + run: | + : Notarization 🧑‍💼 + if (( ${+RUNNER_DEBUG} )) setopt XTRACE + + if [[ ${MACOS_NOTARIZATION_USERNAME} && ${MACOS_NOTARIZATION_PASSWORD} ]] { + print 'haveNotarizationUser=true' >> $GITHUB_OUTPUT + } else { + print 'haveNotarizationUser=false' >> $GITHUB_OUTPUT + } diff --git a/.github/scripts/.Aptfile b/.github/scripts/.Aptfile index fb1ef4668..aee6ebe30 100644 --- a/.github/scripts/.Aptfile +++ b/.github/scripts/.Aptfile @@ -1,14 +1,12 @@ package 'cmake' package 'ccache' -package 'curl' package 'git' package 'jq' package 'ninja-build', bin: 'ninja' package 'pkg-config' -package 'clang' -package 'clang-format-13' +package 'libcurl4-openssl-dev' package 'libxtst-dev' package 'libxss-dev' package 'libopencv-dev' package 'libtesseract-dev' -package 'libprocps-dev' +package 'libprocps-dev' \ No newline at end of file diff --git a/.github/scripts/.Brewfile b/.github/scripts/.Brewfile index 6990ecf4b..8368e3d23 100644 --- a/.github/scripts/.Brewfile +++ b/.github/scripts/.Brewfile @@ -3,4 +3,4 @@ brew "coreutils" brew "cmake" brew "git" brew "jq" -brew "ninja" +brew "xcbeautify" diff --git a/.github/scripts/.Wingetfile b/.github/scripts/.Wingetfile index 39ed656ca..63f742317 100644 --- a/.github/scripts/.Wingetfile +++ b/.github/scripts/.Wingetfile @@ -1,4 +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' -package 'OpenSSL', path: 'OpenSSL', bin: 'openssl' +package 'OpenSSL', path: 'OpenSSL', bin: 'openssl' \ No newline at end of file diff --git a/.github/scripts/.build-deps.zsh b/.github/scripts/.build-deps.zsh index 86bcda245..6b86d9cf9 100755 --- a/.github/scripts/.build-deps.zsh +++ b/.github/scripts/.build-deps.zsh @@ -33,7 +33,6 @@ _trap_error() { build() { if (( ! ${+SCRIPT_HOME} )) typeset -g SCRIPT_HOME=${ZSH_ARGZERO:A:h} local host_os=${${(s:-:)ZSH_ARGZERO:t:r}[3]} - local target="${host_os}-${CPUTYPE}" local project_root=${SCRIPT_HOME:A:h:h} local buildspec_file="${project_root}/buildspec.json" @@ -53,8 +52,6 @@ build() { 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 ) @@ -126,7 +123,7 @@ Usage: %B${functrace[1]%:*}%b