fix: build-deb.sh 显示完整 CMake 错误并预检构建依赖

- 新增 run_step 辅助函数:成功时仅显示末尾 3 行,失败时打印完整输出,
  解决原 | tail -3 管道吞掉 find_package 关键错误、用户无法定位缺包问题
- 新增 [1/6] 构建依赖预检:用 dpkg -s 检查 qt6-base-dev /
  qt6-declarative-dev / libdtkcommon-dev / libdde-shell-dev,缺失时
  直接给出 sudo apt install 命令并退出,步骤编号顺延为 [1/6]~[6/6]
- README 新增「构建依赖」小节:完整 apt install 命令 + 依赖包与
  find_package 对照表 + 运行时无需 -dev 包说明,删除原一句话提示
This commit is contained in:
2026-07-20 20:12:53 +08:00
parent 959371c236
commit ef37fbbcbf
2 changed files with 66 additions and 9 deletions
+18 -1
View File
@@ -19,7 +19,24 @@ QML 前端渲染界面,实时显示当前网卡的上行/下行速率与累计
## 构建与安装 ## 构建与安装
需要配置期存在 `DDEShell` CMake 包(来自 `dde-shell` 开发包)。 ### 构建依赖
构建需要以下开发包:
```sh
sudo apt install build-essential cmake pkg-config qt6-base-dev qt6-declarative-dev libdtkcommon-dev libdde-shell-dev
```
各包与 CMake `find_package` 的对应关系:
| 依赖包 | 提供 | 对应 CMake find_package |
|---|---|---|
| qt6-base-dev | Qt6 Core / DBus / Network | Qt6 Core DBus Network |
| qt6-declarative-dev | Qt6 Quick | Qt6 Quick |
| libdtkcommon-dev | Dtk6 Core | Dtk6 Core |
| libdde-shell-dev | DDEShell | DDEShell |
> 运行时仅需 `dde-shell` 及 Qt6/Dtk6 运行库,上述 `-dev` 包仅构建时需要。
### 方式一:从源码安装 ### 方式一:从源码安装
+48 -8
View File
@@ -6,6 +6,25 @@
set -e set -e
# 运行构建步骤:成功时仅显示末尾 3 行,失败时打印完整输出后返回非零
# 设计原因:原脚本用 | tail -3 管道会吞掉 find_package 等关键错误,
# 导致缺依赖时用户看不到真正原因(CMake 只在末尾报 Configuring incomplete
run_step() {
local desc="$1"; shift
local log
log=$(mktemp)
if "$@" > "$log" 2>&1; then
tail -3 "$log"
rm -f "$log"
return 0
else
echo "错误:${desc}失败,完整输出如下:" >&2
cat "$log" >&2
rm -f "$log"
return 1
fi
}
# 项目根目录 # 项目根目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR" cd "$SCRIPT_DIR"
@@ -41,22 +60,43 @@ for cmd in cmake dpkg-deb; do
fi fi
done done
echo "[1/6] 检查构建依赖..."
# 检查构建依赖:确认开发包已安装,缺失时提示安装命令并退出
# 设计原因:用户 clone 后直接运行 build-deb.sh 经常因缺少 -dev 包导致
# CMake 配置失败,但原脚本用 tail -3 吞掉关键错误,用户无法定位问题。
# 在构建前主动预检可提前给出明确指引。
DEPS=(qt6-base-dev qt6-declarative-dev libdtkcommon-dev libdde-shell-dev)
MISSING=()
for pkg in "${DEPS[@]}"; do
if ! dpkg -s "$pkg" &> /dev/null 2>&1; then
MISSING+=("$pkg")
fi
done
if [ ${#MISSING[@]} -gt 0 ]; then
echo "错误:缺少构建依赖包:${MISSING[*]}" >&2
echo "请执行以下命令安装:" >&2
echo " sudo apt install ${MISSING[*]} build-essential cmake" >&2
exit 1
fi
echo "所有构建依赖已就绪"
# 清理并创建构建目录 # 清理并创建构建目录
echo "[1/5] 构建 CMake 项目..." echo "[2/6] 构建 CMake 项目..."
rm -rf build rm -rf build
cmake -B build -S . -DCMAKE_BUILD_TYPE=Release 2>&1 | tail -3 run_step "CMake 配置" cmake -B build -S . -DCMAKE_BUILD_TYPE=Release || exit 1
cmake --build build -j"$(nproc)" 2>&1 | tail -3 run_step "CMake 构建" cmake --build build -j"$(nproc)" || exit 1
# 创建 staging 目录(模拟安装根目录) # 创建 staging 目录(模拟安装根目录)
STAGE_DIR="$(mktemp -d)" STAGE_DIR="$(mktemp -d)"
trap "rm -rf '$STAGE_DIR'" EXIT trap "rm -rf '$STAGE_DIR'" EXIT
echo "[2/5] 安装到 staging 目录..." echo "[3/6] 安装到 staging 目录..."
# DESTDIR 指定安装根目录前缀,cmake 会将 /usr/... 安装到 $STAGE_DIR/usr/... # DESTDIR 指定安装根目录前缀,cmake 会将 /usr/... 安装到 $STAGE_DIR/usr/...
DESTDIR="$STAGE_DIR" cmake --install build 2>&1 | tail -3 run_step "安装到 staging" env DESTDIR="$STAGE_DIR" cmake --install build || exit 1
# 生成 DEBIAN/control # 生成 DEBIAN/control
echo "[3/5] 生成 control 文件..." echo "[4/6] 生成 control 文件..."
mkdir -p "$STAGE_DIR/DEBIAN" mkdir -p "$STAGE_DIR/DEBIAN"
# 计算安装后大小(KB # 计算安装后大小(KB
@@ -109,12 +149,12 @@ EOF
chmod 755 "$STAGE_DIR/DEBIAN/prerm" chmod 755 "$STAGE_DIR/DEBIAN/prerm"
# 修正文件权限(so 文件需要 755qml/json 需要 644 # 修正文件权限(so 文件需要 755qml/json 需要 644
echo "[4/5] 修正文件权限..." echo "[5/6] 修正文件权限..."
find "$STAGE_DIR/usr" -type f -name "*.so" -exec chmod 755 {} \; find "$STAGE_DIR/usr" -type f -name "*.so" -exec chmod 755 {} \;
find "$STAGE_DIR/usr" -type f \( -name "*.qml" -o -name "*.json" \) -exec chmod 644 {} \; find "$STAGE_DIR/usr" -type f \( -name "*.qml" -o -name "*.json" \) -exec chmod 644 {} \;
# 构建 deb # 构建 deb
echo "[5/5] 构建 deb 包..." echo "[6/6] 构建 deb 包..."
rm -f "$DEB_FILE" rm -f "$DEB_FILE"
dpkg-deb --build --root-owner-group "$STAGE_DIR" "$DEB_FILE" dpkg-deb --build --root-owner-group "$STAGE_DIR" "$DEB_FILE"