You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
5.3 KiB
Bash

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/usr/bin/env bash
# 在容器内配置 aptamd64 主归档 + arm64 ubuntu-ports、安装 Tauri 交叉打 deb 所需依赖、Node、Rust。
set -euxo pipefail
export DEBIAN_FRONTEND=noninteractive
MAIN_MIRROR="${UBUNTU_MIRROR:-http://mirrors.aliyun.com/ubuntu}"
PORTS_MIRROR="${UBUNTU_PORTS_MIRROR:-http://mirrors.aliyun.com/ubuntu-ports}"
retry() {
local max_attempts="$1"
shift
local attempt=1
local delay=5
while true; do
if "$@"; then
return 0
fi
if (( attempt >= max_attempts )); then
return 1
fi
echo "WARN: command failed (attempt ${attempt}/${max_attempts}), retry in ${delay}s: $*" >&2
sleep "$delay"
attempt=$((attempt + 1))
delay=$((delay * 2))
done
}
dpkg --add-architecture arm64
# 直接重写 amd64 主仓库源,避免网络策略导致 archive.ubuntu.com 不可达。
cat > /etc/apt/sources.list <<EOF
deb [arch=amd64] ${MAIN_MIRROR} focal main restricted universe multiverse
deb [arch=amd64] ${MAIN_MIRROR} focal-updates main restricted universe multiverse
deb [arch=amd64] ${MAIN_MIRROR} focal-backports main restricted universe multiverse
deb [arch=amd64] ${MAIN_MIRROR} focal-security main restricted universe multiverse
EOF
# 清理并重建 arm64 ports 源,仅用于 arm64 索引与依赖解析。
rm -f /etc/apt/sources.list.d/arm64-ports.list
cat > /etc/apt/sources.list.d/arm64-ports.list <<EOF
deb [arch=arm64] ${PORTS_MIRROR} focal main restricted universe multiverse
deb [arch=arm64] ${PORTS_MIRROR} focal-updates main restricted universe multiverse
deb [arch=arm64] ${PORTS_MIRROR} focal-backports main restricted universe multiverse
deb [arch=arm64] ${PORTS_MIRROR} focal-security main restricted universe multiverse
EOF
retry 5 apt-get update -o Acquire::Retries=3 -o Acquire::http::Timeout=30
apt-get install -y --no-install-recommends \
ca-certificates curl gnupg git ubuntu-keyring python3
# 本机构建 amd64
apt-get install -y --no-install-recommends \
build-essential pkg-config patchelf \
libglib2.0-dev libgtk-3-dev \
libbrotli-dev \
libsoup2.4-dev \
libwebkit2gtk-4.0-dev libjavascriptcoregtk-4.0-dev \
libayatana-appindicator3-dev librsvg2-dev libssl-dev
# 构建阶段自检:避免缓存/半装镜像拖到 run 时才在 build-linux-deb-all.sh 里失败
for f in glib-2.0.pc gdk-3.0.pc webkit2gtk-4.0.pc; do
if [[ ! -f "/usr/lib/x86_64-linux-gnu/pkgconfig/${f}" ]]; then
echo "ERROR: amd64 缺少 pkg-config: /usr/lib/x86_64-linux-gnu/pkgconfig/${f}" >&2
echo "请检查 libwebkit2gtk-4.0-dev 等是否已正确安装。" >&2
exit 1
fi
done
# 交叉 arm64勿装 systemd-sysv:arm64用 --no-install-recommends
if ! apt-get install -y --no-install-recommends \
-o Dpkg::Options::="--force-overwrite" \
gcc-aarch64-linux-gnu \
libglib2.0-dev:arm64 libgtk-3-dev:arm64 \
libbrotli-dev:arm64 \
libsoup2.4-dev:arm64 \
libcairo2-dev:arm64 libpango1.0-dev:arm64 \
libgdk-pixbuf2.0-dev:arm64 libatk1.0-dev:arm64 libepoxy-dev:arm64 \
libwebkit2gtk-4.0-dev:arm64 libjavascriptcoregtk-4.0-dev:arm64 \
libssl-dev:arm64 libayatana-appindicator3-dev:arm64 librsvg2-dev:arm64; then
apt-get -f install -y
apt-get install -y --no-install-recommends \
-o Dpkg::Options::="--force-overwrite" \
gcc-aarch64-linux-gnu \
libglib2.0-dev:arm64 libgtk-3-dev:arm64 \
libbrotli-dev:arm64 \
libsoup2.4-dev:arm64 \
libcairo2-dev:arm64 libpango1.0-dev:arm64 \
libgdk-pixbuf2.0-dev:arm64 libatk1.0-dev:arm64 libepoxy-dev:arm64 \
libwebkit2gtk-4.0-dev:arm64 libjavascriptcoregtk-4.0-dev:arm64 \
libssl-dev:arm64 libayatana-appindicator3-dev:arm64 librsvg2-dev:arm64
fi
for f in glib-2.0.pc gdk-3.0.pc webkit2gtk-4.0.pc; do
if [[ ! -f "/usr/lib/aarch64-linux-gnu/pkgconfig/${f}" ]]; then
echo "ERROR: arm64 缺少 pkg-config: /usr/lib/aarch64-linux-gnu/pkgconfig/${f}" >&2
exit 1
fi
done
# Node.js 22不走 NodeSource apt避免 multiarch 下 python 依赖冲突)
NODE_VERSION="v22.16.0"
retry 5 curl -fsSL --connect-timeout 20 --max-time 300 \
"https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.xz" \
-o /tmp/node.tar.xz
tar -xJf /tmp/node.tar.xz -C /opt
ln -sfn "/opt/node-${NODE_VERSION}-linux-x64" /opt/node
ln -sf /opt/node/bin/node /usr/local/bin/node
ln -sf /opt/node/bin/npm /usr/local/bin/npm
ln -sf /opt/node/bin/npx /usr/local/bin/npx
rm -f /tmp/node.tar.xz
export RUSTUP_HOME=/opt/rustup
export CARGO_HOME=/opt/cargo
mkdir -p "$RUSTUP_HOME" "$CARGO_HOME"
if ! retry 5 sh -c "curl --proto '=https' --tlsv1.2 -sSf --connect-timeout 20 --max-time 300 https://sh.rustup.rs | sh -s -- -y --default-toolchain stable --no-modify-path"; then
export RUSTUP_DIST_SERVER="https://rsproxy.cn"
export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup"
retry 5 sh -c "curl --proto '=https' --tlsv1.2 -sSf --connect-timeout 20 --max-time 300 https://rsproxy.cn/rustup-init.sh | sh -s -- -y --default-toolchain stable --no-modify-path"
fi
chmod -R a+w "$RUSTUP_HOME" "$CARGO_HOME"
/opt/cargo/bin/rustup target add aarch64-unknown-linux-gnu
# 非登录 shelldocker run bash -c也能找到 cargo / rustc
ln -sf /opt/cargo/bin/cargo /usr/local/bin/cargo
ln -sf /opt/cargo/bin/rustc /usr/local/bin/rustc
ln -sf /opt/cargo/bin/rustup /usr/local/bin/rustup
rustc --version
node --version
cargo --version
apt-get clean
rm -rf /var/lib/apt/lists/*