mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-26 04:47:35 +00:00
add to macos bundle libiio and ad9361
This commit is contained in:
@@ -14,6 +14,15 @@ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|||||||
# Project root holds bin/, icon/, dist/. This script lives in other/, so go up one.
|
# Project root holds bin/, icon/, dist/. This script lives in other/, so go up one.
|
||||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||||
|
|
||||||
|
# ── Optional runtime libraries ────────────────────────────────────────────────
|
||||||
|
# These are loaded dynamically (dlopen) rather than linked, so they never show
|
||||||
|
# up in the executable's otool -L. They are only needed for optional hardware
|
||||||
|
# (PlutoSDR / AD936x). Bundle them — together with their dependency trees — only
|
||||||
|
# if they are present on the build machine; otherwise the bundle builds fine
|
||||||
|
# without them.
|
||||||
|
OPTIONAL_LIB_NAMES=(libiio libad9361)
|
||||||
|
OPTIONAL_LIB_DIRS=(/usr/local/lib /opt/homebrew/lib /opt/local/lib)
|
||||||
|
|
||||||
# ── Locate source .app ────────────────────────────────────────────────────────
|
# ── Locate source .app ────────────────────────────────────────────────────────
|
||||||
if [[ $# -ge 1 ]]; then
|
if [[ $# -ge 1 ]]; then
|
||||||
SRC_APP="$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
|
SRC_APP="$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
|
||||||
@@ -171,9 +180,65 @@ build_bundle() {
|
|||||||
done <<< "$deps"
|
done <<< "$deps"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Seed an optional, dlopen'd dylib into the bundle (with its dependency tree).
|
||||||
|
# Arg: path to a dylib (possibly a symlink, e.g. /usr/local/lib/libiio.dylib).
|
||||||
|
seed_optional_lib() {
|
||||||
|
local link="$1"
|
||||||
|
|
||||||
|
# Follow the symlink chain to the real file.
|
||||||
|
local real
|
||||||
|
real="$(cd "$(dirname "$link")" && pwd)/$(basename "$link")"
|
||||||
|
while [[ -L "$real" ]]; do
|
||||||
|
local target
|
||||||
|
target="$(readlink "$real")"
|
||||||
|
[[ "$target" == /* ]] || target="$(dirname "$real")/$target"
|
||||||
|
real="$target"
|
||||||
|
done
|
||||||
|
[[ -f "$real" ]] || { echo " (optional $(basename "$link") not found)"; return; }
|
||||||
|
|
||||||
|
# Bundle the real file under the basename advertised by its install id,
|
||||||
|
# so dependents referencing that name (and our alias symlinks) resolve.
|
||||||
|
local idname
|
||||||
|
idname="$(basename "$(otool -D "$real" | tail -n +2 | head -1)")"
|
||||||
|
[[ -n "$idname" ]] || idname="$(basename "$real")"
|
||||||
|
local dst="$FWK_DIR/$idname"
|
||||||
|
|
||||||
|
if [[ -z "${PROCESSED[$idname]:-}" ]]; then
|
||||||
|
echo " Bundling optional $idname"
|
||||||
|
cp "$real" "$dst"
|
||||||
|
chmod 755 "$dst"
|
||||||
|
PROCESSED[$idname]=1
|
||||||
|
install_name_tool -id "@executable_path/../Frameworks/$idname" "$dst"
|
||||||
|
collect_and_copy "$dst"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Recreate the symlink aliases (libfoo.dylib, libfoo.N.dylib) alongside
|
||||||
|
# it, so a dlopen() by any of those names finds the bundled copy.
|
||||||
|
local srcdir base an
|
||||||
|
srcdir="$(dirname "$link")"
|
||||||
|
base="${idname%%.*}"
|
||||||
|
for alias in "$srcdir/$base".dylib "$srcdir/$base".*.dylib; do
|
||||||
|
[[ -e "$alias" ]] || continue
|
||||||
|
an="$(basename "$alias")"
|
||||||
|
[[ "$an" == "$idname" ]] && continue
|
||||||
|
[[ -e "$FWK_DIR/$an" ]] && continue
|
||||||
|
ln -s "$idname" "$FWK_DIR/$an"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
echo " Scanning dependencies..."
|
echo " Scanning dependencies..."
|
||||||
collect_and_copy "$EXEC_PATH"
|
collect_and_copy "$EXEC_PATH"
|
||||||
|
|
||||||
|
echo " Seeding optional dynamically-loaded libs..."
|
||||||
|
for optname in "${OPTIONAL_LIB_NAMES[@]}"; do
|
||||||
|
for optdir in "${OPTIONAL_LIB_DIRS[@]}"; do
|
||||||
|
if [[ -e "$optdir/$optname.dylib" ]]; then
|
||||||
|
seed_optional_lib "$optdir/$optname.dylib"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
while IFS= read -r existing; do
|
while IFS= read -r existing; do
|
||||||
local libname
|
local libname
|
||||||
libname="$(basename "$existing")"
|
libname="$(basename "$existing")"
|
||||||
|
|||||||
Reference in New Issue
Block a user