Add the missing build stuff
Some checks failed
Build / Build openSUSE (leap:15.6) (push) Has been cancelled
Build / Build openSUSE (leap:16.0) (push) Has been cancelled
Build / Build openSUSE (tumbleweed) (push) Has been cancelled
Build / Build Fedora (42) (push) Has been cancelled
Build / Build Fedora (43) (push) Has been cancelled
Build / Build Fedora (44) (push) Has been cancelled
Build / Build OpenMandriva (cooker) (push) Has been cancelled
Build / Build Mageia (9) (push) Has been cancelled
Build / Build Debian (bookworm) (push) Has been cancelled
Build / Build Debian (forky) (push) Has been cancelled
Build / Build Debian (trixie) (push) Has been cancelled
Build / Build Ubuntu (noble) (push) Has been cancelled
Build / Build Ubuntu (questing) (push) Has been cancelled
Build / Build Ubuntu (resolute) (push) Has been cancelled
Build / Upload Ubuntu PPA (noble) (push) Has been cancelled
Build / Upload Ubuntu PPA (questing) (push) Has been cancelled
Build / Upload Ubuntu PPA (resolute) (push) Has been cancelled
Build / Build FreeBSD (push) Has been cancelled
Build / Build OpenBSD (push) Has been cancelled
Build / Build macOS Public (release, macos-15) (push) Has been cancelled
Build / Build macOS Public (release, macos-15-intel) (push) Has been cancelled
Build / Build macOS Private (release, macos-arm64) (push) Has been cancelled
Build / Build Windows MinGW (i686, debug) (push) Has been cancelled
Build / Build Windows MinGW (i686, release) (push) Has been cancelled
Build / Build Windows MinGW (x86_64, debug) (push) Has been cancelled
Build / Build Windows MinGW (x86_64, release) (push) Has been cancelled
Build / Build Windows MSVC (arm64, debug, arm64 debug, windows-11-arm) (push) Has been cancelled
Build / Build Windows MSVC (arm64, release, arm64 release, windows-11-arm) (push) Has been cancelled
Build / Build Windows MSVC (x86, debug, x86 debug, windows-2022) (push) Has been cancelled
Build / Build Windows MSVC (x86, release, x86 release, windows-2022) (push) Has been cancelled
Build / Build Windows MSVC (x86_64, debug, x86_64 debug, windows-2022) (push) Has been cancelled
Build / Build Windows MSVC (x86_64, release, x86_64 release, windows-2022) (push) Has been cancelled
Build / Upload (push) Has been cancelled
Build / Attach to release (push) Has been cancelled
Some checks failed
Build / Build openSUSE (leap:15.6) (push) Has been cancelled
Build / Build openSUSE (leap:16.0) (push) Has been cancelled
Build / Build openSUSE (tumbleweed) (push) Has been cancelled
Build / Build Fedora (42) (push) Has been cancelled
Build / Build Fedora (43) (push) Has been cancelled
Build / Build Fedora (44) (push) Has been cancelled
Build / Build OpenMandriva (cooker) (push) Has been cancelled
Build / Build Mageia (9) (push) Has been cancelled
Build / Build Debian (bookworm) (push) Has been cancelled
Build / Build Debian (forky) (push) Has been cancelled
Build / Build Debian (trixie) (push) Has been cancelled
Build / Build Ubuntu (noble) (push) Has been cancelled
Build / Build Ubuntu (questing) (push) Has been cancelled
Build / Build Ubuntu (resolute) (push) Has been cancelled
Build / Upload Ubuntu PPA (noble) (push) Has been cancelled
Build / Upload Ubuntu PPA (questing) (push) Has been cancelled
Build / Upload Ubuntu PPA (resolute) (push) Has been cancelled
Build / Build FreeBSD (push) Has been cancelled
Build / Build OpenBSD (push) Has been cancelled
Build / Build macOS Public (release, macos-15) (push) Has been cancelled
Build / Build macOS Public (release, macos-15-intel) (push) Has been cancelled
Build / Build macOS Private (release, macos-arm64) (push) Has been cancelled
Build / Build Windows MinGW (i686, debug) (push) Has been cancelled
Build / Build Windows MinGW (i686, release) (push) Has been cancelled
Build / Build Windows MinGW (x86_64, debug) (push) Has been cancelled
Build / Build Windows MinGW (x86_64, release) (push) Has been cancelled
Build / Build Windows MSVC (arm64, debug, arm64 debug, windows-11-arm) (push) Has been cancelled
Build / Build Windows MSVC (arm64, release, arm64 release, windows-11-arm) (push) Has been cancelled
Build / Build Windows MSVC (x86, debug, x86 debug, windows-2022) (push) Has been cancelled
Build / Build Windows MSVC (x86, release, x86 release, windows-2022) (push) Has been cancelled
Build / Build Windows MSVC (x86_64, debug, x86_64 debug, windows-2022) (push) Has been cancelled
Build / Build Windows MSVC (x86_64, release, x86_64 release, windows-2022) (push) Has been cancelled
Build / Upload (push) Has been cancelled
Build / Attach to release (push) Has been cancelled
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,4 +1,3 @@
|
|||||||
/build
|
|
||||||
/bin
|
/bin
|
||||||
/CMakeLists.txt.user
|
/CMakeLists.txt.user
|
||||||
/.qtcreator
|
/.qtcreator
|
||||||
|
|||||||
64
build/README.md
Normal file
64
build/README.md
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
# Build helper scripts
|
||||||
|
|
||||||
|
This `build/` directory contains **helper scripts and notes** for building Strawberry.
|
||||||
|
|
||||||
|
- It is **not** intended to be your CMake build output directory.
|
||||||
|
- Recommended CMake build output directories: `cmake-build/`, `build-release/`, etc.
|
||||||
|
|
||||||
|
## macOS
|
||||||
|
|
||||||
|
- Install dependencies via Homebrew:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./build/macos/install_brew_deps.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
- Build Strawberry:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./build/macos/build_app.sh --release
|
||||||
|
open ./cmake-build-macos-release/strawberry.app
|
||||||
|
```
|
||||||
|
|
||||||
|
## macOS signing + notarization (Developer ID distribution)
|
||||||
|
|
||||||
|
This repo includes `build/macos/build_sign_notarize.sh` to automate:
|
||||||
|
|
||||||
|
- build → (optional deploy) → codesign → notarize → staple → verify
|
||||||
|
|
||||||
|
### One-time setup (Apple Developer)
|
||||||
|
|
||||||
|
- **Install certificates**:
|
||||||
|
- In the Apple Developer portal, create (or download) a **Developer ID Application** certificate.
|
||||||
|
- Install it into your login keychain (Xcode can manage this via **Xcode → Settings → Accounts**).
|
||||||
|
|
||||||
|
- **Provisioning profiles**:
|
||||||
|
- For **Developer ID distribution (outside the Mac App Store)**, you typically **do not need a provisioning profile**.
|
||||||
|
- You *do* need profiles if you are building a **Mac App Store**-signed app (not what this repo’s scripts target).
|
||||||
|
|
||||||
|
- **Notarization credentials**:
|
||||||
|
- Create a `notarytool` keychain profile (recommended) so you don’t have to pass secrets on the command line:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
xcrun notarytool store-credentials \
|
||||||
|
--keychain-profile "<profile-name>" \
|
||||||
|
--apple-id "<your-apple-id>" \
|
||||||
|
--team-id "<TEAMID>" \
|
||||||
|
--password "<app-specific-password>"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Listing what’s installed locally
|
||||||
|
|
||||||
|
Run with no args to list local signing identities + notarytool profiles:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./build/macos/build_sign_notarize.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build + sign + notarize
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./build/macos/build_sign_notarize.sh --run --release --clean --deploy \
|
||||||
|
--identity "Developer ID Application: Your Name (TEAMID)" \
|
||||||
|
--notary-profile "<profile-name>"
|
||||||
|
```
|
||||||
155
build/macos/build_app.sh
Executable file
155
build/macos/build_app.sh
Executable file
@@ -0,0 +1,155 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ts() { date +"%H:%M:%S"; }
|
||||||
|
lower() { echo "$1" | tr '[:upper:]' '[:lower:]'; }
|
||||||
|
|
||||||
|
script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
repo_root="$(cd -- "${script_dir}/../.." && pwd)"
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<'EOF'
|
||||||
|
Usage:
|
||||||
|
./build/macos/build_app.sh [--debug|--release] [--deploy] [--dmg] [--clean] [--build-dir <path>]
|
||||||
|
|
||||||
|
What it does:
|
||||||
|
- Configures and builds Strawberry with CMake + Ninja
|
||||||
|
- Optional: runs CMake targets 'deploy' (bundle deps) and 'dmg' (create DMG)
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--release Release build (default)
|
||||||
|
--debug Debug build
|
||||||
|
--deploy Run: cmake --build <builddir> --target deploy
|
||||||
|
--dmg Run: cmake --build <builddir> --target dmg (implies --deploy)
|
||||||
|
--clean Delete the build dir before configuring
|
||||||
|
--build-dir Override build directory (default: <repo>/cmake-build-macos-<config>)
|
||||||
|
-h, --help Show help
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
config="Release"
|
||||||
|
do_deploy=0
|
||||||
|
do_dmg=0
|
||||||
|
do_clean=0
|
||||||
|
build_dir=""
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
--release) config="Release"; shift ;;
|
||||||
|
--debug) config="Debug"; shift ;;
|
||||||
|
--deploy) do_deploy=1; shift ;;
|
||||||
|
--dmg) do_dmg=1; do_deploy=1; shift ;;
|
||||||
|
--clean) do_clean=1; shift ;;
|
||||||
|
--build-dir) build_dir="${2:-}"; shift 2 ;;
|
||||||
|
-h|--help) usage; exit 0 ;;
|
||||||
|
*) echo "Unknown arg: $1" >&2; usage; exit 2 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "$(uname -s)" != "Darwin" ]]; then
|
||||||
|
echo "Error: This script is for macOS only." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v xcode-select >/dev/null 2>&1 || ! xcode-select -p >/dev/null 2>&1; then
|
||||||
|
echo "Error: Xcode Command Line Tools not found." >&2
|
||||||
|
echo "Install them first: xcode-select --install" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v brew >/dev/null 2>&1; then
|
||||||
|
echo "Error: Homebrew ('brew') not found in PATH." >&2
|
||||||
|
echo "Install Homebrew first: https://brew.sh/" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v cmake >/dev/null 2>&1; then
|
||||||
|
echo "Error: cmake not found. Did you run ./build/macos/install_brew_deps.sh ?" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v ninja >/dev/null 2>&1; then
|
||||||
|
echo "Error: ninja not found. Did you run ./build/macos/install_brew_deps.sh ?" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
brew_prefix="$(brew --prefix)"
|
||||||
|
qt_prefix="$(brew --prefix qt)"
|
||||||
|
icu_prefix="$(brew --prefix icu4c || true)"
|
||||||
|
|
||||||
|
if [[ -z "$build_dir" ]]; then
|
||||||
|
build_dir="${repo_root}/cmake-build-macos-$(lower "$config")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> [$(ts)] Repo: ${repo_root}"
|
||||||
|
echo "==> [$(ts)] Build dir: ${build_dir}"
|
||||||
|
echo "==> [$(ts)] Config: ${config}"
|
||||||
|
|
||||||
|
if [[ "$do_clean" -eq 1 ]]; then
|
||||||
|
echo "==> [$(ts)] Cleaning build dir"
|
||||||
|
rm -rf "$build_dir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$build_dir"
|
||||||
|
|
||||||
|
# Make pkg-config more reliable with Homebrew.
|
||||||
|
export PKG_CONFIG_PATH="${brew_prefix}/lib/pkgconfig:${brew_prefix}/share/pkgconfig:${PKG_CONFIG_PATH:-}"
|
||||||
|
|
||||||
|
# For dist/CMakeLists.txt Info.plist minimum version logic.
|
||||||
|
export MACOSX_DEPLOYMENT_TARGET="${MACOSX_DEPLOYMENT_TARGET:-12.0}"
|
||||||
|
|
||||||
|
cmake_prefix_path="${qt_prefix};${brew_prefix}"
|
||||||
|
|
||||||
|
echo "==> [$(ts)] Configuring (CMAKE_PREFIX_PATH=${cmake_prefix_path})"
|
||||||
|
cmake_extra_args=()
|
||||||
|
|
||||||
|
# Optional: override Sparkle update feed / key for your own published builds.
|
||||||
|
# Example:
|
||||||
|
# export SPARKLE_FEED_URL="https://example.com/appcast.xml"
|
||||||
|
# export SPARKLE_PUBLIC_ED25519_KEY="base64=="
|
||||||
|
if [[ -n "${SPARKLE_FEED_URL:-}" ]]; then
|
||||||
|
cmake_extra_args+=("-DSPARKLE_FEED_URL=${SPARKLE_FEED_URL}")
|
||||||
|
fi
|
||||||
|
if [[ -n "${SPARKLE_PUBLIC_ED25519_KEY:-}" ]]; then
|
||||||
|
cmake_extra_args+=("-DSPARKLE_PUBLIC_ED25519_KEY=${SPARKLE_PUBLIC_ED25519_KEY}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
cmake -S "$repo_root" -B "$build_dir" -G Ninja \
|
||||||
|
-DCMAKE_BUILD_TYPE="$config" \
|
||||||
|
-DCMAKE_PREFIX_PATH="$cmake_prefix_path" \
|
||||||
|
-DCMAKE_FRAMEWORK_PATH="${brew_prefix}/Frameworks;${brew_prefix}/opt/sparkle-framework/Frameworks" \
|
||||||
|
-DOPTIONAL_COMPONENTS_MISSING_DEPS_ARE_FATAL=OFF \
|
||||||
|
${cmake_extra_args+"${cmake_extra_args[@]}"} \
|
||||||
|
${icu_prefix:+-DICU_ROOT="$icu_prefix"}
|
||||||
|
|
||||||
|
echo "==> [$(ts)] Building"
|
||||||
|
cmake --build "$build_dir" --parallel
|
||||||
|
|
||||||
|
if [[ "$do_deploy" -eq 1 ]]; then
|
||||||
|
echo "==> [$(ts)] Preparing env for 'deploy' target (GIO/GStreamer)"
|
||||||
|
export GIO_EXTRA_MODULES="${brew_prefix}/lib/gio/modules"
|
||||||
|
export GST_PLUGIN_SCANNER="${brew_prefix}/opt/gstreamer/libexec/gstreamer-1.0/gst-plugin-scanner"
|
||||||
|
export GST_PLUGIN_PATH="${brew_prefix}/lib/gstreamer-1.0"
|
||||||
|
|
||||||
|
# Optional, but helps dist/macos/macgstcopy.sh bundle libsoup which GStreamer loads dynamically.
|
||||||
|
libsoup_prefix="$(brew --prefix libsoup 2>/dev/null || true)"
|
||||||
|
if [[ -n "${libsoup_prefix}" ]]; then
|
||||||
|
libsoup_dylib="$(ls -1 "${libsoup_prefix}"/lib/libsoup-*.dylib 2>/dev/null | head -n 1 || true)"
|
||||||
|
if [[ -n "${libsoup_dylib}" ]]; then
|
||||||
|
export LIBSOUP_LIBRARY_PATH="${libsoup_dylib}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> [$(ts)] Running: deploy"
|
||||||
|
cmake --build "$build_dir" --target deploy
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$do_dmg" -eq 1 ]]; then
|
||||||
|
echo "==> [$(ts)] Running: dmg"
|
||||||
|
cmake --build "$build_dir" --target dmg
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> [$(ts)] Done"
|
||||||
|
echo "Built app:"
|
||||||
|
echo " ${build_dir}/strawberry.app"
|
||||||
|
|
||||||
186
build/macos/build_sign_notarize.sh
Executable file
186
build/macos/build_sign_notarize.sh
Executable file
@@ -0,0 +1,186 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ts() { date +"%H:%M:%S"; }
|
||||||
|
|
||||||
|
script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
repo_root="$(cd -- "${script_dir}/../.." && pwd)"
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<'EOF'
|
||||||
|
Usage:
|
||||||
|
./build/macos/build_sign_notarize.sh # list local signing identities + notary profiles
|
||||||
|
./build/macos/build_sign_notarize.sh --run [options] # build, sign, notarize, staple
|
||||||
|
|
||||||
|
Common options:
|
||||||
|
--run Perform build/sign/notarize (otherwise list identities/profiles)
|
||||||
|
--release | --debug Build config (default: Release)
|
||||||
|
--clean Clean build dir before build
|
||||||
|
--deploy Run CMake 'deploy' target before signing (recommended for distributing)
|
||||||
|
--build-dir <path> Override build directory
|
||||||
|
|
||||||
|
Signing options:
|
||||||
|
--identity "<name>" Codesign identity (e.g. "Developer ID Application: Your Name (TEAMID)")
|
||||||
|
--entitlements <plist> Optional entitlements plist for codesign
|
||||||
|
|
||||||
|
Notarization options (recommended):
|
||||||
|
--notary-profile <name> notarytool keychain profile name (created via `xcrun notarytool store-credentials`)
|
||||||
|
--skip-notarize Skip notarization
|
||||||
|
|
||||||
|
Outputs:
|
||||||
|
- Signed app: <build-dir>/strawberry.app
|
||||||
|
- Zip for notarization: <build-dir>/strawberry-notarize.zip
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
- This script is intended for Developer ID distribution (outside Mac App Store).
|
||||||
|
- If you want Sparkle updates, you'll typically ship a notarized .zip + an appcast feed.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
list_identities_and_profiles() {
|
||||||
|
echo "==> [$(ts)] macOS code signing identities (Keychain)"
|
||||||
|
if command -v security >/dev/null 2>&1; then
|
||||||
|
security find-identity -p codesigning -v || true
|
||||||
|
else
|
||||||
|
echo "security tool not found?"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==> [$(ts)] notarytool profiles (keychain profiles)"
|
||||||
|
if xcrun notarytool --help >/dev/null 2>&1; then
|
||||||
|
xcrun notarytool list-profiles 2>/dev/null || echo "(none; create one with: xcrun notarytool store-credentials)"
|
||||||
|
else
|
||||||
|
echo "xcrun notarytool not available. Install Xcode CLT: xcode-select --install"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "==> [$(ts)] Provisioning profiles (macOS)"
|
||||||
|
prof_dir="${HOME}/Library/MobileDevice/Provisioning Profiles"
|
||||||
|
if [[ -d "${prof_dir}" ]]; then
|
||||||
|
ls -la "${prof_dir}" | head -n 50
|
||||||
|
else
|
||||||
|
echo "(none found at '${prof_dir}')"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ "$(uname -s)" != "Darwin" ]]; then
|
||||||
|
echo "Error: This script is for macOS only." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v xcode-select >/dev/null 2>&1 || ! xcode-select -p >/dev/null 2>&1; then
|
||||||
|
echo "Error: Xcode Command Line Tools not found." >&2
|
||||||
|
echo "Install them first: xcode-select --install" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_run=0
|
||||||
|
config="Release"
|
||||||
|
do_clean=0
|
||||||
|
do_deploy=0
|
||||||
|
build_dir=""
|
||||||
|
identity=""
|
||||||
|
entitlements=""
|
||||||
|
notary_profile=""
|
||||||
|
skip_notarize=0
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
--run) do_run=1; shift ;;
|
||||||
|
--release) config="Release"; shift ;;
|
||||||
|
--debug) config="Debug"; shift ;;
|
||||||
|
--clean) do_clean=1; shift ;;
|
||||||
|
--deploy) do_deploy=1; shift ;;
|
||||||
|
--build-dir) build_dir="${2:-}"; shift 2 ;;
|
||||||
|
--identity) identity="${2:-}"; shift 2 ;;
|
||||||
|
--entitlements) entitlements="${2:-}"; shift 2 ;;
|
||||||
|
--notary-profile) notary_profile="${2:-}"; shift 2 ;;
|
||||||
|
--skip-notarize) skip_notarize=1; shift ;;
|
||||||
|
-h|--help) usage; exit 0 ;;
|
||||||
|
*) echo "Unknown arg: $1" >&2; usage; exit 2 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "$do_run" -eq 0 ]]; then
|
||||||
|
usage
|
||||||
|
echo
|
||||||
|
list_identities_and_profiles
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$build_dir" ]]; then
|
||||||
|
# Keep consistent with build_app.sh output dir naming
|
||||||
|
lc_config="$(echo "$config" | tr '[:upper:]' '[:lower:]')"
|
||||||
|
build_dir="${repo_root}/cmake-build-macos-${lc_config}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
app_path="${build_dir}/strawberry.app"
|
||||||
|
bin_path="${app_path}/Contents/MacOS/strawberry"
|
||||||
|
zip_path="${build_dir}/strawberry-notarize.zip"
|
||||||
|
|
||||||
|
if [[ -z "$identity" ]]; then
|
||||||
|
echo "Error: Missing --identity (Developer ID Application identity)." >&2
|
||||||
|
echo "Run without args to list identities, then pass e.g.:" >&2
|
||||||
|
echo " --identity \"Developer ID Application: Your Name (TEAMID)\"" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$skip_notarize" -eq 0 && -z "$notary_profile" ]]; then
|
||||||
|
echo "Error: Missing --notary-profile (or pass --skip-notarize)." >&2
|
||||||
|
echo "Create one with:" >&2
|
||||||
|
echo " xcrun notarytool store-credentials --keychain-profile <name> --apple-id <id> --team-id <TEAMID> --password <app-specific-password>" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> [$(ts)] Building Strawberry"
|
||||||
|
build_args=( "--release" )
|
||||||
|
if [[ "$config" == "Debug" ]]; then build_args=( "--debug" ); fi
|
||||||
|
if [[ "$do_clean" -eq 1 ]]; then build_args+=( "--clean" ); fi
|
||||||
|
if [[ -n "$build_dir" ]]; then build_args+=( "--build-dir" "$build_dir" ); fi
|
||||||
|
if [[ "$do_deploy" -eq 1 ]]; then build_args+=( "--deploy" ); fi
|
||||||
|
|
||||||
|
"${repo_root}/build/macos/build_app.sh" "${build_args[@]}"
|
||||||
|
|
||||||
|
if [[ ! -x "$bin_path" ]]; then
|
||||||
|
echo "Error: built app not found at: $app_path" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> [$(ts)] Codesigning (hardened runtime)"
|
||||||
|
codesign_args=( --force --timestamp --options runtime --sign "$identity" )
|
||||||
|
if [[ -n "$entitlements" ]]; then
|
||||||
|
codesign_args+=( --entitlements "$entitlements" )
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Sign everything inside the bundle, then the main app.
|
||||||
|
find "$app_path" -type f \( -name "*.dylib" -o -name "*.so" -o -perm -111 \) -print0 | while IFS= read -r -d '' f; do
|
||||||
|
codesign "${codesign_args[@]}" "$f" >/dev/null
|
||||||
|
done
|
||||||
|
find "$app_path/Contents/Frameworks" "$app_path/Contents/PlugIns" -type d -name "*.framework" -print0 2>/dev/null | while IFS= read -r -d '' fw; do
|
||||||
|
codesign "${codesign_args[@]}" "$fw" >/dev/null
|
||||||
|
done
|
||||||
|
codesign "${codesign_args[@]}" "$app_path" >/dev/null
|
||||||
|
|
||||||
|
echo "==> [$(ts)] Verifying codesign"
|
||||||
|
codesign --verify --deep --strict --verbose=2 "$app_path"
|
||||||
|
|
||||||
|
echo "==> [$(ts)] Creating zip for notarization"
|
||||||
|
rm -f "$zip_path"
|
||||||
|
ditto -c -k --sequesterRsrc --keepParent "$app_path" "$zip_path"
|
||||||
|
|
||||||
|
if [[ "$skip_notarize" -eq 0 ]]; then
|
||||||
|
echo "==> [$(ts)] Notarizing (this can take a few minutes)"
|
||||||
|
xcrun notarytool submit "$zip_path" --keychain-profile "$notary_profile" --wait
|
||||||
|
|
||||||
|
echo "==> [$(ts)] Stapling"
|
||||||
|
xcrun stapler staple "$app_path"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> [$(ts)] Gatekeeper assessment"
|
||||||
|
spctl -a -vv --type execute "$app_path" || true
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Done."
|
||||||
|
echo "App: $app_path"
|
||||||
|
echo "Zip: $zip_path"
|
||||||
|
|
||||||
119
build/macos/install_brew_deps.sh
Executable file
119
build/macos/install_brew_deps.sh
Executable file
@@ -0,0 +1,119 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
repo_root="$(cd -- "${script_dir}/../.." && pwd)"
|
||||||
|
|
||||||
|
ts() { date +"%H:%M:%S"; }
|
||||||
|
|
||||||
|
run_with_heartbeat() {
|
||||||
|
local desc="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
local start now elapsed pid hb_pid
|
||||||
|
start="$(date +%s)"
|
||||||
|
|
||||||
|
echo "==> [$(ts)] ${desc}"
|
||||||
|
|
||||||
|
# Heartbeat: print elapsed time periodically in case the underlying command is quiet
|
||||||
|
(
|
||||||
|
while true; do
|
||||||
|
sleep 20
|
||||||
|
now="$(date +%s)"
|
||||||
|
elapsed="$((now - start))"
|
||||||
|
echo " [$(ts)] ... still working (${elapsed}s elapsed) ..."
|
||||||
|
done
|
||||||
|
) &
|
||||||
|
hb_pid="$!"
|
||||||
|
|
||||||
|
set +e
|
||||||
|
"$@"
|
||||||
|
local rc=$?
|
||||||
|
set -e
|
||||||
|
|
||||||
|
kill "$hb_pid" >/dev/null 2>&1 || true
|
||||||
|
wait "$hb_pid" >/dev/null 2>&1 || true
|
||||||
|
|
||||||
|
now="$(date +%s)"
|
||||||
|
elapsed="$((now - start))"
|
||||||
|
|
||||||
|
if [[ $rc -ne 0 ]]; then
|
||||||
|
echo "Error: '${desc}' failed after ${elapsed}s (exit $rc)." >&2
|
||||||
|
return "$rc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> [$(ts)] Done: ${desc} (${elapsed}s)"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ "$(uname -s)" != "Darwin" ]]; then
|
||||||
|
echo "Error: This script is for macOS only." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v brew >/dev/null 2>&1; then
|
||||||
|
echo "Error: Homebrew ('brew') not found in PATH." >&2
|
||||||
|
echo "Install Homebrew first: https://brew.sh/" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Homebrew taps are git clones; local formula changes must be committed to be visible.
|
||||||
|
if command -v git >/dev/null 2>&1 && git -C "$repo_root" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
||||||
|
if git -C "$repo_root" status --porcelain Formula/ | grep -q .; then
|
||||||
|
echo "Error: You have uncommitted changes under Formula/." >&2
|
||||||
|
echo "Homebrew taps are git clones, so uncommitted formulae won't be visible to 'brew tap'." >&2
|
||||||
|
echo "Commit your changes, then re-run this script." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Optional: disable auto-update for faster, more predictable runs.
|
||||||
|
export HOMEBREW_NO_AUTO_UPDATE="${HOMEBREW_NO_AUTO_UPDATE:-1}"
|
||||||
|
|
||||||
|
cd "$repo_root"
|
||||||
|
|
||||||
|
echo "==> [$(ts)] Using repo: $repo_root"
|
||||||
|
|
||||||
|
# Strawberry includes local Homebrew formulae under Formula/.
|
||||||
|
# Homebrew requires formulae to be in a tap; we tap this repo via file:// and then
|
||||||
|
# update the tap clone to the latest commit (without untapping, since Homebrew may
|
||||||
|
# refuse to untap when formulae from this tap are installed).
|
||||||
|
run_with_heartbeat "Ensuring local tap exists: strawberry/local" bash -lc \
|
||||||
|
"brew tap | grep -q '^strawberry/local$' || brew tap strawberry/local 'file://$repo_root' >/dev/null"
|
||||||
|
|
||||||
|
run_with_heartbeat "Refreshing strawberry/local tap clone" bash -lc '
|
||||||
|
tap_repo="$(brew --repo strawberry/local)"
|
||||||
|
cd "$tap_repo"
|
||||||
|
# Make sure the remote points at the current local repo path.
|
||||||
|
git remote set-url origin "file://'"$repo_root"'"
|
||||||
|
git fetch -q origin
|
||||||
|
default_ref="$(git symbolic-ref -q --short refs/remotes/origin/HEAD || true)"
|
||||||
|
if [ -z "$default_ref" ]; then
|
||||||
|
default_ref="origin/master"
|
||||||
|
fi
|
||||||
|
git reset --hard -q "$default_ref"
|
||||||
|
'
|
||||||
|
|
||||||
|
for f in kdsingleapplication-qt6 qtsparkle-qt6 sparkle-framework libgpod; do
|
||||||
|
if ! brew info "strawberry/local/${f}" >/dev/null 2>&1; then
|
||||||
|
echo "Error: Missing formula strawberry/local/${f} in the tapped repo." >&2
|
||||||
|
echo "If you recently added/changed formulae, ensure they are committed, then refresh the tap:" >&2
|
||||||
|
echo " git -C \"$(brew --repo strawberry/local)\" pull --ff-only" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
run_with_heartbeat "Installing dependencies from Brewfile" \
|
||||||
|
brew bundle install --file "$repo_root/Brewfile" --verbose
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
Done.
|
||||||
|
|
||||||
|
Notes for packaging (optional):
|
||||||
|
- The CMake target 'deploy' expects these env vars for bundling GIO + GStreamer bits:
|
||||||
|
export GIO_EXTRA_MODULES="\$(brew --prefix)/lib/gio/modules"
|
||||||
|
export GST_PLUGIN_SCANNER="\$(brew --prefix gstreamer)/libexec/gstreamer-1.0/gst-plugin-scanner"
|
||||||
|
export GST_PLUGIN_PATH="\$(brew --prefix)/lib/gstreamer-1.0"
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
Reference in New Issue
Block a user