Files
SoonWorkerD/scripts/build-deb-arm64.sh
T

84 lines
2.0 KiB
Bash

#!/usr/bin/env bash
# 构建 Linux arm64 deb,并保证安装路径与 productName/executableName=DiscWorker 一致
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
EXE="DiscWorker"
SANITIZED="DiscWorker"
OPT_DIR="/opt/${SANITIZED}"
BIN_LINK="/usr/bin/${EXE}"
echo "[build-deb-arm64] executable: ${EXE}"
echo "[build-deb-arm64] opt dir: ${OPT_DIR}"
node .electron-vue/build.js
npx electron-builder --linux deb --arm64
shopt -s nullglob
mapfile -t DEBS < <(ls -t build/*.deb 2>/dev/null || true)
if [[ ${#DEBS[@]} -eq 0 ]]; then
echo "[build-deb-arm64] 未找到 build/*.deb" >&2
exit 1
fi
DEB="${DEBS[0]}"
WORK="$(mktemp -d)"
trap 'rm -rf "$WORK"' EXIT
echo "[build-deb-arm64] patching: $DEB"
dpkg-deb -R "$DEB" "$WORK/pkg"
CONTROL_DIR="$WORK/pkg/DEBIAN"
mkdir -p "$CONTROL_DIR"
# 若 builder 已生成钩子,把旧小写路径替换为 DiscWorker;否则写入默认钩子
patch_or_write() {
local file="$1"
local kind="$2"
if [[ -f "$file" ]]; then
sed -i \
-e "s|/opt/discworker|/opt/${SANITIZED}|g" \
-e "s|/usr/bin/discworker|/usr/bin/${EXE}|g" \
-e "s|discworker/chrome-sandbox|${SANITIZED}/chrome-sandbox|g" \
-e "s|/opt/discworker/discworker|${OPT_DIR}/${EXE}|g" \
"$file"
chmod 755 "$file"
echo "[build-deb-arm64] patched existing ${kind}"
return
fi
if [[ "$kind" == "postinst" ]]; then
cat > "$file" <<EOF
#!/bin/bash
set -e
if [ -f ${OPT_DIR}/chrome-sandbox ]; then
chown root:root ${OPT_DIR}/chrome-sandbox
chmod 4755 ${OPT_DIR}/chrome-sandbox
fi
if [ -x ${OPT_DIR}/${EXE} ]; then
ln -sfn ${OPT_DIR}/${EXE} ${BIN_LINK}
fi
exit 0
EOF
else
cat > "$file" <<EOF
#!/bin/bash
set -e
if [ "\$1" = "remove" ] || [ "\$1" = "purge" ]; then
rm -f ${BIN_LINK}
fi
exit 0
EOF
fi
chmod 755 "$file"
echo "[build-deb-arm64] wrote default ${kind}"
}
patch_or_write "$CONTROL_DIR/postinst" "postinst"
patch_or_write "$CONTROL_DIR/postrm" "postrm"
OUT="build/${SANITIZED}-arm64-patched.deb"
dpkg-deb -b "$WORK/pkg" "$OUT"
echo "[build-deb-arm64] done: $OUT"