mirror of
https://github.com/kidfromjupiter/nearby.git
synced 2026-09-16 15:36:12 -04:00
158 lines
3.6 KiB
Bash
Executable File
158 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
TARGET="//sharing/linux:nearby_sharing_api_shared"
|
|
HEADER_SRC="sharing/linux/nearby_sharing_api.h"
|
|
BAZEL_CMD="${BAZEL:-bazel}"
|
|
PREFIX="/usr/local"
|
|
LIBDIR=""
|
|
INCLUDEDIR=""
|
|
SKIP_BUILD=0
|
|
NEEDS_ELEVATION=0
|
|
INSTALL_PREFIX=()
|
|
|
|
usage() {
|
|
cat <<USAGE
|
|
Usage: $0 [options]
|
|
|
|
Builds and installs the Nearby Sharing shared library and public header.
|
|
|
|
Options:
|
|
--prefix DIR Install prefix (default: /usr/local)
|
|
--libdir DIR Library directory (default: <prefix>/lib)
|
|
--includedir DIR Include root directory (default: <prefix>/include)
|
|
--bazel CMD Bazel command (default: bazel or env BAZEL)
|
|
--skip-build Skip bazel build step and only install from bazel-bin
|
|
-h, --help Show this help
|
|
|
|
Examples:
|
|
$0
|
|
sudo $0
|
|
sudo $0 --prefix /usr
|
|
sudo $0 --bazel /usr/bin/bazel
|
|
USAGE
|
|
}
|
|
|
|
run_bazel() {
|
|
if [[ "$(id -u)" -eq 0 && -n "${SUDO_USER:-}" ]]; then
|
|
local caller_home
|
|
caller_home="$(getent passwd "$SUDO_USER" | cut -d: -f6)"
|
|
if [[ -z "$caller_home" ]]; then
|
|
echo "Failed to resolve home directory for SUDO_USER=$SUDO_USER" >&2
|
|
exit 1
|
|
fi
|
|
sudo -u "$SUDO_USER" -H env \
|
|
HOME="$caller_home" \
|
|
BAZELISK_HOME="${BAZELISK_HOME:-$caller_home/.cache/bazelisk}" \
|
|
"$BAZEL_CMD" "$@"
|
|
else
|
|
"$BAZEL_CMD" "$@"
|
|
fi
|
|
}
|
|
|
|
nearest_existing_parent() {
|
|
local p="$1"
|
|
while [[ ! -e "$p" ]]; do
|
|
p="$(dirname "$p")"
|
|
done
|
|
printf '%s\n' "$p"
|
|
}
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--prefix)
|
|
PREFIX="$2"
|
|
shift 2
|
|
;;
|
|
--libdir)
|
|
LIBDIR="$2"
|
|
shift 2
|
|
;;
|
|
--includedir)
|
|
INCLUDEDIR="$2"
|
|
shift 2
|
|
;;
|
|
--bazel)
|
|
BAZEL_CMD="$2"
|
|
shift 2
|
|
;;
|
|
--skip-build)
|
|
SKIP_BUILD=1
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown argument: $1" >&2
|
|
usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ -z "$LIBDIR" ]]; then
|
|
LIBDIR="${PREFIX}/lib"
|
|
fi
|
|
|
|
if [[ -z "$INCLUDEDIR" ]]; then
|
|
INCLUDEDIR="${PREFIX}/include"
|
|
fi
|
|
|
|
LIB_PARENT="$(nearest_existing_parent "$LIBDIR")"
|
|
INCLUDE_PARENT="$(nearest_existing_parent "${INCLUDEDIR}/sharing/linux")"
|
|
|
|
if [[ ! -w "$LIB_PARENT" || ! -w "$INCLUDE_PARENT" ]]; then
|
|
NEEDS_ELEVATION=1
|
|
fi
|
|
|
|
if [[ "$NEEDS_ELEVATION" -eq 1 && "$(id -u)" -ne 0 ]]; then
|
|
if ! command -v sudo >/dev/null 2>&1; then
|
|
echo "Install requires elevated privileges, but sudo is not available." >&2
|
|
exit 1
|
|
fi
|
|
INSTALL_PREFIX=(sudo)
|
|
fi
|
|
|
|
if [[ ! -f "$HEADER_SRC" ]]; then
|
|
echo "Header not found: $HEADER_SRC" >&2
|
|
echo "Run this script from the workspace root." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$SKIP_BUILD" -eq 0 ]]; then
|
|
echo "[1/4] Building $TARGET"
|
|
run_bazel build "$TARGET"
|
|
else
|
|
echo "[1/4] Skipping build (--skip-build)"
|
|
fi
|
|
|
|
echo "[2/4] Resolving bazel-bin path"
|
|
BAZEL_BIN="$(run_bazel info bazel-bin)"
|
|
LIB_SRC="${BAZEL_BIN}/sharing/linux/libnearby_sharing_api_shared.so"
|
|
|
|
if [[ ! -f "$LIB_SRC" ]]; then
|
|
echo "Shared library not found: $LIB_SRC" >&2
|
|
echo "Expected Bazel output for $TARGET is missing." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "[3/4] Installing library and header"
|
|
"${INSTALL_PREFIX[@]}" install -d "$LIBDIR"
|
|
"${INSTALL_PREFIX[@]}" install -d "${INCLUDEDIR}/sharing/linux"
|
|
"${INSTALL_PREFIX[@]}" install -m 0755 "$LIB_SRC" "$LIBDIR/"
|
|
"${INSTALL_PREFIX[@]}" install -m 0644 "$HEADER_SRC" "${INCLUDEDIR}/sharing/linux/"
|
|
|
|
if command -v ldconfig >/dev/null 2>&1; then
|
|
echo "[4/4] Refreshing dynamic linker cache"
|
|
"${INSTALL_PREFIX[@]}" ldconfig
|
|
else
|
|
echo "[4/4] ldconfig not found; skipping linker cache refresh"
|
|
fi
|
|
|
|
echo "Installed:"
|
|
echo " library: $LIBDIR/$(basename "$LIB_SRC")"
|
|
echo " header : ${INCLUDEDIR}/sharing/linux/$(basename "$HEADER_SRC")"
|