Files
2026-07-13 13:16:30 +08:00

117 lines
4.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# build-sharp.sh - Enable sharp image processing on Android (Termux)
#
# Strategy:
# 1. Check if sharp already works → skip
# 2. Install WebAssembly fallback (@img/sharp-wasm32)
# Native sharp binaries are built for glibc Linux. Android's Bionic libc
# cannot dlopen glibc-linked .node addons, so the prebuilt linux-arm64
# binding never loads. The WASM build uses Emscripten and runs entirely
# in V8 — zero native dependencies.
# 3. If WASM fails → attempt native rebuild as last resort
set -euo pipefail
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
echo "=== Building sharp (image processing) ==="
echo ""
# Ensure required environment variables are set (for standalone use)
export TMPDIR="${TMPDIR:-$PREFIX/tmp}"
export TMP="$TMPDIR"
export TEMP="$TMPDIR"
export CONTAINER="${CONTAINER:-1}"
# Locate openclaw install directory
OPENCLAW_DIR="$(npm root -g)/openclaw"
if [ ! -d "$OPENCLAW_DIR" ]; then
echo -e "${RED}[FAIL]${NC} OpenClaw directory not found: $OPENCLAW_DIR"
exit 0
fi
# Skip rebuild if sharp is already working (e.g. WASM installed on prior run)
if [ -d "$OPENCLAW_DIR/node_modules/sharp" ]; then
if node -e "require('$OPENCLAW_DIR/node_modules/sharp')" 2>/dev/null; then
echo -e "${GREEN}[OK]${NC} sharp is already working — skipping rebuild"
exit 0
fi
fi
# ── Strategy 1: WebAssembly fallback (recommended for Android) ──────────
# sharp's JS loader tries these paths in order:
# 1. ../src/build/Release/sharp-{platform}.node (source build)
# 2. ../src/build/Release/sharp-wasm32.node (source build)
# 3. @img/sharp-{platform}/sharp.node (prebuilt native)
# 4. @img/sharp-wasm32/sharp.node (prebuilt WASM) ← this
# By installing @img/sharp-wasm32, path 4 catches the fallback automatically.
echo "Installing sharp WebAssembly runtime..."
if (cd "$OPENCLAW_DIR" && npm install @img/sharp-wasm32 --force --no-audit --no-fund 2>&1 | tail -3); then
if node -e "require('$OPENCLAW_DIR/node_modules/sharp')" 2>/dev/null; then
echo ""
echo -e "${GREEN}[OK]${NC} sharp enabled via WebAssembly — image processing ready"
exit 0
else
echo -e "${YELLOW}[WARN]${NC} WASM package installed but sharp still not loading"
fi
else
echo -e "${YELLOW}[WARN]${NC} Failed to install WASM package"
fi
# ── Strategy 2: Native rebuild (last resort) ────────────────────────────
echo ""
echo "Attempting native rebuild as fallback..."
# Install required packages
echo "Installing build dependencies..."
if ! pkg install -y libvips binutils; then
echo -e "${YELLOW}[WARN]${NC} Failed to install build dependencies"
echo " Image processing will not be available, but OpenClaw will work normally."
exit 0
fi
echo -e "${GREEN}[OK]${NC} libvips and binutils installed"
# Create ar symlink if missing (Termux provides llvm-ar but not ar)
if [ ! -e "$PREFIX/bin/ar" ] && [ -x "$PREFIX/bin/llvm-ar" ]; then
ln -s "$PREFIX/bin/llvm-ar" "$PREFIX/bin/ar"
echo -e "${GREEN}[OK]${NC} Created ar → llvm-ar symlink"
fi
# Install node-gyp globally
echo "Installing node-gyp..."
if ! npm install -g node-gyp; then
echo -e "${YELLOW}[WARN]${NC} Failed to install node-gyp"
echo " Image processing will not be available, but OpenClaw will work normally."
exit 0
fi
echo -e "${GREEN}[OK]${NC} node-gyp installed"
# Set build environment variables
# On glibc architecture, these are handled by glibc's standard headers.
# On Bionic (legacy), we need explicit compatibility flags.
if [ ! -f "$HOME/.openclaw-android/.glibc-arch" ]; then
export CFLAGS="-Wno-error=implicit-function-declaration"
export CXXFLAGS="-include $HOME/.openclaw-android/patches/termux-compat.h"
export GYP_DEFINES="OS=linux android_ndk_path=$PREFIX"
fi
export CPATH="$PREFIX/include/glib-2.0:$PREFIX/lib/glib-2.0/include"
echo "Rebuilding sharp in $OPENCLAW_DIR..."
echo "This may take several minutes..."
echo ""
if (cd "$OPENCLAW_DIR" && npm rebuild sharp); then
echo ""
echo -e "${GREEN}[OK]${NC} sharp built successfully — image processing enabled"
else
echo ""
echo -e "${YELLOW}[WARN]${NC} sharp could not be enabled (non-critical)"
echo " Image processing will not be available, but OpenClaw will work normally."
echo " You can retry later: bash ~/.openclaw-android/scripts/build-sharp.sh"
fi