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
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:
9
Brewfile
9
Brewfile
@@ -28,11 +28,10 @@ brew "gstreamer"
|
|||||||
|
|
||||||
# Strawberry requires KDAB's KDSingleApplication (CMake package name: KDSingleApplication-qt6).
|
# 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 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*
|
# Homebrew requires formulae to be installed from a tap; we tap *this repo* via file://.
|
||||||
# using the current working directory (run `brew bundle` from the repo root).
|
# Use the Brewfile's directory (repo root) rather than the current working directory,
|
||||||
# If you previously tapped `strawberry/local` before `Formula/` existed, refresh it with:
|
# so `brew bundle --file /path/to/Brewfile` works no matter where you run it from.
|
||||||
# brew untap strawberry/local && brew tap strawberry/local "file://$PWD"
|
tap "strawberry/local", "file://#{File.expand_path(__dir__)}"
|
||||||
tap "strawberry/local", "file://#{Dir.pwd}"
|
|
||||||
brew "strawberry/local/kdsingleapplication-qt6"
|
brew "strawberry/local/kdsingleapplication-qt6"
|
||||||
brew "strawberry/local/qtsparkle-qt6" # optional: QtSparkle integration
|
brew "strawberry/local/qtsparkle-qt6" # optional: QtSparkle integration
|
||||||
brew "strawberry/local/sparkle-framework" # optional: Sparkle integration (framework)
|
brew "strawberry/local/sparkle-framework" # optional: Sparkle integration (framework)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
class Macdeploycheck < Formula
|
class Macdeploycheck < Formula
|
||||||
desc "Sanity checks a macOS .app bundle for accidental Homebrew runtime dependencies"
|
desc "Sanity checks a macOS .app bundle for accidental Homebrew runtime dependencies"
|
||||||
homepage "https://github.com/strawberrymusicplayer/strawberry"
|
homepage "https://github.com/strawberrymusicplayer/strawberry"
|
||||||
url "file://#{__FILE__}"
|
|
||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
sha256 :no_check
|
sha256 :no_check
|
||||||
license "MIT"
|
license "MIT"
|
||||||
@@ -9,80 +8,10 @@ class Macdeploycheck < Formula
|
|||||||
depends_on :macos
|
depends_on :macos
|
||||||
|
|
||||||
def install
|
def install
|
||||||
(bin/"macdeploycheck").write <<~'EOS'
|
# Install the script from the tapped repo working tree.
|
||||||
#!/usr/bin/env bash
|
# (__dir__ is .../Formula, so ../.. is the tap root)
|
||||||
set -euo pipefail
|
script = File.expand_path("../../dist/macos/macdeploycheck.sh", __dir__)
|
||||||
|
bin.install script => "macdeploycheck"
|
||||||
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"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test do
|
test do
|
||||||
|
|||||||
@@ -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
|
for f in kdsingleapplication-qt6 qtsparkle-qt6 sparkle-framework libgpod macdeploycheck; do
|
||||||
if ! brew info "strawberry/local/${f}" >/dev/null 2>&1; then
|
if ! brew info "strawberry/local/${f}" >/dev/null 2>&1; then
|
||||||
echo "Error: Missing formula strawberry/local/${f} in the tapped repo." >&2
|
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 "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
|
echo " git -C \"$(brew --repo strawberry/local)\" pull --ff-only" >&2
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
73
dist/macos/macdeploycheck.sh
vendored
Normal file
73
dist/macos/macdeploycheck.sh
vendored
Normal 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
|
||||||
|
|
||||||
Reference in New Issue
Block a user