From f007624e10b80bad4520631f61e4b19ad9cd99c2 Mon Sep 17 00:00:00 2001 From: Bennett Goble Date: Sat, 1 Oct 2022 05:39:45 -0700 Subject: [PATCH 01/18] Add github action build --- .github/dependabot.yaml | 7 +++++++ .github/release.yaml | 18 ++++++++++++++++++ .github/workflows/build.yaml | 24 ++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 .github/dependabot.yaml create mode 100644 .github/release.yaml create mode 100644 .github/workflows/build.yaml diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 0000000..f54fbcd --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,7 @@ +version: 2 +updates: + + - package-ecosystem: github-actions + directory: / + schedule: + interval: monthly diff --git a/.github/release.yaml b/.github/release.yaml new file mode 100644 index 0000000..0f4884c --- /dev/null +++ b/.github/release.yaml @@ -0,0 +1,18 @@ +changelog: + exclude: + labels: + - ignore-for-release + authors: + - dependabot + categories: + - title: Breaking Changes 🛠 + labels: + - semver-major + - breaking-change + - title: New Features 🎉 + labels: + - semver-minor + - enhancement + - title: Other Changes + labels: + - '*' diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..fbf7d96 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,24 @@ +name: Build +on: [push] +jobs: + build: + strategy: + matrix: + os: [windows-2022, macos-11, ubuntu-22.04] + addrsize: ["64"] + include: + - os: windows-2022 + addrsize: "32" + runs-on: ${{ matrix.os }} + steps: + - uses: secondlife/action-autobuild@release/v3 + with: + addrsize: ${{ matrix.addrsize }} + release: + needs: build + runs-on: [ubuntu-latest] + if: startsWith(github.ref, 'refs/tags/v') + steps: + - uses: secondlife/action-autobuild-release@v1 + with: + public: true From 230a23969fb873f4bb646de2aa661b0fb5071988 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 23 Feb 2023 14:38:19 -0500 Subject: [PATCH 02/18] SL-18837: tweak build-cmd.sh to force an updated build --- build-cmd.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/build-cmd.sh b/build-cmd.sh index 611396e..7a1ea6d 100755 --- a/build-cmd.sh +++ b/build-cmd.sh @@ -46,16 +46,14 @@ case "$AUTOBUILD_PLATFORM" in if [ "$AUTOBUILD_PLATFORM" == "windows64" ] then - lib="lib64" - bin="bin64" sfx="64" rcdll="BugSplatRc64.dll" else - lib="lib" - bin="bin" sfx="" rcdll="BugSplatRC.dll" fi + lib="lib$sfx" + bin="bin$sfx" # BugSplat version info seems to be platform-dependent and even # component-dependent?! Query the Windows version by asking for the From 05f6e02d9e032b6b02f9a5adc64e6efd225abbe6 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 23 Feb 2023 14:43:22 -0500 Subject: [PATCH 03/18] Stop pinning action-autobuild to variant version. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index fbf7d96..d3a1c86 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -11,7 +11,7 @@ jobs: addrsize: "32" runs-on: ${{ matrix.os }} steps: - - uses: secondlife/action-autobuild@release/v3 + - uses: secondlife/action-autobuild@release with: addrsize: ${{ matrix.addrsize }} release: From 6b0936c37dd38e4fa250639c03d741fcac55d4f0 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 23 Feb 2023 14:44:58 -0500 Subject: [PATCH 04/18] Use the right version of action-autobuild. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d3a1c86..a731653 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -11,7 +11,7 @@ jobs: addrsize: "32" runs-on: ${{ matrix.os }} steps: - - uses: secondlife/action-autobuild@release + - uses: secondlife/action-autobuild@v3 with: addrsize: ${{ matrix.addrsize }} release: From b51061bfd9c1eb5905ba489a0b43a3001141f730 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 23 Feb 2023 14:47:54 -0500 Subject: [PATCH 05/18] SL-18837: Let all platforms attempt to build. --- .github/workflows/build.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index a731653..c12a750 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -9,6 +9,7 @@ jobs: include: - os: windows-2022 addrsize: "32" + continue-on-error: true runs-on: ${{ matrix.os }} steps: - uses: secondlife/action-autobuild@v3 From b35e59d8b472260e3ab6402470b177d1002393ac Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 23 Feb 2023 14:50:25 -0500 Subject: [PATCH 06/18] SL-18837: Use Python 3 syntax to read BugSplat's Info.plist. --- build-cmd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-cmd.sh b/build-cmd.sh index 7a1ea6d..c79f40a 100755 --- a/build-cmd.sh +++ b/build-cmd.sh @@ -80,7 +80,7 @@ case "$AUTOBUILD_PLATFORM" in framework="$top/Carthage/Build/Mac/BugsplatMac.framework" Info_plist="$framework/Resources/Info.plist" BUGSPLAT_VERSION="$(python -c "import plistlib -print plistlib.readPlist('$Info_plist')['CFBundleShortVersionString']")" +print(plistlib.readPlist('$Info_plist')['CFBundleShortVersionString'])")" # Because of its embedded directory symlinks, copying the framework # works much better if we kill the previous copy first. stage_framework="$stage/lib/release/$(basename "$framework")" From 5621adc7460ae17ee3fdf783dea129029bd73908 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 23 Feb 2023 14:56:36 -0500 Subject: [PATCH 07/18] SL-18837: Use Python 3 plistlib operations. --- build-cmd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-cmd.sh b/build-cmd.sh index c79f40a..d5ce11c 100755 --- a/build-cmd.sh +++ b/build-cmd.sh @@ -80,7 +80,7 @@ case "$AUTOBUILD_PLATFORM" in framework="$top/Carthage/Build/Mac/BugsplatMac.framework" Info_plist="$framework/Resources/Info.plist" BUGSPLAT_VERSION="$(python -c "import plistlib -print(plistlib.readPlist('$Info_plist')['CFBundleShortVersionString'])")" +print(plistlib.load(open('$Info_plist'))['CFBundleShortVersionString'])")" # Because of its embedded directory symlinks, copying the framework # works much better if we kill the previous copy first. stage_framework="$stage/lib/release/$(basename "$framework")" From 0407c6fbabdad404ce5c3d49d6a19adf9aed39e0 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 23 Feb 2023 14:57:22 -0500 Subject: [PATCH 08/18] SL-18837: Ditch Linux: we don't have a BugSplat library for it. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c12a750..b4fb472 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -4,7 +4,7 @@ jobs: build: strategy: matrix: - os: [windows-2022, macos-11, ubuntu-22.04] + os: [windows-2022, macos-11] addrsize: ["64"] include: - os: windows-2022 From 2fa0ec7ca20adc875e441167b3e1955d4e1330ef Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 23 Feb 2023 15:01:01 -0500 Subject: [PATCH 09/18] SL-18837: Open Info.plist in binary mode. --- build-cmd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-cmd.sh b/build-cmd.sh index d5ce11c..30fcea2 100755 --- a/build-cmd.sh +++ b/build-cmd.sh @@ -80,7 +80,7 @@ case "$AUTOBUILD_PLATFORM" in framework="$top/Carthage/Build/Mac/BugsplatMac.framework" Info_plist="$framework/Resources/Info.plist" BUGSPLAT_VERSION="$(python -c "import plistlib -print(plistlib.load(open('$Info_plist'))['CFBundleShortVersionString'])")" +print(plistlib.load(open('$Info_plist', 'rb'))['CFBundleShortVersionString'])")" # Because of its embedded directory symlinks, copying the framework # works much better if we kill the previous copy first. stage_framework="$stage/lib/release/$(basename "$framework")" From 48abeb784db3ac649389da970c18deb9ac0f4cc7 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 22 Mar 2023 17:19:32 -0400 Subject: [PATCH 10/18] SL-18837: Add dependabot.yaml --- .github/dependabot.yaml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index f54fbcd..567a90d 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -1,7 +1,12 @@ -version: 2 -updates: - - - package-ecosystem: github-actions - directory: / - schedule: - interval: monthly +version: 2 +updates: + + - package-ecosystem: github-actions + directory: / + schedule: + interval: monthly + + - package-ecosystem: pip + directory: / + schedule: + interval: monthly From 11da9a7bd1ebecd1671dfb08c8bc3f584d92e855 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 17 Apr 2023 17:26:08 -0400 Subject: [PATCH 11/18] SL-18837: re-enable build error recognition, try C++17 --- .github/workflows/build.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index b4fb472..e496ac4 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -9,11 +9,12 @@ jobs: include: - os: windows-2022 addrsize: "32" - continue-on-error: true + continue-on-error: false runs-on: ${{ matrix.os }} steps: - uses: secondlife/action-autobuild@v3 with: + build-variables-ref: viewer-c++17 addrsize: ${{ matrix.addrsize }} release: needs: build From 0f3de0457bf501511a5c122e3487ae0c7fcb4ff3 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 12 May 2023 12:25:30 -0400 Subject: [PATCH 12/18] SL-18837: Revert to default build-variables-ref --- .github/workflows/build.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index e496ac4..8f085db 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -14,7 +14,6 @@ jobs: steps: - uses: secondlife/action-autobuild@v3 with: - build-variables-ref: viewer-c++17 addrsize: ${{ matrix.addrsize }} release: needs: build From 86a960a79549007b036c255031876410d48ac230 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 18 Jul 2023 16:17:12 -0400 Subject: [PATCH 13/18] SL-19854: Allow viewer builds to fail on SendPdbs.exe fail. --- upload-windows-symbols.sh | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/upload-windows-symbols.sh b/upload-windows-symbols.sh index 6a8dc73..351188b 100644 --- a/upload-windows-symbols.sh +++ b/upload-windows-symbols.sh @@ -13,7 +13,7 @@ then # SendPdbs wants a single /f argument in which individual pathnames are # separated by ';' - function wildjoin { + function strjoin { local IFS="$1" shift echo "$*" @@ -22,34 +22,28 @@ then # upload to BugSplat -- don't echo credentials set +x - # need BugSplat credentials to post symbol files - # defines BUGSPLAT_USER and BUGSPLAT_PASS - source "$build_secrets_checkout/bugsplat/bugsplat.sh" - # for some reason bugsplat requires uploading exe that match the ones we ship to users - # Win 10 specific. Upload files using final exe name (viewer will be adjused separately + # Win 10 specific. Upload files using final exe name (viewer will be adjusted separately # to use same name) - exe_file="${build_dir}/newview/Release/SecondLifeViewer.exe" + reldir="${build_dir}/newview/Release" + filelist=("$reldir/secondlife-bin.pdb") + exe_file="$reldir/SecondLifeViewer.exe" if [ -e "$exe_file" ] then - files="$(wildjoin ';' "${build_dir}/newview/Release"/{secondlife-bin.pdb,SecondLifeViewer.exe})" + filelist+=("$exe_file") else # Compatibility for older builds - files="$(wildjoin ';' "${build_dir}/newview/Release"/secondlife-bin.{pdb,exe})" + filelist+=("$reldir/secondlife-bin.exe") fi args=(/a "$viewer_channel" \ /v "$version" \ /b "$BUGSPLAT_DB" \ - /f "$files") + /f "$(strjoin ';' "${filelist[@]}")") echo "$SendPdbs" /u xxx /p xxx "${args[@]}" "$SendPdbs" /u "$BUGSPLAT_USER" /p "$BUGSPLAT_PASS" "${args[@]}" rc=$? - # SL-19594: HACK HACK HACK to let viewer builds succeeded even when SendPdbs fails - rc=0 - # HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK - set -x [ $rc -eq 0 ] || fatal "BugSplat SendPdbs failed" From 94ce61641d95390a2d2656357cc17675b2673c9d Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 20 Jul 2023 09:36:36 -0400 Subject: [PATCH 14/18] SL-18837: Use macOS PlistBuddy instead of Python's plistlib to read BugsplatMac version number. Also use version-hash instead of version.hash. --- build-cmd.sh | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/build-cmd.sh b/build-cmd.sh index d7c9f1f..8a3937a 100755 --- a/build-cmd.sh +++ b/build-cmd.sh @@ -85,11 +85,8 @@ case "$AUTOBUILD_PLATFORM" in darwin*) # BugsplatMac version embedded in the framework's Info.plist framework="$top/Carthage/Build/Mac/BugsplatMac.framework" - Info_plist="$framework/Resources/Info.plist" - BUGSPLAT_VERSION="$(python3 -c "import plistlib -with open('$Info_plist', 'rb') as fp : - manifest = plistlib.loads(fp.read()) -print (manifest['CFBundleShortVersionString'])")" + BUGSPLAT_VERSION="$(/usr/libexec/PlistBuddy -c 'Print CFBundleShortVersionString' \ + "$framework/Resources/Info.plist")" # Because of its embedded directory symlinks, copying the framework # works much better if we kill the previous copy first. stage_framework="$stage/lib/release/$(basename "$framework")" @@ -126,5 +123,5 @@ print (manifest['CFBundleShortVersionString'])")" echo "This project is not currently supported for $AUTOBUILD_PLATFORM" 1>&2 ; exit 1 ;; esac -echo "$BUGSPLAT_VERSION.$build" > "$stage/version.txt" +echo "$BUGSPLAT_VERSION-$build" > "$stage/version.txt" cp "$BUGSPLAT_DIR/BUGSPLAT_LICENSE.txt" "$stage/LICENSES" From 9df19d3fb59494d6c48c6b84c39c9c8c94d6d072 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 20 Jul 2023 11:29:09 -0400 Subject: [PATCH 15/18] SL-19854: Try setting BugSplatUser environment variable. --- upload-windows-symbols.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/upload-windows-symbols.sh b/upload-windows-symbols.sh index 351188b..bb4026a 100644 --- a/upload-windows-symbols.sh +++ b/upload-windows-symbols.sh @@ -36,6 +36,11 @@ then filelist+=("$reldir/secondlife-bin.exe") fi + # SL-19854: despite the /u argument below, we keep hitting + # ERROR: The /u (user) or /credentials argument must be specified or set + # by environment variable 'BugSplatUser' + # So, suspenders and belt: try setting BugSplatUser. + export BugSplatUser="$BUGSPLAT_USER" args=(/a "$viewer_channel" \ /v "$version" \ /b "$BUGSPLAT_DB" \ From 93a5ce57f65944ef2c286e2f69020cb6588bdb55 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 20 Jul 2023 12:11:12 -0400 Subject: [PATCH 16/18] SL-19854: Set BugSplatPassword as well as BugSplatUser. --- upload-windows-symbols.sh | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/upload-windows-symbols.sh b/upload-windows-symbols.sh index bb4026a..1eb77d5 100644 --- a/upload-windows-symbols.sh +++ b/upload-windows-symbols.sh @@ -19,9 +19,6 @@ then echo "$*" } - # upload to BugSplat -- don't echo credentials - set +x - # for some reason bugsplat requires uploading exe that match the ones we ship to users # Win 10 specific. Upload files using final exe name (viewer will be adjusted separately # to use same name) @@ -36,20 +33,22 @@ then filelist+=("$reldir/secondlife-bin.exe") fi - # SL-19854: despite the /u argument below, we keep hitting + # don't echo credentials + set +x + # SL-19854: specifying /u and /p arguments, we kept hitting # ERROR: The /u (user) or /credentials argument must be specified or set # by environment variable 'BugSplatUser' - # So, suspenders and belt: try setting BugSplatUser. + # ERROR: The /p (password) or /credentials argument must be specified or + # set by environment variable 'BugSplatPassword' + # Shrug, setting those environment variables seems to work better. export BugSplatUser="$BUGSPLAT_USER" - args=(/a "$viewer_channel" \ - /v "$version" \ - /b "$BUGSPLAT_DB" \ - /f "$(strjoin ';' "${filelist[@]}")") - echo "$SendPdbs" /u xxx /p xxx "${args[@]}" - "$SendPdbs" /u "$BUGSPLAT_USER" /p "$BUGSPLAT_PASS" "${args[@]}" - rc=$? - + export BugSplatPassword="$BUGSPLAT_PASS" set -x - [ $rc -eq 0 ] || fatal "BugSplat SendPdbs failed" + "$SendPdbs" \ + /a "$viewer_channel" \ + /v "$version" \ + /b "$BUGSPLAT_DB" \ + /f "$(strjoin ';' "${filelist[@]}")" || \ + fatal "BugSplat SendPdbs failed" fi From b878140613907161befa90dad900d039c43c8337 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 21 Jul 2023 07:37:18 -0400 Subject: [PATCH 17/18] SL-19854: Try running SendPdbs.exe via an intermediate .bat file. Once before we've encountered problems running a Windows executable (wmic.exe) directly from a bash script. The workaround in that case was to run a .bat file from the bash script. Try that for this weird case. --- SendPdbs.bat | 5 +++++ upload-windows-symbols.sh | 25 +++++++++++++------------ 2 files changed, 18 insertions(+), 12 deletions(-) create mode 100755 SendPdbs.bat diff --git a/SendPdbs.bat b/SendPdbs.bat new file mode 100755 index 0000000..f38a02f --- /dev/null +++ b/SendPdbs.bat @@ -0,0 +1,5 @@ +@rem Run SendPdbs.exe via this .bat file because, when msys bash attempts to +@rem run it directly, SendPdbs.exe complains about absence of switches that +@rem are clearly present on its command line. + +"%SendPdbs%" /a "%viewer_channel%" /v "%version%" /b "%BUGSPLAT_DB%" /f "%files%" diff --git a/upload-windows-symbols.sh b/upload-windows-symbols.sh index 1eb77d5..c467887 100644 --- a/upload-windows-symbols.sh +++ b/upload-windows-symbols.sh @@ -5,11 +5,12 @@ if [ "$variant" == "Release" ] then # Our build-cmd.sh copies SendPdbs.exe to bin/release, and our - # autobuild.xml ensures that it's packaged in the tarball - SendPdbs="${build_dir}/packages/bin/release/SendPdbs.exe" + # autobuild.xml ensures that it's packaged in the tarball. + # Because we invoke SendPdbs via SendPdbs.bat, use native_path. + export SendPdbs="$(native_path "${build_dir}/packages/bin/release/SendPdbs.exe")" # viewer version -- explicitly ditch '\r' as bash only strips '\n' - version="$(tr <"${build_dir}/newview/viewer_version.txt" -d '\r')" + export version="$(tr <"${build_dir}/newview/viewer_version.txt" -d '\r')" # SendPdbs wants a single /f argument in which individual pathnames are # separated by ';' @@ -23,14 +24,14 @@ then # Win 10 specific. Upload files using final exe name (viewer will be adjusted separately # to use same name) reldir="${build_dir}/newview/Release" - filelist=("$reldir/secondlife-bin.pdb") + filelist=("$(native_path "$reldir/secondlife-bin.pdb")") exe_file="$reldir/SecondLifeViewer.exe" if [ -e "$exe_file" ] then - filelist+=("$exe_file") + filelist+=("$(native_path "$exe_file")") else # Compatibility for older builds - filelist+=("$reldir/secondlife-bin.exe") + filelist+=("$(native_path "$reldir/secondlife-bin.exe")") fi # don't echo credentials @@ -45,10 +46,10 @@ then export BugSplatPassword="$BUGSPLAT_PASS" set -x - "$SendPdbs" \ - /a "$viewer_channel" \ - /v "$version" \ - /b "$BUGSPLAT_DB" \ - /f "$(strjoin ';' "${filelist[@]}")" || \ - fatal "BugSplat SendPdbs failed" + export files="$(strjoin ';' "${filelist[@]}")" + + # All parameters are passed via environment variables, which is why + # various variables set above are exported. + mydir="$(dirname "$BASH_SOURCE")" + "$mydir/SendPdbs.bat" || fatal "BugSplat SendPdbs failed" fi From 527603a49eaa754827b4ddb2cec9244b7838b324 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 21 Jul 2023 09:04:11 -0400 Subject: [PATCH 18/18] SL-19854: Add SendPdbs.bat to the bugsplat package. --- build-cmd.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build-cmd.sh b/build-cmd.sh index 8a3937a..90b49b5 100755 --- a/build-cmd.sh +++ b/build-cmd.sh @@ -81,6 +81,7 @@ case "$AUTOBUILD_PLATFORM" in cp -v "$BUGSPLAT_DIR/bin/Meziantou.Framework.Win32.CredentialManager.dll" "$stage/bin/release/" cp -v "$BUGSPLAT_DIR/bin/PdbLibrary.dll" "$stage/bin/release/" cp -v "$top/upload-windows-symbols.sh" "$stage/upload-extensions/" + cp -v "$top/SendPdbs.bat" "$stage/upload-extensions/" ;; darwin*) # BugsplatMac version embedded in the framework's Info.plist