diff --git a/scripts/build-linux-deb-all.sh b/scripts/build-linux-deb-all.sh index 081c46f..b3bba0f 100644 --- a/scripts/build-linux-deb-all.sh +++ b/scripts/build-linux-deb-all.sh @@ -9,22 +9,17 @@ # 见 README.md「交叉编译 arm64」或本脚本 check_arm64_pkgconfig 失败时的提示。 # # 用法: -# ./scripts/build-linux-deb-all.sh # 构建 PROJECTS 中全部项目 -# ./scripts/build-linux-deb-all.sh call-client # 仅构建指定项目(可多个) +# ./scripts/build-linux-deb-all.sh # 构建自动发现的全部项目(amd64 + arm64) +# ./scripts/build-linux-deb-all.sh --arch amd64 # 仅构建 amd64 +# ./scripts/build-linux-deb-all.sh --arch arm64 call-client # 仅构建指定项目的 arm64 +# ./scripts/build-linux-deb-all.sh --list-projects # 打印可构建项目列表 # set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" - -# --------------------------------------------------------------------------- -# 同框架项目列表(相对 REPO_ROOT 的目录名)。后续新增项目在此追加一行即可。 -# --------------------------------------------------------------------------- -PROJECTS=( - "call-client" - "broadcast-client" - # "another-tauri-app" -) +BUILD_ARCH="all" +LIST_PROJECTS=0 # 统一收集 .deb 的根目录(相对 REPO_ROOT) OUTPUT_ROOT="$REPO_ROOT/dist/linux-deb" @@ -32,6 +27,82 @@ OUTPUT_ROOT="$REPO_ROOT/dist/linux-deb" # aarch64 交叉编译时 pkg-config 查找路径(与下方 export 一致) ARM64_PKGCONFIG_DIR="/usr/lib/aarch64-linux-gnu/pkgconfig" X64_PKGCONFIG_DIR="/usr/lib/x86_64-linux-gnu/pkgconfig" +AVAILABLE_PROJECTS=() + +usage() { + cat </dev/null 2>&1; then + echo "$project_dir" + fi + done + shopt -u nullglob +} + +parse_args() { + while (($# > 0)); do + case "$1" in + --arch) + BUILD_ARCH="${2:-}" + if [[ -z "$BUILD_ARCH" ]]; then + echo "错误: --arch 需要参数(all|amd64|arm64)" >&2 + exit 1 + fi + shift 2 + ;; + --arch=*) + BUILD_ARCH="${1#*=}" + shift + ;; + --list-projects) + LIST_PROJECTS=1 + shift + ;; + --help|-h) + usage + exit 0 + ;; + --) + shift + break + ;; + -*) + echo "错误: 未知参数 $1" >&2 + usage >&2 + exit 1 + ;; + *) + break + ;; + esac + done + + case "$BUILD_ARCH" in + all|amd64|arm64) ;; + *) + echo "错误: --arch 仅支持 all|amd64|arm64,当前为 \"$BUILD_ARCH\"" >&2 + exit 1 + ;; + esac + + printf '%s\n' "$@" +} check_x64_pkgconfig() { local missing=() @@ -142,44 +213,50 @@ collect_debs() { build_project() { local project_dir="$1" - echo "" - echo "######## $project_dir: amd64 ########" - unset PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PKG_CONFIG_SYSROOT_DIR PKG_CONFIG_ALLOW_CROSS 2>/dev/null || true - check_x64_pkgconfig - export PKG_CONFIG_PATH="$X64_PKGCONFIG_DIR" - export PKG_CONFIG_LIBDIR="$X64_PKGCONFIG_DIR:/usr/share/pkgconfig" - build_one_target "$project_dir" "build:deb:x64" - collect_debs "$project_dir" "amd64" "x86_64-unknown-linux-gnu" - unset PKG_CONFIG_PATH PKG_CONFIG_LIBDIR + if [[ "$BUILD_ARCH" == "all" || "$BUILD_ARCH" == "amd64" ]]; then + echo "" + echo "######## $project_dir: amd64 ########" + unset PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PKG_CONFIG_SYSROOT_DIR PKG_CONFIG_ALLOW_CROSS 2>/dev/null || true + check_x64_pkgconfig + export PKG_CONFIG_PATH="$X64_PKGCONFIG_DIR" + export PKG_CONFIG_LIBDIR="$X64_PKGCONFIG_DIR:/usr/share/pkgconfig" + build_one_target "$project_dir" "build:deb:x64" + collect_debs "$project_dir" "amd64" "x86_64-unknown-linux-gnu" + unset PKG_CONFIG_PATH PKG_CONFIG_LIBDIR + fi - echo "" - echo "######## $project_dir: arm64 (cross) ########" - check_arm64_pkgconfig - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_SYSROOT_DIR=/ - export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig - export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig - build_one_target "$project_dir" "build:deb:arm64" - collect_debs "$project_dir" "arm64" "aarch64-unknown-linux-gnu" - unset PKG_CONFIG_ALLOW_CROSS PKG_CONFIG_SYSROOT_DIR PKG_CONFIG_PATH PKG_CONFIG_LIBDIR + if [[ "$BUILD_ARCH" == "all" || "$BUILD_ARCH" == "arm64" ]]; then + echo "" + echo "######## $project_dir: arm64 (cross) ########" + check_arm64_pkgconfig + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_SYSROOT_DIR=/ + export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig + export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig + build_one_target "$project_dir" "build:deb:arm64" + collect_debs "$project_dir" "arm64" "aarch64-unknown-linux-gnu" + unset PKG_CONFIG_ALLOW_CROSS PKG_CONFIG_SYSROOT_DIR PKG_CONFIG_PATH PKG_CONFIG_LIBDIR + fi } select_projects() { + local available=("${AVAILABLE_PROJECTS[@]}") + if (($# == 0)); then - printf '%s\n' "${PROJECTS[@]}" + printf '%s\n' "${available[@]}" return fi - local name ok + local name ok p for name in "$@"; do ok=0 - for p in "${PROJECTS[@]}"; do + for p in "${available[@]}"; do if [[ "$p" == "$name" ]]; then ok=1 break fi done if [[ "$ok" -eq 0 ]]; then - echo "错误: 未知项目 \"$name\"(请加入 scripts/build-linux-deb-all.sh 的 PROJECTS 数组)" >&2 + echo "错误: 未知项目 \"$name\"(可用项目见 --list-projects)" >&2 exit 1 fi echo "$name" @@ -187,7 +264,20 @@ select_projects() { } main() { - mapfile -t to_build < <(select_projects "$@") + local -a positional to_build + mapfile -t positional < <(parse_args "$@") + mapfile -t AVAILABLE_PROJECTS < <(discover_projects) + if (( ${#AVAILABLE_PROJECTS[@]} == 0 )); then + echo "错误: 未发现可构建项目(需包含 build:deb:x64 与 build:deb:arm64 脚本)" >&2 + exit 1 + fi + + if [[ "$LIST_PROJECTS" -eq 1 ]]; then + printf '%s\n' "${AVAILABLE_PROJECTS[@]}" + return + fi + + mapfile -t to_build < <(select_projects "${positional[@]}") mkdir -p "$OUTPUT_ROOT" for p in "${to_build[@]}"; do @@ -196,6 +286,7 @@ main() { echo "" echo "==> 全部完成" + echo " 构建架构: $BUILD_ARCH" echo " 统一输出目录: $OUTPUT_ROOT" echo " 每项目下: <项目名>/amd64/*.deb 与 <项目名>/arm64/*.deb" echo " Tauri 原始路径仍在各项目:" diff --git a/scripts/docker/container-entry.sh b/scripts/docker/container-entry.sh index 9f1b493..ed5e7b2 100644 --- a/scripts/docker/container-entry.sh +++ b/scripts/docker/container-entry.sh @@ -2,6 +2,7 @@ # 在容器内执行:为各子项目 npm ci,再调用仓库根脚本(路径挂载为 /work)。 set -euo pipefail cd /work +BUILD_ARCH="${BUILD_ARCH:-all}" # npm 网络增强:默认使用官方 registry,可通过 NPM_REGISTRY 覆盖;增加超时与重试,减少 ECONNRESET 失败概率。 npm config set registry "${NPM_REGISTRY:-https://registry.npmjs.org/}" @@ -11,7 +12,18 @@ npm config set fetch-retry-mintimeout 20000 npm config set fetch-retry-maxtimeout 120000 npm config set fetch-timeout 300000 -for d in call-client broadcast-client; do +if (($# == 0)); then + mapfile -t projects < <(bash /work/scripts/build-linux-deb-all.sh --list-projects) +else + projects=("$@") +fi + +if (( ${#projects[@]} == 0 )); then + echo "错误: 没有可构建项目" >&2 + exit 1 +fi + +for d in "${projects[@]}"; do if [[ ! -f "$d/package.json" ]]; then echo "错误: 缺少 /work/$d/package.json" >&2 exit 1 @@ -32,4 +44,4 @@ for d in call-client broadcast-client; do done ) done -exec bash /work/scripts/build-linux-deb-all.sh "$@" +exec bash /work/scripts/build-linux-deb-all.sh --arch "$BUILD_ARCH" "${projects[@]}" diff --git a/scripts/docker/run-build.sh b/scripts/docker/run-build.sh index c2f2042..99dd6e6 100644 --- a/scripts/docker/run-build.sh +++ b/scripts/docker/run-build.sh @@ -1,23 +1,48 @@ #!/usr/bin/env bash -# 在宿主机上:构建镜像并在容器内挂载仓库、npm ci、执行 build-linux-deb-all.sh +# 在宿主机上:先打 amd64,再在容器中打 arm64(均支持自动发现项目)。 set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" IMAGE_TAG="${IMAGE_TAG:-tauri-linux-deb:24.04}" +PROJECT_ARGS=("$@") cd "$REPO_ROOT" +if ((${#PROJECT_ARGS[@]} == 0)); then + mapfile -t SELECTED_PROJECTS < <(bash "$REPO_ROOT/scripts/build-linux-deb-all.sh" --list-projects) +else + SELECTED_PROJECTS=("${PROJECT_ARGS[@]}") +fi + +if ((${#SELECTED_PROJECTS[@]} == 0)); then + echo "错误: 没有可构建项目" >&2 + exit 1 +fi + +echo "==> host npm ci (${SELECTED_PROJECTS[*]})" +for d in "${SELECTED_PROJECTS[@]}"; do + if [[ ! -f "$REPO_ROOT/$d/package.json" ]]; then + echo "错误: 缺少 $REPO_ROOT/$d/package.json" >&2 + exit 1 + fi + (cd "$REPO_ROOT/$d" && npm ci) +done + +echo "==> host build amd64 (${SELECTED_PROJECTS[*]})" +bash "$REPO_ROOT/scripts/build-linux-deb-all.sh" --arch amd64 "${SELECTED_PROJECTS[@]}" + echo "==> docker build --platform linux/amd64 -f scripts/docker/Dockerfile -t $IMAGE_TAG $REPO_ROOT" docker build --platform linux/amd64 -f scripts/docker/Dockerfile -t "$IMAGE_TAG" "$REPO_ROOT" -echo "==> docker run (npm ci + build-linux-deb-all.sh)" +echo "==> docker run (arm64: npm ci + build-linux-deb-all.sh)" docker run --rm \ --platform linux/amd64 \ -v "$REPO_ROOT:/work" \ -w /work \ -e RUSTUP_HOME=/opt/rustup \ -e CARGO_HOME=/opt/cargo \ + -e BUILD_ARCH=arm64 \ -e NPM_REGISTRY="${NPM_REGISTRY:-https://registry.npmjs.org/}" \ "$IMAGE_TAG" \ - bash /work/scripts/docker/container-entry.sh "$@" + bash /work/scripts/docker/container-entry.sh "${SELECTED_PROJECTS[@]}"