#!/usr/bin/env bash # 在容器内配置 apt(amd64 主归档 + arm64 ubuntu-ports)、安装 Tauri 交叉打 deb 所需依赖、Node、Rust。 set -euxo pipefail export DEBIAN_FRONTEND=noninteractive dpkg --add-architecture arm64 # 强制将默认源限制为 amd64,避免 apt 去 archive/security 拉 arm64 索引(会 404)。 if [[ -f /etc/apt/sources.list ]]; then cp /etc/apt/sources.list /etc/apt/sources.list.bak sed -E -i \ -e 's|^deb[[:space:]]+http://|deb [arch=amd64] http://|g' \ -e 's|^deb[[:space:]]+https://|deb [arch=amd64] https://|g' \ /etc/apt/sources.list fi for list_file in /etc/apt/sources.list.d/*.list; do [[ -e "$list_file" ]] || continue sed -E -i \ -e 's|^deb[[:space:]]+http://|deb [arch=amd64] http://|g' \ -e 's|^deb[[:space:]]+https://|deb [arch=amd64] https://|g' \ "$list_file" done # 清理并重建 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] http://ports.ubuntu.com/ubuntu-ports focal main restricted universe multiverse deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports focal-updates main restricted universe multiverse deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports focal-backports main restricted universe multiverse deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports focal-security main restricted universe multiverse EOF apt-get update 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 \ 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 \ libcairo2-dev:arm64 libpango1.0-dev:arm64 \ libgdk-pixbuf-2.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 \ libcairo2-dev:arm64 libpango1.0-dev:arm64 \ libgdk-pixbuf-2.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" curl -fsSL "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" curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable --no-modify-path chmod -R a+w "$RUSTUP_HOME" "$CARGO_HOME" /opt/cargo/bin/rustup target add aarch64-unknown-linux-gnu # 非登录 shell(docker 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/*