Refactor macdeploycheck installation and update Brewfile tap path
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 modifies the `macdeploycheck` formula to install the script directly from the tapped repository instead of using a local file URL. Additionally, the `Brewfile` is updated to use the directory of the Brewfile for the tap path, ensuring compatibility when running `brew bundle` from different locations. The `install_brew_deps.sh` script is also enhanced to provide more detailed error messages when missing formulae are detected.
This commit is contained in:
2026-01-22 23:53:29 +09:00
parent bea094cbf1
commit 08fe6d7ebb
4 changed files with 83 additions and 80 deletions

View File

@@ -28,11 +28,10 @@ brew "gstreamer"
# Strawberry requires KDAB's KDSingleApplication (CMake package name: KDSingleApplication-qt6).
# Homebrew core doesn't consistently provide it, so this repo includes a local formula.
# Homebrew requires formulae to be installed from a tap; `brew bundle` will tap *this repo*
# using the current working directory (run `brew bundle` from the repo root).
# If you previously tapped `strawberry/local` before `Formula/` existed, refresh it with:
# brew untap strawberry/local && brew tap strawberry/local "file://$PWD"
tap "strawberry/local", "file://#{Dir.pwd}"
# Homebrew requires formulae to be installed from a tap; we tap *this repo* via file://.
# Use the Brewfile's directory (repo root) rather than the current working directory,
# so `brew bundle --file /path/to/Brewfile` works no matter where you run it from.
tap "strawberry/local", "file://#{File.expand_path(__dir__)}"
brew "strawberry/local/kdsingleapplication-qt6"
brew "strawberry/local/qtsparkle-qt6" # optional: QtSparkle integration
brew "strawberry/local/sparkle-framework" # optional: Sparkle integration (framework)

View File

@@ -1,7 +1,6 @@
class Macdeploycheck < Formula
desc "Sanity checks a macOS .app bundle for accidental Homebrew runtime dependencies"
homepage "https://github.com/strawberrymusicplayer/strawberry"
url "file://#{__FILE__}"
version "0.1.0"
sha256 :no_check
license "MIT"
@@ -9,80 +8,10 @@ class Macdeploycheck < Formula
depends_on :macos
def install
(bin/"macdeploycheck").write <<~'EOS'
#!/usr/bin/env bash
set -euo pipefail
app="${1:-}"
if [[ -z "$app" ]]; then
echo "Usage: macdeploycheck <path/to/App.app>" >&2
exit 2
fi
if [[ ! -d "$app" ]]; then
echo "Error: app bundle not found: $app" >&2
exit 2
fi
if [[ ! -d "$app/Contents" ]]; then
echo "Error: not a macOS app bundle (missing Contents/): $app" >&2
exit 2
fi
fail=0
tmp="$(mktemp -t macdeploycheck.XXXXXX)"
trap 'rm -f "$tmp"' EXIT
# Collect Mach-O files (executables + dylibs) inside the bundle.
while IFS= read -r -d '' f; do
if file "$f" | grep -q "Mach-O"; then
echo "$f" >>"$tmp"
fi
done < <(find "$app/Contents" -type f \( -perm -111 -o -name "*.dylib" -o -name "*.so" \) -print0 2>/dev/null)
if [[ ! -s "$tmp" ]]; then
echo "Warning: no Mach-O files found under $app/Contents" >&2
exit 0
fi
echo "macdeploycheck: scanning for external (Homebrew) runtime deps..."
while IFS= read -r f; do
# otool -L prints:
# <file>:
# <dep> (compatibility version ..., current version ...)
deps="$(otool -L "$f" 2>/dev/null | tail -n +2 | awk '{print $1}' || true)"
while IFS= read -r dep; do
[[ -z "$dep" ]] && continue
# Ignore system and rpath/loader/executable paths.
case "$dep" in
/System/*|/usr/lib/*|@rpath/*|@loader_path/*|@executable_path/*) continue ;;
esac
# These are the common accidental runtime deps that will break distribution.
if [[ "$dep" == /opt/homebrew/* || "$dep" == /usr/local/* || "$dep" == /opt/local/* ]]; then
echo "ERROR: $f links to external path: $dep" >&2
fail=1
fi
done <<<"$deps"
done <"$tmp"
if [[ "$fail" -ne 0 ]]; then
cat >&2 <<'EOM'
One or more binaries in your .app link to a Homebrew (or MacPorts) path.
That usually means the bundle is not self-contained and will fail on other machines,
or will fail notarization/codesigning validation.
Fix: re-run your deploy step (e.g. macdeployqt) so frameworks/dylibs are bundled and
their install names are rewritten to @rpath/@loader_path.
EOM
exit 1
fi
echo "OK: no external Homebrew/MacPorts runtime deps detected."
exit 0
EOS
chmod 0755, bin/"macdeploycheck"
# Install the script from the tapped repo working tree.
# (__dir__ is .../Formula, so ../.. is the tap root)
script = File.expand_path("../../dist/macos/macdeploycheck.sh", __dir__)
bin.install script => "macdeploycheck"
end
test do

View File

@@ -96,6 +96,8 @@ run_with_heartbeat "Refreshing strawberry/local tap clone" bash -lc '
for f in kdsingleapplication-qt6 qtsparkle-qt6 sparkle-framework libgpod macdeploycheck; 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 "Details (brew info):" >&2
brew info "strawberry/local/${f}" >&2 || true
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

73
dist/macos/macdeploycheck.sh vendored Normal file
View File

@@ -0,0 +1,73 @@
#!/usr/bin/env bash
set -euo pipefail
# macdeploycheck: sanity check a deployed macOS .app bundle for accidental runtime deps
# on Homebrew/MacPorts paths (which break distribution / App Store / notarization).
#
# Usage:
# macdeploycheck /path/to/App.app
app="${1:-}"
if [[ -z "$app" ]]; then
echo "Usage: macdeploycheck <path/to/App.app>" >&2
exit 2
fi
if [[ ! -d "$app" ]]; then
echo "Error: app bundle not found: $app" >&2
exit 2
fi
if [[ ! -d "$app/Contents" ]]; then
echo "Error: not a macOS app bundle (missing Contents/): $app" >&2
exit 2
fi
fail=0
tmp="$(mktemp -t macdeploycheck.XXXXXX)"
trap 'rm -f "$tmp"' EXIT
# Collect Mach-O files (executables + dylibs) inside the bundle.
while IFS= read -r -d '' f; do
if file "$f" | grep -q "Mach-O"; then
echo "$f" >>"$tmp"
fi
done < <(find "$app/Contents" -type f \( -perm -111 -o -name "*.dylib" -o -name "*.so" \) -print0 2>/dev/null)
if [[ ! -s "$tmp" ]]; then
echo "Warning: no Mach-O files found under $app/Contents" >&2
exit 0
fi
echo "macdeploycheck: scanning for external (Homebrew/MacPorts) runtime deps..."
while IFS= read -r f; do
deps="$(otool -L "$f" 2>/dev/null | tail -n +2 | awk '{print $1}' || true)"
while IFS= read -r dep; do
[[ -z "$dep" ]] && continue
# Ignore system and rpath/loader/executable paths.
case "$dep" in
/System/*|/usr/lib/*|@rpath/*|@loader_path/*|@executable_path/*) continue ;;
esac
# Common accidental runtime deps that will break distribution.
if [[ "$dep" == /opt/homebrew/* || "$dep" == /usr/local/* || "$dep" == /opt/local/* ]]; then
echo "ERROR: $f links to external path: $dep" >&2
fail=1
fi
done <<<"$deps"
done <"$tmp"
if [[ "$fail" -ne 0 ]]; then
cat >&2 <<'EOM'
One or more binaries in your .app link to a Homebrew (or MacPorts) path.
That usually means the bundle is not self-contained and will fail on other machines.
Fix: re-run your deploy step (e.g. macdeployqt) so frameworks/dylibs are bundled and
their install names are rewritten to @rpath/@loader_path.
EOM
exit 1
fi
echo "OK: no external Homebrew/MacPorts runtime deps detected."
exit 0