Browse Source

Update obs-plugintemplate to match changes on obs-studio master (#27)

Update macOS build scripts

* Update buildspec.json to support multiple Qt versions and different
  requested Qt versions per platform
* Add generator command line switch for CMake generator selection
* Add automatic multi processing support to GNU Makefile generator
* Add skip command line switch to manually speed up consecutive runs
* Fix zsh scoping issues
* Add support for CMake debug output if debug switch is supplied
* Extract pre-built dependencies into more specifically named directory
* Update notarization process to use updated xcrun functionality (macOS)
* Increase required development version to macOS 11.0

 CI: Update Linux build scripts

* Adds support for "Aptfile"-based installation of build requirements
* Adds support for Qt6 dependencies installed via apt-get

cmake: Update plugin helper to support Qt6 and proper macOS targets

* Also changes name of packages project file to use lowercase "macos" to
avoid issues with case-sensitive file systems.

CI: Update Windows build scripts

* Add switches to skip dependency download or extraction, and building
* Add support for updated buildspec.json
* Update Expand-ArchiveExt with most current version from ops-deps
* Update Invoke-GitCheckout with most current version from obs-deps
* Update Setup-Host to use loop-based processing and support updated
  buildspec.json format and support skip switches
* Update Setup-Obs to use values from buildspec.json file and support
  skip switches

CI: Update Ubuntu image to 22 for clang-format-13 support

* buildspec: Update obs-studio to 28.0.0-beta1 tag
Patrick Heyer 2 years ago
parent
commit
eb5423d41c

+ 9 - 0
.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'

+ 102 - 45
.github/scripts/.build.zsh

@@ -12,9 +12,9 @@ setopt NO_PUSHD_IGNORE_DUPS
 setopt FUNCTION_ARGZERO
 
 ## Enable for script debugging
-#setopt WARN_CREATE_GLOBAL
-#setopt WARN_NESTED_VAR
-#setopt XTRACE
+# 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."
@@ -36,13 +36,22 @@ build() {
   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='0.0.1'
+  local -r _version='1.0.0'
   local -r -a _valid_targets=(
     macos-x86_64
     macos-arm64
@@ -50,6 +59,12 @@ build() {
     linux-x86_64
   )
   local -r -a _valid_configs=(Debug RelWithDebInfo Release MinSizeRel)
+  if [[ ${host_os} == 'macos' ]] {
+    local -r -a _valid_generators=(Xcode Ninja 'Unix Makefiles')
+  } else {
+    local -r -a _valid_generators=(Ninja 'Unix Makefiles')
+  }
+  local generator='Ninja'
   local -r _usage="
 Usage: %B${functrace[1]%:*}%b <option> [<options>]
 
@@ -60,11 +75,18 @@ Usage: %B${functrace[1]%:*}%b <option> [<options>]
   %B-t | --target%b                     Specify target - default: %B%F{green}${host_os}-${CPUTYPE}%f%b
   %B-c | --config%b                     Build configuration - default: %B%F{green}RelWithDebInfo%f%b
   %B-s | --codesign%b                   Enable codesigning (macOS only)
+  %B--generator%b                       Specify build system to generate - default: %B%F{green}Ninja%f%b
+                                    Available generators:
+                                      - Ninja
+                                      - Unix Makefiles
+                                      - Xcode (macOS only)
 
 %F{yellow} Output options%f
  -----------------------------------------------------------------------------
   %B-q | --quiet%b                      Quiet (error output only)
   %B-v | --verbose%b                    Verbose (more detailed output)
+  %B--skip-[all|build|deps|unpack]%b    Skip all|building OBS|checking for dependencies|unpacking dependencies
+  %B--debug%b                           Debug (very detailed and added output)
 
 %F{yellow} General options%f
  -----------------------------------------------------------------------------
@@ -74,7 +96,7 @@ Usage: %B${functrace[1]%:*}%b <option> [<options>]
   local -a args
   while (( # )) {
     case ${1} {
-      -t|--target|-c|--config)
+      -t|--target|-c|--config|--generator)
         if (( # == 1 )) || [[ ${2:0:1} == '-' ]] {
           log_error "Missing value for option %B${1}%b"
           log_output ${_usage}
@@ -112,6 +134,22 @@ Usage: %B${functrace[1]%:*}%b <option> [<options>]
       -h|--help) log_output ${_usage}; exit 0 ;;
       -V|--version) print -Pr "${_version}"; exit 0 ;;
       --debug) _verbosity=3; shift ;;
+      --generator)
+        if (( ! ${_valid_generators[(Ie)${2}]} )) {
+          log_error "Invalid value %B${2}%b for option %B${1}%b"
+          log_output ${_usage}
+          exit 2
+        }
+        generator=${2}
+        shift 2
+        ;;
+      --skip-*)
+        local _skip="${${(s:-:)1}[-1]}"
+        local _check=(all deps unpack build)
+        (( ${_check[(Ie)${_skip}]} )) || log_warning "Invalid skip mode %B${_skip}%b supplied"
+        typeset -g -a skips=(${skips} ${_skip})
+        shift
+        ;;
       *) log_error "Unknown option: %B${1}%b"; log_output ${_usage}; exit 2 ;;
     }
   }
@@ -120,68 +158,87 @@ Usage: %B${functrace[1]%:*}%b <option> [<options>]
   set_loglevel ${_verbosity}
 
   check_${host_os}
+  setup_ccache
+
+  typeset -g QT_VERSION
+  typeset -g DEPLOYMENT_TARGET
+  typeset -g OBS_DEPS_VERSION
   setup_${host_os}
 
+  local product_name
+  local product_version
   read -r product_name product_version <<< \
-    "$(jq -r '. | {name, version} | join(" ")' ${project_root}/buildspec.json)"
+    "$(jq -r '. | {name, version} | join(" ")' ${buildspec_file})"
 
   case ${host_os} {
-    macos-*)
+    macos)
       sed -i '' \
         "s/project(\(.*\) VERSION \(.*\))/project(${product_name} VERSION ${product_version})/" \
-        "${project_root}"/CMakeLists.txt
+        "${project_root}/CMakeLists.txt"
       ;;
-    linux-*)
+    linux)
       sed -i'' \
         "s/project(\(.*\) VERSION \(.*\))/project(${product_name} VERSION ${product_version})/"\
-        "${project_root}"/CMakeLists.txt
+        "${project_root}/CMakeLists.txt"
       ;;
   }
 
-  setup_ccache
   setup_obs
 
   pushd ${project_root}
-  log_info "Configuring ${product_name}..."
+  if (( ! (${skips[(Ie)all]} + ${skips[(Ie)build]}) )) {
+    log_info "Configuring ${product_name}..."
+
+    local _plugin_deps="${project_root:h}/obs-build-dependencies/plugin-deps-${OBS_DEPS_VERSION}-qt${QT_VERSION}-${target##*-}"
+    local -a cmake_args=(
+      -DCMAKE_BUILD_TYPE=${BUILD_CONFIG:-RelWithDebInfo}
+      -DQT_VERSION=${QT_VERSION}
+      -DCMAKE_PREFIX_PATH="${_plugin_deps}"
+    )
+
+    if (( _loglevel == 0 )) cmake_args+=(-Wno_deprecated -Wno-dev --log-level=ERROR)
+    if (( _logLevel > 2 )) cmake_args+=(--debug-output)
+
+    local num_procs
+
+    case ${target} {
+      macos-*)
+        autoload -Uz read_codesign
+        if (( ${+CODESIGN} )) {
+          read_codesign
+        }
 
-  local -a cmake_args=(
-    -DCMAKE_BUILD_TYPE=${BUILD_CONFIG:-RelWithDebInfo}
-    -DCMAKE_PREFIX_PATH="${project_root:h}/obs-build-dependencies/obs-plugin-deps"
-  )
+        cmake_args+=(
+          -DCMAKE_FRAMEWORK_PATH="${_plugin_deps}/Frameworks"
+          -DCMAKE_OSX_ARCHITECTURES=${${target##*-}//universal/x86_64;arm64}
+          -DCMAKE_OSX_DEPLOYMENT_TARGET=${DEPLOYMENT_TARGET:-10.15}
+          -DOBS_CODESIGN_LINKER=ON
+          -DOBS_BUNDLE_CODESIGN_IDENTITY="${CODESIGN_IDENT:--}"
+        )
+        num_procs=$(( $(sysctl -n hw.ncpu) + 1 ))
+        ;;
+      linux-*)
+        if (( ${+CI} )) {
+          cmake_args+=(-DCMAKE_INSTALL_PREFIX=/usr)
+        }
+        num_procs=$(( $(nproc) + 1 ))
+        ;;
+    }
 
-  if (( _loglevel == 0 )) cmake_args+=(-Wno_deprecated -Wno-dev --log-level=ERROR)
-
-  case ${target} {
-    macos-*)
-      autoload -Uz read_codesign
-      if (( ${+CODESIGN} )) {
-        read_codesign
-      }
-
-      cmake_args+=(
-        -DCMAKE_OSX_ARCHITECTURES=${${target##*-}//universal/x86_64;arm64}
-        -DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-10.15}
-        -DOBS_BUNDLE_CODESIGN_IDENTITY="${CODESIGN_IDENT:--}"
-        -DCMAKE_FRAMEWORK_PATH="${project_root:h}/obs-build-dependencies/obs-plugin-deps/Frameworks"
-      )
-      ;;
-    linux-*)
-      if (( ${+CI} )) {
-        cmake_args+=(-DCMAKE_INSTALL_PREFIX=/usr)
-      }
-      ;;
-  }
+    log_debug "Attempting to configure ${product_name} with CMake arguments: ${cmake_args}"
+    cmake -S . -B build_${target##*-} -G ${generator} ${cmake_args}
 
-  cmake -S . -B build_${target} -G Ninja ${cmake_args}
+    log_info "Building ${product_name}..."
+    local -a cmake_args=()
+    if (( _loglevel > 1 )) cmake_args+=(--verbose)
+    if [[ ${generator} == 'Unix Makefiles' ]] cmake_args+=(--parallel ${num_procs})
+    cmake --build build_${target##*-} --config ${BUILD_CONFIG:-RelWithDebInfo} ${cmake_args}
+  }
 
+  log_info "Installing ${product_name}..."
   local -a cmake_args=()
   if (( _loglevel > 1 )) cmake_args+=(--verbose)
-
-  log_info "Building ${product_name}"
-  cmake --build build_${target} --config ${BUILD_CONFIG:-RelWithDebInfo} ${cmake_args}
-
-  log_info "Install ${product_name}"
-  cmake --install build_${target} --config ${BUILD_CONFIG:-RelWithDebInfo} --prefix "${project_root}"/release ${cmake_args}
+  cmake --install build_${target##*-} --config ${BUILD_CONFIG:-RelWithDebInfo} --prefix "${project_root}/release" ${cmake_args}
   popd
 }
 

+ 19 - 24
.github/scripts/.package.zsh

@@ -12,9 +12,9 @@ setopt NO_PUSHD_IGNORE_DUPS
 setopt FUNCTION_ARGZERO
 
 ## Enable for script debugging
-#setopt WARN_CREATE_GLOBAL
-#setopt WARN_NESTED_VAR
-#setopt XTRACE
+# 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."
@@ -42,7 +42,7 @@ package() {
   autoload -Uz set_loglevel log_info log_error log_output check_${host_os}
 
   local -i _verbosity=1
-  local -r _version='0.0.1'
+  local -r _version='1.0.0'
   local -r -a _valid_targets=(
     macos-x86_64
     macos-arm64
@@ -66,6 +66,7 @@ Usage: %B${functrace[1]%:*}%b <option> [<options>]
  -----------------------------------------------------------------------------
   %B-q | --quiet%b                      Quiet (error output only)
   %B-v | --verbose%b                    Verbose (more detailed output)
+  %B--debug%b                           Debug (very detailed and added output)
 
 %F{yellow} General options%f
  -----------------------------------------------------------------------------
@@ -107,8 +108,8 @@ Usage: %B${functrace[1]%:*}%b <option> [<options>]
         BUILD_CONFIG=${2}
         shift 2
         ;;
-      -s|--codesign) CODESIGN=1; shift ;;
-      -n|--notarize) NOTARIZE=1; shift ;;
+      -s|--codesign) typeset -g CODESIGN=1; shift ;;
+      -n|--notarize) typeset -g NOTARIZE=1; typeset -g CODESIGN=1; shift ;;
       -q|--quiet) (( _verbosity -= 1 )) || true; shift ;;
       -v|--verbose) (( _verbosity += 1 )); shift ;;
       -h|--help) log_output ${_usage}; exit 0 ;;
@@ -123,11 +124,13 @@ Usage: %B${functrace[1]%:*}%b <option> [<options>]
 
   check_${host_os}
 
+  local product_name
+  local product_version
   read -r product_name product_version <<< \
     "$(jq -r '. | {name, version} | join(" ")' ${project_root}/buildspec.json)"
 
   if [[ ${host_os} == 'macos' ]] {
-    autoload -Uz check_packages check_xcnotary read_codesign read_codesign_installer read_codesign_pass
+    autoload -Uz check_packages read_codesign read_codesign_installer read_codesign_pass
 
     local output_name="${product_name}-${product_version}-${host_os}-${target##*-}.pkg"
 
@@ -136,7 +139,7 @@ Usage: %B${functrace[1]%:*}%b <option> [<options>]
       return 2
     }
 
-    if [[ ! -f ${project_root}/build_${target}/installer-macos.generated.pkgproj ]] {
+    if [[ ! -f ${project_root}/build_${target##*-}/installer-macos.generated.pkgproj ]] {
       log_error 'Packages project file not found. Run the build script or the CMake build and install procedures first.'
       return 2
     }
@@ -147,7 +150,7 @@ Usage: %B${functrace[1]%:*}%b <option> [<options>]
     pushd ${project_root}
     packagesbuild \
       --build-folder ${project_root}/release \
-      ${project_root}/build_${target}/installer-macos.generated.pkgproj
+      ${project_root}/build_${target##*-}/installer-macos.generated.pkgproj
 
     if (( ${+CODESIGN} )) {
       read_codesign_installer
@@ -163,25 +166,17 @@ Usage: %B${functrace[1]%:*}%b <option> [<options>]
     }
 
     if (( ${+CODESIGN} && ${+NOTARIZE} )) {
-      check_xcnotary
-
-      local _error=0
-      if [[ -f "${project_root}/release/${output_name}" ]] {
-        xcnotary precheck "${project_root}/release/${output_name}" || _error=1
-      } else {
+      if [[ ! -f "${project_root}/release/${output_name}" ]] {
         log_error "No package for notarization found."
         return 2
       }
 
-      if (( ! _error )) {
-        read_codesign_installer
-        read_codesign_pass
+      read_codesign_installer
+      read_codesign_pass
 
-        xcnotary notarize "${project_root}/release/${output_name}" \
-          --developer-account "${CODESIGN_IDENT_USER}" \
-          --developer-password-keychain-item "OBS-Codesign-Password" \
-          --provider "${CODESIGN_IDENT_SHORT}"
-      }
+      xcrun notarytool submit "${project_root}/release/${output_name}" \
+        --keychain-profile "OBS-Codesign-Password" --wait
+      xcrun stapler staple "${project_root}/release/${output_name}"
     }
     popd
   } elif [[ ${host_os} == 'linux' ]] {
@@ -189,7 +184,7 @@ Usage: %B${functrace[1]%:*}%b <option> [<options>]
     if (( _loglevel > 1 )) cmake_args+=(--verbose)
 
     pushd ${project_root}
-    cmake --build build_${target} --config ${BUILD_CONFIG:-RelWithDebInfo} -t package ${cmake_args}
+    cmake --build build_${target##*-} --config ${BUILD_CONFIG:-RelWithDebInfo} -t package ${cmake_args}
     popd
   }
 }

+ 41 - 24
.github/scripts/Build-Windows.ps1

@@ -5,7 +5,11 @@ param(
     [ValidateSet('x86', 'x64')]
     [string] $Target,
     [ValidateSet('Visual Studio 17 2022', 'Visual Studio 16 2019')]
-    [string] $CMakeGenerator = 'Visual Studio 16 2019'
+    [string] $CMakeGenerator,
+    [switch] $SkipAll,
+    [switch] $SkipBuild,
+    [switch] $SkipDeps,
+    [switch] $SkipUnpack
 )
 
 $ErrorActionPreference = 'Stop'
@@ -42,8 +46,17 @@ function Build {
     $ProductName = $BuildSpec.name
     $ProductVersion = $BuildSpec.version
 
+    $script:DepsVersion = ''
+    $script:QtVersion = '5'
+    $script:VisualStudioVersion = ''
+    $script:PlatformSDK = '10.0.18363.657'
+
     Setup-Host
 
+    if ( $CmakeGenerator -eq '' ) {
+        $CmakeGenerator = $VisualStudioVersion
+    }
+
     (Get-Content -Path ${ProjectRoot}/CMakeLists.txt -Raw) `
         -replace "project\((.*) VERSION (.*)\)", "project(${ProductName} VERSION ${ProductVersion})" `
         | Out-File -Path ${ProjectRoot}/CMakeLists.txt
@@ -51,30 +64,34 @@ function Build {
     Setup-Obs
 
     Push-Location -Stack BuildTemp
-
-    Ensure-Location $ProjectRoot
-
-    $CmakeArgs = @(
-        '-G', $CmakeGenerator
-        '-DCMAKE_SYSTEM_VERSION=10.0.18363.657'
-        "-DCMAKE_GENERATOR_PLATFORM=$(if (${script:Target} -eq "x86") { "Win32" } else { "x64" })"
-        "-DCMAKE_BUILD_TYPE=${Configuration}"
-        "-DCMAKE_PREFIX_PATH=$(Resolve-Path -Path "${ProjectRoot}/../obs-build-dependencies/plugin-deps-${Target}")"
-    )
-
-    Log-Information "Configuring ${ProductName}..."
-    Invoke-External cmake -S . -B build_${script:Target} @CmakeArgs
-
-    $CmakeArgs = @(
-        '--config', "${Configuration}"
-    )
-
-    if ( $VerbosePreference -eq 'Continue' ) {
-        $CmakeArgs+=('--verbose')
+    if ( ! ( ( $SkipAll ) -or ( $SkipBuild ) ) ) {
+        Ensure-Location $ProjectRoot
+
+        $DepsPath = "plugin-deps-${script:DepsVersion}-qt${script:QtVersion}-${script:Target}"
+        $CmakeArgs = @(
+            '-G', $CmakeGenerator
+            "-DCMAKE_SYSTEM_VERSION=${script:PlatformSDK}"
+            "-DCMAKE_GENERATOR_PLATFORM=$(if (${script:Target} -eq "x86") { "Win32" } else { "x64" })"
+            "-DCMAKE_BUILD_TYPE=${Configuration}"
+            "-DCMAKE_PREFIX_PATH:PATH=$(Resolve-Path -Path "${ProjectRoot}/../obs-build-dependencies/${DepsPath}")"
+            "-DQT_VERSION=${script:QtVersion}"
+        )
+
+        Log-Debug "Attempting to configure OBS with CMake arguments: $($CmakeArgs | Out-String)"
+        Log-Information "Configuring ${ProductName}..."
+        Invoke-External cmake -S . -B build_${script:Target} @CmakeArgs
+
+        $CmakeArgs = @(
+            '--config', "${Configuration}"
+        )
+
+        if ( $VerbosePreference -eq 'Continue' ) {
+            $CmakeArgs+=('--verbose')
+        }
+
+        Log-Information "Building ${ProductName}..."
+        Invoke-External cmake --build "build_${script:Target}" @CmakeArgs
     }
-
-    Log-Information "Building ${ProductName}..."
-    Invoke-External cmake --build "build_${script:Target}" @CmakeArgs
     Log-Information "Install ${ProductName}..."
     Invoke-External cmake --install "build_${script:Target}" --prefix "${ProjectRoot}/release" @CmakeArgs
 

+ 2 - 2
.github/scripts/Package-Windows.ps1

@@ -49,8 +49,8 @@ function Package {
     $RemoveArgs = @{
         ErrorAction = 'SilentlyContinue'
         Path = @(
-            "${ProjectRoot}/release/${ProductName}-${ProductVersion}-windows-*.zip"
-            "${ProjectRoot}/release/${ProductName}-${ProductVersion}-windows-*.exe"
+            "${ProjectRoot}/release/${ProductName}-*-windows-*.zip"
+            "${ProjectRoot}/release/${ProductName}-*-windows-*.exe"
         )
     }
 

+ 2 - 1
.github/scripts/check-cmake.sh

@@ -44,7 +44,8 @@ find . -type d \( \
     -path ./plugins/obs-outputs/ftl-sdk -o \
     -path ./plugins/obs-vst -o \
     -path ./plugins/obs-browser -o \
-    -path ./plugins/win-dshow/libdshowcapture \
+    -path ./plugins/win-dshow/libdshowcapture -o \
+    -path ./plugins/obs-websocket/deps \
 \) -prune -false -type f -o \
     -name 'CMakeLists.txt' -or \
     -name '*.cmake' \

+ 9 - 10
.github/scripts/check-format.sh

@@ -26,35 +26,34 @@ elif [[ ${OS} = "Darwin" ]] ; then
 fi
 
 # Discover clang-format
-if type clang-format-12 2> /dev/null ; then
-    CLANG_FORMAT=clang-format-12
+if type clang-format-13 2> /dev/null ; then
+    CLANG_FORMAT=clang-format-13
 elif type clang-format 2> /dev/null ; then
     # Clang format found, but need to check version
     CLANG_FORMAT=clang-format
     V=$(clang-format --version)
-    if [[ $V != *"version 12.0"* ]]; then
-        echo "clang-format is not 12.0 (returned ${V})"
+    if [[ $V != *"version 13.0"* ]]; then
+        echo "clang-format is not 13.0 (returned ${V})"
         exit 1
     fi
 else
-    echo "No appropriate clang-format found (expected clang-format-12.0.0, or clang-format)"
+    echo "No appropriate clang-format found (expected clang-format-13.0.0, or clang-format)"
     exit 1
 fi
 
 find . -type d \( \
-    -path ./\*build\* -o \
+    -path ./\*build -o \
     -path ./cmake -o \
-    -path ./deps -o \
     -path ./plugins/decklink/\*/decklink-sdk -o \
     -path ./plugins/enc-amf -o \
     -path ./plugins/mac-syphon/syphon-framework -o \
     -path ./plugins/obs-outputs/ftl-sdk -o \
-    -path ./plugins/obs-vst \
+    -path ./plugins/obs-websocket/deps \
 \) -prune -false -type f -o \
     -name '*.h' -or \
     -name '*.hpp' -or \
     -name '*.m' -or \
-    -name '*.m,' -or \
+    -name '*.mm' -or \
     -name '*.c' -or \
     -name '*.cpp' \
- | xargs -L100 -P ${NPROC} ${CLANG_FORMAT} ${VERBOSITY} -i -style=file -fallback-style=none
+ | xargs -L100 -P ${NPROC} "${CLANG_FORMAT}" ${VERBOSITY} -i -style=file -fallback-style=none

+ 6 - 6
.github/scripts/utils.pwsh/Expand-ArchiveExt.ps1

@@ -27,16 +27,16 @@ function Expand-ArchiveExt {
                 if ( Get-Command 7z ) {
                     Invoke-External 7z x -y $Path "-o${DestinationPath}"
                 } else {
-                    throw 'Fallback utility 7-zip not found. Please install 7-zip first.'
+                    throw "Fallback utility 7-zip not found. Please install 7-zip first."
                 }
             }
             break
         }
-        .7z {
+        { ( $_ -eq ".7z" ) -or ( $_ -eq ".exe" ) } {
             if ( Get-Command 7z ) {
                 Invoke-External 7z x -y $Path "-o${DestinationPath}"
             } else {
-                throw 'Extraction utility 7-zip not found. Please install 7-zip first.'
+                throw "Extraction utility 7-zip not found. Please install 7-zip first."
             }
             break
         }
@@ -47,7 +47,7 @@ function Expand-ArchiveExt {
                 if ( Get-Command 7z ) {
                     Invoke-External 7z x -y $Path "-o${DestinationPath}"
                 } else {
-                    throw 'Fallback utility 7-zip not found. Please install 7-zip first.'
+                    throw "Fallback utility 7-zip not found. Please install 7-zip first."
                 }
             }
             break
@@ -59,12 +59,12 @@ function Expand-ArchiveExt {
                 if ( Get-Command 7z ) {
                     Invoke-External 7z x -y $Path "-o${DestinationPath}"
                 } else {
-                    throw 'Fallback utility 7-zip not found. Please install 7-zip first.'
+                    throw "Fallback utility 7-zip not found. Please install 7-zip first."
                 }
             }
         }
         default {
-            throw 'Unsupported archive extension provided.'
+            throw "Unsupported archive extension provided."
         }
     }
 }

+ 1 - 1
.github/scripts/utils.pwsh/Invoke-GitCheckout.ps1

@@ -44,7 +44,7 @@ function Invoke-GitCheckout {
     }
 
     if ( ! ( Test-Path function:Log-Information ) ) {
-        . $PSScriptRoot/Utils-Logger.ps1
+        . $PSScriptRoot/Logger.ps1
     }
 
     if ( ! ( Test-Path function:Invoke-External ) ) {

+ 72 - 79
.github/scripts/utils.pwsh/Setup-Host.ps1

@@ -11,93 +11,86 @@ function Setup-Host {
         . $PSScriptRoot/Install-BuildDependencies.ps1
     }
 
-    Install-BuildDependencies -WingetFile "${ScriptHome}/.Wingetfile"
-
-    if ( $script:Target -eq '' ) { $script:Target = $script:HostArchitecture }
-
-    Push-Location -Stack BuildTemp
-    Log-Information 'Setting up obs-deps...'
-    $DepsVersion = $BuildSpec.dependencies.'obs-deps'."windows-${script:Target}".version
-    $DepsHash = $BuildSpec.dependencies.'obs-deps'."windows-${script:Target}".hash
-
-    if ( ${DepsVersion} -eq '' ) {
-        throw 'No obs-deps version found in buildspec.json.'
-    }
-    Log-Status 'Found obs-deps specification.'
-
-    Ensure-Location -Path "$(Resolve-Path -Path "${ProjectRoot}/..")/obs-build-dependencies"
-
-    if ( ! ( Test-Path -Path "windows-deps-${DepsVersion}-${script:Target}.zip" ) ) {
-        $Params = @{
-            UserAgent = 'NativeHost'
-            Uri = "https://github.com/obsproject/obs-deps/releases/download/win-${DepsVersion}/windows-deps-${DepsVersion}-${script:Target}.zip"
-            OutFile = "windows-deps-${DepsVersion}-${script:Target}.zip"
-            UseBasicParsing = $true
-            ErrorAction = 'Stop'
-        }
-
-        Invoke-WebRequest @Params
-        Log-Status "Downloaded obs-deps for ${script:Target}."
-    } else {
-        Log-Status 'Found downloaded obs-deps.'
-    }
-
-    $FileHash = Get-FileHash -Path "windows-deps-${DepsVersion}-${script:Target}.zip" -Algorithm SHA256
-
-    if ( $FileHash.Hash.ToLower() -ne $DepsHash ) {
-        throw "Checksum mismatch of obs-deps download. Expected '${DepsHash}', found '$(${FileHash}.Hash.ToLower())'"
-    }
-    Log-Status 'Checksum of downloaded obs-deps matches.'
-
-    Ensure-Location -Path "plugin-deps-${Target}"
-
     if ( ! ( Test-Path function:Expand-ArchiveExt ) ) {
         . $PSScriptRoot/Expand-ArchiveExt.ps1
     }
 
-    Log-Information 'Extracting obs-deps...'
-    Expand-ArchiveExt -Path "../windows-deps-${DepsVersion}-${script:Target}.zip" -DestinationPath . -Force
-    Pop-Location -Stack BuildTemp
-
-    Push-Location -Stack BuildTemp
-    Log-Information 'Setting up Qt...'
-    $QtVersion = $BuildSpec.dependencies.'obs-deps-qt'."windows-${script:Target}".version
-    $QtHash = $BuildSpec.dependencies.'obs-deps-qt'."windows-${script:Target}".hash
-
-    if ( ${QtVersion} -eq '' ) {
-        throw 'No Qt version found in buildspec.json.'
-    }
-    Log-Status 'Found Qt specification.'
+    Install-BuildDependencies -WingetFile "${ScriptHome}/.Wingetfile"
 
-    Ensure-Location -Path "$(Resolve-Path -Path "${ProjectRoot}/..")/obs-build-dependencies"
+    if ( $script:Target -eq '' ) { $script:Target = $script:HostArchitecture }
 
-    if ( ! ( Test-Path -Path "windows-deps-qt-${DepsVersion}-${script:Target}.zip" ) ) {
-        $Params = @{
-            UserAgent = 'NativeHost'
-            Uri = "https://cdn-fastly.obsproject.com/downloads/windows-deps-qt-${DepsVersion}-${script:Target}.zip"
-            OutFile = "windows-deps-qt-${DepsVersion}-${script:Target}.zip"
-            UseBasicParsing = $true
-            ErrorAction = 'Stop'
+    $script:QtVersion = $BuildSpec.platformConfig."windows-${script:Target}".qtVersion
+    $script:VisualStudioVersion = $BuildSpec.platformConfig."windows-${script:Target}".visualStudio
+    $script:PlatformSDK = $BuildSpec.platformConfig."windows-${script:Target}".platformSDK
+
+    if ( ! ( ( $script:SkipAll ) -or ( $script:SkipDeps ) ) ) {
+        ('prebuilt', "qt${script:QtVersion}") | ForEach-Object {
+            $_Dependency = $_
+            $_Version = $BuildSpec.dependencies."${_Dependency}".version
+            $_BaseUrl = $BuildSpec.dependencies."${_Dependency}".baseUrl
+            $_Label = $BuildSpec.dependencies."${_Dependency}".label
+            $_Hash = $BuildSpec.dependencies."${_Dependency}".hashes."windows-${script:Target}"
+
+            if ( $BuildSpec.dependencies."${_Dependency}".PSobject.Properties.Name -contains "pdb-hashes" ) {
+                $_PdbHash = $BuildSpec.dependencies."${_Dependency}".'pdb-hashes'."$windows-${script:Target}"
+            }
+
+            if ( $_Version -eq '' ) {
+                throw "No ${_Dependency} spec found in ${script:BuildSpecFile}."
+            }
+
+            Log-Information "Setting up ${_Label}..."
+
+            Push-Location -Stack BuildTemp
+            Ensure-Location -Path "$(Resolve-Path -Path "${ProjectRoot}/..")/obs-build-dependencies"
+
+            switch -wildcard ( $_Dependency ) {
+                prebuilt {
+                    $_Filename = "windows-deps-${_Version}-${script:Target}.zip"
+                    $_Uri = "${_BaseUrl}/${_Version}/${_Filename}"
+                    $_Target = "plugin-deps-${_Version}-qt${script:QtVersion}-${script:Target}"
+                    $script:DepsVersion = ${_Version}
+                }
+                "qt*" {
+                    $_Filename = "windows-deps-qt${script:QtVersion}-${_Version}-${script:Target}.zip"
+                    $_Uri = "${_BaseUrl}/${_Version}/${_Filename}"
+                    $_Target = "plugin-deps-${_Version}-qt${script:QtVersion}-${script:Target}"
+                }
+            }
+
+            if ( ! ( Test-Path -Path $_Filename ) ) {
+                $Params = @{
+                    UserAgent = 'NativeHost'
+                    Uri = $_Uri
+                    OutFile = $_Filename
+                    UseBasicParsing = $true
+                    ErrorAction = 'Stop'
+                }
+
+                Invoke-WebRequest @Params
+                Log-Status "Downloaded ${_Label} for ${script:Target}."
+            } else {
+                Log-Status "Found downloaded ${_Label}."
+            }
+
+            $_FileHash = Get-FileHash -Path $_Filename -Algorithm SHA256
+
+            if ( $_FileHash.Hash.ToLower() -ne $_Hash ) {
+                throw "Checksum of downloaded ${_Label} does not match specification. Expected '${_Hash}', 'found $(${_FileHash}.Hash.ToLower())'"
+            }
+            Log-Status "Checksum of downloaded ${_Label} matches."
+
+            if ( ! ( ( $script:SkipAll ) -or ( $script:SkipUnpack ) ) ) {
+                Push-Location -Stack BuildTemp
+                Ensure-Location -Path $_Target
+
+                Expand-ArchiveExt -Path "../${_Filename}" -DestinationPath . -Force
+
+                Pop-Location -Stack BuildTemp
+            }
+            Pop-Location -Stack BuildTemp
         }
-
-        Invoke-WebRequest @Params
-        Log-Status "Downloaded Qt for ${script:Target}."
-    } else {
-        Log-Status 'Found downloaded Qt.'
-    }
-
-    $FileHash = Get-FileHash -Path "windows-deps-qt-${DepsVersion}-${script:Target}.zip" -Algorithm SHA256
-
-    if ( $FileHash.Hash.ToLower() -ne ${QtHash} ) {
-        throw "Checksum mismatch of Qt download. Expected '${QtHash}', found '$(${FileHash}.Hash.ToLower())'"
     }
-    Log-Status 'Checksum of downloaded Qt matches.'
-
-    Ensure-Location -Path "plugin-deps-${Target}"
-
-    Log-Information 'Extracting Qt...'
-    Expand-ArchiveExt -Path "../windows-deps-qt-${DepsVersion}-${script:Target}.zip" -DestinationPath . -Force
-    Pop-Location -Stack BuildTemp
 }
 
 function Get-HostArchitecture {

+ 42 - 35
.github/scripts/utils.pwsh/Setup-Obs.ps1

@@ -35,43 +35,50 @@ function Setup-Obs {
     Push-Location -Stack BuildTemp
     Ensure-Location -Path "$(Resolve-Path -Path "${ProjectRoot}/../")/obs-studio"
 
-    Invoke-GitCheckout -Uri $ObsRepository -Commit $ObsHash -Path . -Branch $ObsBranch
-
-    Log-Information 'Configuring OBS Studio...'
-
-    $NumProcessors = (Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors
-
-    if ( $NumProcessors -gt 1 ) {
-        $env:UseMultiToolTask = $true
-        $env:EnforceProcessCountAcrossBuilds = $true
+    if ( ! ( ( $script:SkipAll ) -or ( $script:SkipUnpack ) ) ) {
+        Invoke-GitCheckout -Uri $ObsRepository -Commit $ObsHash -Path . -Branch $ObsBranch
     }
 
-    $CmakeArgs = @(
-        '-G', $script:CmakeGenerator
-        '-DCMAKE_SYSTEM_VERSION=10.0.18363.657'
-        "-DCMAKE_GENERATOR_PLATFORM=$(if (${script:Target} -eq "x86") { "Win32" } else { "x64" })"
-        "-DCMAKE_BUILD_TYPE=${script:Configuration}"
-        '-DENABLE_PLUGINS=OFF'
-        '-DENABLE_UI=OFF'
-        '-DENABLE_SCRIPTING=OFF'
-        "-DCMAKE_INSTALL_PREFIX=$(Resolve-Path -Path "${ProjectRoot}/../obs-build-dependencies/plugin-deps-${Target}")"
-        "-DCMAKE_PREFIX_PATH=$(Resolve-Path -Path "${ProjectRoot}/../obs-build-dependencies/plugin-deps-${Target}")"
-    )
-
-    Invoke-External cmake -S . -B plugin_${script:Target} @CmakeArgs
-
-    Log-Information 'Building libobs and obs-frontend-api...'
-
-    $CmakeArgs = @(
-        '--config', "$( if ( $script:Configuration -eq '' ) { 'RelWithDebInfo' } else { $script:Configuration })"
-    )
-
-    if ( $VerbosePreference -eq 'Continue' ) {
-        $CmakeArgs+=('--verbose')
+    if ( ! ( ( $script:SkipAll ) -or ( $script:SkipBuild ) ) ) {
+        Log-Information 'Configuring OBS Studio...'
+
+        $NumProcessors = (Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors
+
+        if ( $NumProcessors -gt 1 ) {
+            $env:UseMultiToolTask = $true
+            $env:EnforceProcessCountAcrossBuilds = $true
+        }
+
+        $DepsPath = "plugin-deps-${script:DepsVersion}-qt${script:QtVersion}-${script:Target}"
+
+        $CmakeArgs = @(
+            '-G', $script:CmakeGenerator
+            "-DCMAKE_SYSTEM_VERSION=${script:PlatformSDK}"
+            "-DCMAKE_GENERATOR_PLATFORM=$(if (${script:Target} -eq "x86") { "Win32" } else { "x64" })"
+            "-DCMAKE_BUILD_TYPE=${script:Configuration}"
+            "-DQT_VERSION=${script:QtVersion}"
+            '-DENABLE_PLUGINS=OFF'
+            '-DENABLE_UI=OFF'
+            '-DENABLE_SCRIPTING=OFF'
+            "-DCMAKE_INSTALL_PREFIX:PATH=$(Resolve-Path -Path "${ProjectRoot}/../obs-build-dependencies/${DepsPath}")"
+            "-DCMAKE_PREFIX_PATH:PATH=$(Resolve-Path -Path "${ProjectRoot}/../obs-build-dependencies/${DepsPath}")"
+        )
+
+        Log-Debug "Attempting to configure OBS with CMake arguments: $($CmakeArgs | Out-String)"
+        Log-Information "Configuring OBS..."
+        Invoke-External cmake -S . -B plugin_build_${script:Target} @CmakeArgs
+
+        Log-Information 'Building libobs and obs-frontend-api...'
+        $CmakeArgs = @(
+            '--config', "$( if ( $script:Configuration -eq '' ) { 'RelWithDebInfo' } else { $script:Configuration })"
+        )
+
+        if ( $VerbosePreference -eq 'Continue' ) {
+            $CmakeArgs+=('--verbose')
+        }
+
+        Invoke-External cmake --build plugin_build_${script:Target} @CmakeArgs -t obs-frontend-api
+        Invoke-External cmake --install plugin_build_${script:Target} @CmakeArgs --component obs_libraries
     }
-
-    Invoke-External cmake --build plugin_${script:Target} @CmakeArgs -t obs-frontend-api
-    Invoke-External cmake --install plugin_${script:Target} @CmakeArgs --component obs_libraries
-
     Pop-Location -Stack BuildTemp
 }

+ 36 - 1
.github/scripts/utils.zsh/check_linux

@@ -1 +1,36 @@
-:
+autoload -Uz log_info log_status log_error log_debug log_warning
+
+log_debug 'Checking for apt-get...'
+if (( ! ${+commands[apt-get]} )) {
+  log_error 'No apt-get command found. Please install apt'
+  return 2
+} else {
+  log_debug "Apt-get located at ${commands[apt-get]}"
+}
+
+local -a dependencies=("${(f)$(<${SCRIPT_HOME}/.Aptfile)}")
+local -a install_list
+local binary
+
+for dependency (${dependencies}) {
+  local -a tokens=(${(s: :)dependency//(,|:|\')/})
+
+  if [[ ! ${tokens[1]} == 'package' ]] continue
+
+  if [[ ${#tokens} -gt 2 && ${tokens[3]} == 'bin' ]] {
+    binary=${tokens[4]}
+  } else {
+    binary=${tokens[2]}
+  }
+
+  if (( ! ${+commands[${binary}]} )) install_list+=(${tokens[2]})
+}
+
+local -a _quiet=('' '--quiet')
+
+log_debug "List of dependencies to install: ${install_list}"
+if (( ${#install_list} )) {
+  if (( ! ${+CI} )) log_warning 'Dependency installation via apt may require elevated privileges'
+
+  sudo apt-get -y install ${install_list} ${_quiet[(( (_loglevel == 0) + 1 ))]}
+}

+ 3 - 3
.github/scripts/utils.zsh/check_macos

@@ -3,8 +3,8 @@ autoload -Uz is-at-least log_info log_error log_status read_codesign
 local macos_version=$(sw_vers -productVersion)
 
 log_info 'Checking macOS version...'
-if ! is-at-least 10.15.0 "${macos_version}"; then
-  log_error "Minimum required macOS version is 10.15, but running on macOS ${macos_version}"
+if ! is-at-least 11.0 "${macos_version}"; then
+  log_error "Minimum required macOS version is 11.0, but running on macOS ${macos_version}"
   return 2
 else
   log_status "macOS ${macos_version} is recent"
@@ -16,5 +16,5 @@ if (( ! ${+commands[brew]} )) {
   return 2
 }
 
-brew bundle --file "${SCRIPT_HOME}/.Brewfile" --no-upgrade
+brew bundle --file "${SCRIPT_HOME}/.Brewfile"
 rehash

+ 1 - 0
.github/scripts/utils.zsh/check_packages

@@ -32,6 +32,7 @@ if (( ! ${+commands[packagesbuild]} )) {
     curl ${curl_opts} ${packages_url}
   }
 
+  local image_checksum
   read -r image_checksum _ <<< "$(sha256sum Packages.dmg)"
 
   if [[ ${packages_hash} != ${image_checksum} ]] {

+ 0 - 9
.github/scripts/utils.zsh/check_xcnotary

@@ -1,9 +0,0 @@
-autoload -Uz log_info log_error
-
-log_info 'Checking for Homebrew...'
-if (( ! ${+commands[brew]} )) {
-  log_error 'No Homebrew command found. Please install Homebrew (https://brew.sh)'
-  return 2
-}
-
-if (( ! ${+commands[xcnotary]} )) brew install akeru-inc/tap/xcnotary

+ 4 - 2
.github/scripts/utils.zsh/read_codesign_pass

@@ -17,6 +17,8 @@ if (( ! ${+CODESIGN_IDENT} )) {
   read_codesign
 }
 
+local codesign_ident_short=$(print "${CODESIGN_IDENT}" | /usr/bin/sed -En 's/.+\((.+)\)/\1/p')
+
 if (( ! ${+CODESIGN_IDENT_USER} )) {
   read_codesign_user
 }
@@ -26,6 +28,6 @@ if (( ! ${+CODESIGN_IDENT_PASS} )) {
   read -s CODESIGN_IDENT_PASS'?Apple Developer ID password: '
 }
 
+print ''
 log_info 'Setting up notarization keychain...'
-xcrun altool --store-password-in-keychain-item 'OBS-Codesign-Password' -u "${CODESIGN_IDENT_USER}" -p "${CODESIGN_IDENT_PASS}"
-typeset -g CODESIGN_IDENT_SHORT=$(print "${CODESIGN_IDENT}" | /usr/bin/sed -En 's/.+\((.+)\)/\1/p')
+xcrun notarytool store-credentials 'OBS-Codesign-Password' --apple-id "${CODESIGN_IDENT_USER}" --team-id "${codesign_ident_short}" --password "${CODESIGN_IDENT_PASS}"

+ 52 - 35
.github/scripts/utils.zsh/setup_linux

@@ -1,45 +1,62 @@
 autoload -Uz log_error log_status log_info mkcd
 
-if (( ! ${+commands[apt-get]} )) {
-  log_error 'apt-get not found. Please ensure apt is available on the system.'
+if (( ! ${+project_root} )) {
+  log_error "'project_root' not set. Please set before running ${0}."
   return 2
 }
 
-log_info 'Installing obs build dependencies...'
-sudo dpkg --add-architecture amd64
-sudo apt-get -qq update
-sudo apt-get install -y \
+if (( ! ${+target} )) {
+  log_error "'target' not set. Please set before running ${0}."
+  return 2
+}
+
+pushd ${project_root}
+
+typeset -g QT_VERSION
+read -r QT_VERSION <<< \
+  "$(jq -r --arg target "${target}" \
+    '.platformConfig[$target] | { qtVersion } | join(" ")' \
+    ${project_root}/buildspec.json)"
+
+if (( ! (${skips[(Ie)all]} + ${skips[(Ie)deps]}) )) {
+  log_info 'Installing obs build dependencies...'
+
+  sudo apt-get install -y \
     build-essential \
-    ninja-build \
-    ccache \
-    clang \
-    clang-format \
-    git \
-    jq \
-    qtbase5-dev \
-    libqt5svg5-dev \
-    libqt5x11extras5-dev \
-    qtbase5-private-dev \
-    libwayland-dev \
-    libavcodec-dev \
-    libavdevice-dev \
-    libavfilter-dev \
-    libavformat-dev \
-    libavutil-dev \
-    libswresample-dev \
-    libswscale-dev \
-    libx264-dev \
+    libcurl4-openssl-dev \
+    libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev \
+    libswresample-dev libswscale-dev \
     libjansson-dev \
-    libpulse-dev \
-    libx11-dev \
     libx11-xcb-dev \
-    libmbedtls-dev \
-    libgl1-mesa-dev \
-    pkg-config \
-    libcurl4-openssl-dev
+    libgles2-mesa-dev \
+    libwayland-dev \
+    libpulse-dev
+
+  local -a _qt_packages=()
+
+  if (( QT_VERSION == 5 )) {
+    _qt_packages+=(
+      qtbase5-dev
+      libqt5svg5-dev
+      qtbase5-private-dev
+      libqt5x11extras5-dev
+    )
+  } elif (( QT_VERSION == 6 )) {
+    _qt_packages+=(
+      qt6-base-dev
+      libqt6svg6-dev
+      qt6-base-private-dev
+    )
+  } else {
+    log_error "Unsupported Qt version '${QT_VERSION}' specified."
+    return 2
+  }
+
+  sudo apt-get install -y ${_qt_packages}
+}
 
-if ! type cmake &>/dev/null; then
-    sudo apt-get install -y cmake
-fi
+local deps_version
+read -r deps_version <<< \
+  "$(jq -r '.dependencies.prebuilt.version' ${buildspec_file})"
 
-rehash
+typeset -g OBS_DEPS_VERSION=${deps_version}

+ 90 - 67
.github/scripts/utils.zsh/setup_macos

@@ -29,76 +29,99 @@ if (( ! ${+CI} )) {
 curl_opts+=(--location -O ${@})
 
 pushd ${project_root}
-log_info 'Setting up obs-deps...'
-read -r deps_version deps_hash <<< \
-  "$(jq -r --arg key "obs-deps" --arg target "${target}" \
-    '.dependencies[$key][$target] | {version, hash} | join(" ")' \
-    ${buildspec_file})"
-
-if [[ -z "${deps_version}" ]] {
-  log_error 'No obs-deps version found in buildspec.json.'
-  return 2
-}
-log_status 'Found obs-deps specification.'
-
-mkcd ${project_root:h}/obs-build-dependencies
-
-if [[ ! -f macos-deps-${deps_version}-${target##*-}.tar.xz ]] {
-  curl ${curl_opts} \
-    "https://github.com/obsproject/obs-deps/releases/download/${deps_version}/macos-deps-${deps_version}-${target##*-}.tar.xz" && \
-    log_status "Downloaded obs-deps for ${target}."
-} else {
-  log_status 'Found downloaded obs-deps.'
-}
-
-read -r artifact_checksum _ <<< "$(sha256sum macos-deps-${deps_version}-${target##*-}.tar.xz)"
-if [[ ${deps_hash} != ${artifact_checksum} ]] {
-  log_error "Checksum of downloaded obs-deps does not match specification.
-Expected : ${deps_hash}
-Actual   : ${artifact_checksum}"
-  return 2
-}
-log_status 'Checksum of downloaded obs-deps matches.'
 
-mkcd obs-plugin-deps
-XZ_OPT=-T0 tar -xzf ../macos-deps-${deps_version}-${target##*-}.tar.xz && log_status 'obs-deps extracted.'
-popd
-
-pushd ${project_root}
-log_info 'Setting up Qt...'
-read -r qt_version qt_hash <<< \
-  "$(jq -r --arg key "obs-deps-qt" --arg target "${target}" \
-    '.dependencies[$key][$target] | {version, hash} | join(" ")' \
+local _qt_version
+local _deployment_target
+read -r _qt_version _deployment_target <<< \
+  "$(jq -r --arg target "${target}" \
+    '.platformConfig[$target] | { qtVersion, deploymentTarget } | join (" ")' \
     ${buildspec_file})"
 
-if [[ -z "${qt_version}" ]] {
-  log_error 'No obs-deps version found in buildspec.json.'
-  return 2
-}
-log_status 'Found Qt specification.'
-
-mkcd ${project_root:h}/obs-build-dependencies
-
-if [[ ! -f macos-deps-qt-${deps_version}-${target##*-}.tar.xz ]] {
-  curl ${curl_opts} \
-    "https://github.com/obsproject/obs-deps/releases/download/${deps_version}/macos-deps-qt-${deps_version}-${target##*-}.tar.xz" && \
-    log_status "Downloaded Qt for ${target}"
+typeset -g QT_VERSION=${_qt_version}
+typeset -g DEPLOYMENT_TARGET=${_deployment_target}
+
+if (( ! (${skips[(Ie)all]}  + ${skips[(Ie)deps]}) )) {
+  mkdir -p ${project_root:h}/obs-build-dependencies
+
+  local dependency
+  local deps_version
+  local deps_baseurl
+  local deps_label
+  local deps_hash
+  local _filename
+  local _url
+  local _target
+  local artifact_checksum
+
+  for dependency ('prebuilt' "qt${QT_VERSION}") {
+    IFS=';' read -r deps_version deps_baseurl deps_label deps_hash <<< \
+      "$(jq -r --arg dependency "${dependency}" --arg target "${target}" \
+        '.dependencies[$dependency] | {version, baseUrl, "label", "hash": .hashes[$target]} | join(";")' \
+        ${buildspec_file})"
+
+    if [[ -z "${deps_version}" ]] {
+      log_error "No ${dependency} spec found in ${buildspec_file}."
+      return 2
+    }
+    log_info "Setting up ${deps_label}..."
+
+    pushd ${project_root:h}/obs-build-dependencies
+
+    case ${dependency} {
+      prebuilt)
+        _filename="macos-deps-${deps_version}-${target##*-}.tar.xz"
+        _url="${deps_baseurl}/${deps_version}/${_filename}"
+        _target="plugin-deps-${deps_version}-qt${QT_VERSION}-${target##*-}"
+        typeset -g OBS_DEPS_VERSION=${deps_version}
+        ;;
+      qt*)
+        if (( ${+CI} )) {
+          _filename="macos-deps-qt${QT_VERSION}-${deps_version}-universal.tar.xz"
+          deps_hash="$(jq -r --arg dependency "${dependency}" \
+            '.dependencies[$dependency].hashes["macos-universal"]' \
+            ${buildspec_file})"
+        } else {
+          _filename="macos-deps-qt${QT_VERSION}-${deps_version}-${target##*-}.tar.xz"
+        }
+        _url="${deps_baseurl}/${deps_version}/${_filename}"
+        _target="plugin-deps-${deps_version}-qt${QT_VERSION}-${target##*-}"
+        ;;
+    }
+
+    if [[ ! -f ${_filename} ]] {
+      log_debug "Running curl ${curl_opts} ${_url}"
+      curl ${curl_opts} ${_url} && \
+      log_status "Downloaded ${deps_label} for ${target}."
+    } else {
+      log_status "Found downloaded ${deps_label}"
+    }
+
+    read -r artifact_checksum _ <<< "$(sha256sum ${_filename})"
+    if [[ ${deps_hash} != ${artifact_checksum} ]] {
+      log_error "Checksum of downloaded ${deps_label} does not match specification.
+  Expected : ${deps_hash}
+  Actual   : ${artifact_checksum}"
+      return 2
+    }
+    log_status "Checksum of downloaded ${deps_label} matches."
+
+    if (( ! (${skips[(Ie)all]} + ${skips[(Ie)unpack]}) )) {
+      mkdir -p ${_target} && pushd ${_target}
+
+      XZ_OPT=-T0 tar -xzf ../${_filename} && log_status "${deps_label} extracted."
+      popd
+    }
+  }
+
+  popd
+  pushd ${project_root:h}/obs-build-dependencies
+  xattr -r -d com.apple.quarantine *
+  log_status 'Removed quarantine flag from downloaded dependencies...'
+  popd
 } else {
-  log_status 'Found downloaded Qt.'
-}
+  local deps_version
+  read -r deps_version <<< \
+    "$(jq -r '.dependencies.prebuilt.version' ${buildspec_file})"
 
-read -r artifact_checksum _ <<< "$(sha256sum macos-deps-qt-${deps_version}-${target##*-}.tar.xz)"
-if [[ ${qt_hash} != ${artifact_checksum} ]] {
-  log_error "Checksum of downloaded Qt does not match specification.
-Expected : ${qt_hash}
-Actual   : ${artifact_checksum}"
-  return 2
+  typeset -g OBS_DEPS_VERSION=${deps_version}
 }
-log_status 'Checksum of downloaded Qt matches.'
-
-mkcd obs-plugin-deps
-XZ_OPT=-T0 tar -xzf ../macos-deps-qt-${qt_version}-${target##*-}.tar.xz && log_status 'Qt extracted.'
-
-xattr -r -d com.apple.quarantine *
-log_status 'Removed quarantine flag from downloaded dependencies...'
-popd

+ 75 - 58
.github/scripts/utils.zsh/setup_obs

@@ -25,15 +25,13 @@ if (( ! ${+target} )) {
   return 2
 }
 
-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
-}
-
 log_info 'Setting up OBS-Studio...'
 
+local obs_version
+local obs_repo
+local obs_branch
+local obs_hash
+
 read -r obs_version obs_repo obs_branch obs_hash <<< \
   "$(jq -r --arg key "obs-studio" \
      '.dependencies[$key] | {version, repository, branch, hash} | join(" ")' \
@@ -47,59 +45,78 @@ if [[ -z ${obs_version} ]] {
 pushd
 mkcd ${project_root:h}/obs-studio
 
-if [[ -d .git ]] {
-  git config advice.detachedHead false
-  git config remote.pluginbuild.url "${obs_repo:-https://github.com/obsproject/obs-studio.git}"
-  git config remote.pluginbuild.fetch "+refs/heads/${obs_branch:-master}:refs/remotes/origin/${obs_branch:-master}"
-
-  git rev-parse -q --verify "${obs_hash}^{commit}" > /dev/null || git fetch pluginbuild
-  git checkout ${obs_branch:-master} -B ${product_name}
-  git reset --hard "${obs_hash}"
-  log_status 'Found existing obs-studio repository.'
-} else {
-  git clone "${obs_repo:-https://github.com/obsproject/obs-studio.git}" "${PWD}"
-  git config advice.detachedHead false
-  git checkout -f "${obs_hash}" --
-  git checkout ${obs_branch:-master} -b ${product_name}
-  log_status 'obs-studio checked out.'
+if (( ! (${skips[(Ie)all]} + ${skips[(Ie)unpack]}) )) {
+  if [[ -d .git ]] {
+    git config advice.detachedHead false
+    git config remote.pluginbuild.url "${obs_repo:-https://github.com/obsproject/obs-studio.git}"
+    git config remote.pluginbuild.fetch "+refs/heads/${obs_branch:-master}:refs/remotes/origin/${obs_branch:-master}"
+
+    git rev-parse -q --verify "${obs_hash}^{commit}" > /dev/null || git fetch pluginbuild
+    git checkout ${obs_branch:-master} -B ${product_name}
+    git reset --hard "${obs_hash}"
+    log_status 'Found existing obs-studio repository.'
+  } else {
+    git clone "${obs_repo:-https://github.com/obsproject/obs-studio.git}" "${PWD}"
+    git config advice.detachedHead false
+    git checkout -f "${obs_hash}" --
+    git checkout ${obs_branch:-master} -b ${product_name}
+    log_status 'obs-studio checked out.'
+  }
+
+  git submodule foreach --recursive git submodule sync
+  git submodule update --init --recursive
 }
 
-git submodule foreach --recursive git submodule sync
-git submodule update --init --recursive
-
-log_info 'Configuring obs-studio...'
-
-local -a cmake_args=(
-  -DCMAKE_BUILD_TYPE=${BUILD_CONFIG:-Release}
-  -DENABLE_PLUGINS=OFF
-  -DENABLE_UI=OFF
-  -DENABLE_SCRIPTING=OFF
-  -DCMAKE_INSTALL_PREFIX="${project_root:h}/obs-build-dependencies/obs-plugin-deps"
-  -DCMAKE_PREFIX_PATH="${project_root:h}/obs-build-dependencies/obs-plugin-deps"
-)
-
-if (( _loglevel == 0 )) cmake_args+=(-Wno_deprecated -Wno-dev --log-level=ERROR)
-
-case ${target} {
-  macos-*)
-    cmake_args+=(
-      -DCMAKE_OSX_ARCHITECTURES=${${target##*-}//universal/x86_64;arm64}
-      -DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-10.15}
-    )
-    ;;
-  linux-*)
-    cmake_args+=(
-      -DENABLE_PIPEWIRE=OFF
-    )
-    ;;
+if (( ! (${skips[(Ie)all]} + ${skips[(Ie)build]}) )) {
+  log_info 'Configuring obs-studio...'
+
+  local -a cmake_args=(
+    -DCMAKE_BUILD_TYPE=${BUILD_CONFIG:-Release}
+    -DQT_VERSION=${QT_VERSION}
+    -DENABLE_PLUGINS=OFF
+    -DENABLE_UI=OFF
+    -DENABLE_SCRIPTING=OFF
+    -DCMAKE_INSTALL_PREFIX="${project_root:h}/obs-build-dependencies/plugin-deps-${OBS_DEPS_VERSION}-qt${QT_VERSION}-${target##*-}"
+    -DCMAKE_PREFIX_PATH="${project_root:h}/obs-build-dependencies/plugin-deps-${OBS_DEPS_VERSION}-qt${QT_VERSION}-${target##*-}"
+  )
+
+  if (( _loglevel == 0 )) cmake_args+=(-Wno_deprecated -Wno-dev --log-level=ERROR)
+  if (( _loglevel > 2 )) cmake_args+=(--debug-output)
+
+  local num_procs
+
+  case ${target} {
+    macos-*)
+      autoload -Uz read_codesign
+      if (( ${+CODESIGN} )) {
+        read_codesign
+      }
+
+      cmake_args+=(
+        -DCMAKE_OSX_ARCHITECTURES=${${target##*-}//universal/x86_64;arm64}
+        -DCMAKE_OSX_DEPLOYMENT_TARGET=${DEPLOYMENT_TARGET:-10.15}
+        -DOBS_CODESIGN_LINKER=ON
+        -DOBS_BUNDLE_CODESIGN_IDENTITY="${CODESIGN_IDENT:--}"
+      )
+      num_procs=$(( $(sysctl -n hw.ncpu) + 1 ))
+      ;;
+    linux-*)
+      cmake_args+=(
+        -DENABLE_PIPEWIRE=OFF
+      )
+      num_procs=$(( $(nproc) + 1 ))
+      ;;
+  }
+
+  log_debug "Attempting to configure OBS with CMake arguments: ${cmake_args}"
+  cmake -S . -B plugin_build_${target##*-} -G ${generator} ${cmake_args}
+
+  log_info 'Building libobs and obs-frontend-api...'
+  local -a cmake_args=()
+  if (( _loglevel > 1 )) cmake_args+=(--verbose)
+  if [[ ${generator} == 'Unix Makefiles' ]] cmake_args+=(--parallel ${num_procs})
+  cmake --build plugin_build_${target##*-} --config ${BUILD_CONFIG:-Release} ${cmake_args} -t obs-frontend-api
+  cmake --install plugin_build_${target##*-} --config ${BUILD_CONFIG:-Release} --component obs_libraries ${cmake_args}
 }
 
-cmake -S . -B plugin_build_${target##*-} -G Ninja ${cmake_args}
-
-log_info 'Building libobs and obs-frontend-api...'
-local -a cmake_args=()
-if (( _loglevel > 1 )) cmake_args+=(--verbose)
-
-cmake --build plugin_build_${target##*-} --config ${BUILD_CONFIG:-Release} ${cmake_args} -t obs-frontend-api
-cmake --install plugin_build_${target##*-} --config ${BUILD_CONFIG:-Release} --component obs_libraries ${cmake_args}
 popd

+ 4 - 4
.github/workflows/main.yml

@@ -20,7 +20,7 @@ env:
 jobs:
   clang_check:
     name: 01 - Code Format Check
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     steps:
       - name: Checkout
         uses: actions/checkout@v3
@@ -28,7 +28,7 @@ jobs:
           submodules: recursive
 
       - name: Install clang-format
-        run: sudo apt-get install -y clang-format-12
+        run: sudo apt-get install -y clang-format-13
 
       - name: Run clang-format
         run: ./.github/scripts/check-format.sh && ./.github/scripts/check-changes.sh
@@ -171,7 +171,7 @@ jobs:
 
   linux_build:
     name: 02 - Linux
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     strategy:
       fail-fast: true
       matrix:
@@ -346,7 +346,7 @@ jobs:
 
   make-release:
     name: 03 - Create and upload release
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
     needs: [macos_build, linux_build, windows_build]
     defaults:

+ 2 - 2
CMakeLists.txt

@@ -66,8 +66,8 @@ if(OS_WINDOWS)
 
   # -- macOS specific build settings and tasks --
 elseif(OS_MACOS)
-  configure_file(cmake/bundle/macos/installer-macOS.pkgproj.in
-                 ${CMAKE_BINARY_DIR}/installer-macOS.generated.pkgproj)
+  configure_file(cmake/bundle/macos/installer-macos.pkgproj.in
+                 ${CMAKE_BINARY_DIR}/installer-macos.generated.pkgproj)
 
   set(MACOSX_PLUGIN_GUI_IDENTIFIER "${MACOS_BUNDLEID}")
   set(MACOSX_PLUGIN_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION}")

+ 67 - 40
buildspec.json

@@ -1,56 +1,83 @@
 {
     "dependencies": {
         "obs-studio": {
-            "version": "27.2.3",
+            "version": "28.0.0-beta1",
             "repository": "https://github.com/obsproject/obs-studio.git",
             "branch": "master",
-            "hash": "2ac9f83cb662692d34874ee1fd17ad7675597215"
+            "hash": "67f7a84076be2c73d172eb14265c60d6209598db"
         },
-        "obs-deps": {
-            "macos-x86_64": {
-                "version": "2022-02-13",
-                "hash": "1a8715d66e664b857942deaded0dc46c4f6cd22e88f01ed1188f3bd3fcf632c4"
-            },
-            "macos-arm64": {
-                "version": "2022-02-13",
-                "hash": "2cfcaf05765400c696908f242aea87b6e1848e1a48cd3edc2eb7f8cb249c9d48"
-            },
-            "macos-universal": {
-                "version": "2022-02-13",
-                "hash": "77471b1d345a768e8efec3f6ad9dc79f3c7cd34840b66f721b80025d29713f5d"
-            },
-            "windows-x64": {
-                "version": "2022-03-16",
-                "hash": "ed73757d1faee1b8c4a9aeca539e1149704e430085608990771402e60074eec7"
-            },
-            "windows-x86": {
-                "version": "2022-03-16",
-                "hash": "4751f68488cf6d5dcc79fbf6735762154847ca509d669539b241bf4e5cbf7751"
+        "prebuilt": {
+            "version": "2022-08-02",
+            "baseUrl": "https://github.com/obsproject/obs-deps/releases/download",
+            "label": "Pre-built obs-deps",
+            "hashes": {
+                "macos-x86_64": "7637e52305e6fc53014b5aabd583f1a4490b1d97450420e977cae9a336a29525",
+                "macos-arm64": "755e0fa69b17a3ae444e1befa9d91d77e3cafe628fbd1c6333686091826595cd",
+                "macos-universal": "de057e73e6fe0825664c258ca2dd6798c41ae580bf4d896e1647676a4941934a",
+                "windows-x64": "2192d8ce780c4281b807cd457994963669e5202659ecd92f19b54c3e7d0c1915",
+                "windows-x86": "9f8582ab5891b000869d6484ea591add9fbac9f1c91b56c7b85fdfd56a261c1b"
             }
         },
-        "obs-deps-qt": {
-            "macos-x86_64": {
-                "version": "2022-02-13",
-                "hash": "35a58fee8dfd70d3d2dcc0ae0b77132c04a451c6f041a02dc41b207b375fc74b"
+        "qt5": {
+            "version": "2022-08-02",
+            "baseUrl": "https://github.com/obsproject/obs-deps/releases/download",
+            "label": "Pre-built Qt5",
+            "hashes": {
+                "macos-x86_64": "3d0381a52b0e4d49967936c4357f79ac711f43564329304a6db5c90edadd2697",
+                "macos-arm64": "f4b32548c0530f121956bf0a9a70c36ecbbfca81073d39c396a1759baf2a05c3",
+                "macos-universal": "9a6cf3b9a6c9efee6ba10df649202e8075e99f3c54ae88dc9a36dbc9d7471c1e",
+                "windows-x64": "6488a33a474f750d5a4a268a5e20c78bb40799d99136a1b7ce3365a843cb2fd7",
+                "windows-x86": "a916e09b0a874036801deab2c8a7ec14fdf5d268aa5511eac5bf40727e0c4e33"
             },
-            "macos-arm64": {
-                "version": "2022-02-13",
-                "hash": "e99146b9c7775c245a2d22f2ef24fc111fccd71bad0f03b64db707124ffb8707"
-            },
-            "macos-universal": {
-                "version": "2022-02-13",
-                "hash": "13fbcc45fd9d08b30e702d481fe4d58b23f93aa06848cede4ebe0956c79a5e8a"
-            },
-            "windows-x64": {
-                "version": "2022-03-16",
-                "hash": "4a5faed9bad327be079e08ed6715a287db8936d20e51b9cdfc7eb52d0a57c629"
+            "pdb-hashes": {
+                "windows-x64": "e0e5070143fcad9311a68ce5685d8ba8f34f581ed6942b7a92d360f94ca1ba11",
+                "windows-x86": "36642d1052aa461964f46c17610477b0d9b9defbe2d745ccaacb85f805c1bec2"
+            }
+        },
+        "qt6": {
+            "version": "2022-08-02",
+            "baseUrl": "https://github.com/obsproject/obs-deps/releases/download",
+            "label": "Pre-built Qt6",
+            "hashes": {
+                "macos-x86_64": "a83f72a11023b03b6cb2dc365f0a66ad9df31163bbb4fe2df32d601856a9fad3",
+                "macos-arm64": "2f30af90c049670a5660656adbb440668aa1b0567f75a5f29e1def9108928403",
+                "macos-universal": "252e6684f43ab9c6f262c73af739e2296ce391b998da2c4ee04c254aaa07db18",
+                "windows-x64": "e5509b54196a3f935250cc4b9c54160c8e588fd0f92bc078a2a64f9d9e2e4e93",
+                "windows-x86": "24fc03bef153a0e027c1479e42eb08097a4ea1d70a4710825be0783d0626cb0d"
             },
-            "windows-x86": {
-                "version": "2022-03-16",
-                "hash": "6664bc60523a8c7c08690f6b800d8d57d830605b9c25d2ce41132c422b0c6e29"
+            "pdb-hashes": {
+                "windows-x64": "60e5b1d2bc4d7c431bc05f14e3b1e85e088788c372fa85f58717cd6c49555a46",
+                "windows-x86": "f34d1a89fc85d92913bd6c7f75ec5c28471d74db708c98161100bc8b75f8fc63"
             }
         }
     },
+    "platformConfig": {
+        "macos-x86_64": {
+            "qtVersion": 6,
+            "deploymentTarget": "10.15"
+        },
+        "macos-arm64": {
+            "qtVersion": 6,
+            "deploymentTarget": "11.0"
+        },
+        "macos-universal": {
+            "qtVersion": 6,
+            "deploymentTarget": "10.15"
+        },
+        "windows-x64": {
+            "qtVersion": 6,
+            "visualStudio": "Visual Studio 16 2019",
+            "platformSDK": "10.0.18363.657"
+        },
+        "windows-x86": {
+            "qtVersion": 6,
+            "visualStudio": "Visual Studio 16 2019",
+            "platformSDK": "10.0.18363.657"
+        },
+        "linux-x86_64": {
+            "qtVersion": 5
+        }
+    },
     "name": "obs-plugintemplate",
     "version": "1.0.0"
 }

+ 14 - 6
cmake/ObsPluginHelpers.cmake

@@ -189,9 +189,10 @@ if(OS_MACOS)
                                                       "x86_64;arm64")
 
   set(CMAKE_OSX_DEPLOYMENT_TARGET
-      "10.13"
+      "10.15"
       CACHE STRING "OBS deployment target for macOS - 10.15+ required")
-  set_property(CACHE CMAKE_OSX_DEPLOYMENT_TARGET PROPERTY STRINGS 10.15 11 12)
+  set_property(CACHE CMAKE_OSX_DEPLOYMENT_TARGET PROPERTY STRINGS 10.15 11.0
+                                                          12.0 13.0)
 
   set(OBS_BUNDLE_CODESIGN_IDENTITY
       "-"
@@ -267,15 +268,22 @@ if(OS_MACOS)
               COMPONENT obs_plugins
               NAMELINK_COMPONENT ${target}_Development)
 
+    if(${QT_VERSION} EQUAL 5)
+      set(_QT_FW_VERSION "${QT_VERSION}")
+    else()
+      set(_QT_FW_VERSION "A")
+    endif()
+
     set(_COMMAND
         "${CMAKE_INSTALL_NAME_TOOL} \\
-      -change ${CMAKE_PREFIX_PATH}/lib/QtWidgets.framework/Versions/${QT_VERSION}/QtWidgets @rpath/QtWidgets.framework/Versions/${QT_VERSION}/QtWidgets \\
-      -change ${CMAKE_PREFIX_PATH}/lib/QtCore.framework/Versions/${QT_VERSION}/QtCore @rpath/QtCore.framework/Versions/${QT_VERSION}/QtCore \\
-      -change ${CMAKE_PREFIX_PATH}/lib/QtGui.framework/Versions/${QT_VERSION}/QtGui @rpath/QtGui.framework/Versions/${QT_VERSION}/QtGui \\
+      -change ${CMAKE_PREFIX_PATH}/lib/QtWidgets.framework/Versions/${QT_VERSION}/QtWidgets @rpath/QtWidgets.framework/Versions/${_QT_FW_VERSION}/QtWidgets \\
+      -change ${CMAKE_PREFIX_PATH}/lib/QtCore.framework/Versions/${QT_VERSION}/QtCore @rpath/QtCore.framework/Versions/${_QT_FW_VERSION}/QtCore \\
+      -change ${CMAKE_PREFIX_PATH}/lib/QtGui.framework/Versions/${QT_VERSION}/QtGui @rpath/QtGui.framework/Versions/${_QT_FW_VERSION}/QtGui \\
       \\\"\${CMAKE_INSTALL_PREFIX}/${target}.plugin/Contents/MacOS/${target}\\\""
     )
     install(CODE "execute_process(COMMAND /bin/sh -c \"${_COMMAND}\")"
             COMPONENT obs_plugins)
+    unset(_QT_FW_VERSION)
 
     if(NOT XCODE)
       set(_COMMAND
@@ -283,7 +291,7 @@ if(OS_MACOS)
           --sign \\\"${OBS_BUNDLE_CODESIGN_IDENTITY}\\\" \\
           --options runtime \\
           --entitlements \\\"${CMAKE_CURRENT_FUNCTION_LIST_DIR}/bundle/macOS/entitlements.plist\\\" \\
-          \\\"${CMAKE_INSTALL_PREFIX}/${target}.plugin\\\"")
+          \\\"\${CMAKE_INSTALL_PREFIX}/${target}.plugin\\\"")
       install(CODE "execute_process(COMMAND /bin/sh -c \"${_COMMAND}\")"
               COMPONENT obs_plugins)
     endif()

+ 0 - 0
cmake/bundle/macos/installer-macOS.pkgproj.in → cmake/bundle/macos/installer-macos.pkgproj.in