Browse Source

feat: 新增通用打包脚本及配置系统

添加通用打包脚本pack.sh,支持通过配置文件打包不同deb包集合。
新增多个包配置文件(glibc/grep/example),提供README文档说明使用方法,并移除旧的glibc专用打包脚本

Signed-off-by: longjin <longjin@DragonOS.org>
longjin 3 weeks ago
parent
commit
497b147cf4

+ 141 - 0
pack.sh

@@ -0,0 +1,141 @@
+#!/bin/bash
+set -e
+
+# 通用打包脚本
+# 使用方法: ./pack.sh <package_config_name>
+# 例如: ./pack.sh glibc-ubuntu2404
+
+SCRIPT_DIR=$(realpath "$(dirname "$0")")
+DEB_DOWNLOAD_DIR="$SCRIPT_DIR"
+OUTPUT_DIR="${DEB_DOWNLOAD_DIR}/output"
+SYSROOT_DIR="${OUTPUT_DIR}/sysroot"
+
+# 显示使用方法
+show_usage() {
+    echo "Usage: $0 <package_config_name>"
+    echo "Available package configs:"
+    find "${SCRIPT_DIR}/packages" -name "*.conf" | sed 's|.*/||' | sed 's|\.conf$||' | sort
+    exit 1
+}
+
+# 检查参数
+if [ $# -ne 1 ]; then
+    echo "Error: Missing package config name" >&2
+    show_usage
+fi
+
+PACKAGE_CONFIG_NAME="$1"
+CONFIG_FILE="${SCRIPT_DIR}/packages/${PACKAGE_CONFIG_NAME}.conf"
+
+# 检查配置文件是否存在
+if [ ! -f "$CONFIG_FILE" ]; then
+    echo "Error: Config file $CONFIG_FILE not found" >&2
+    show_usage
+fi
+
+# 载入配置文件
+echo "Loading config from $CONFIG_FILE"
+source "$CONFIG_FILE"
+
+# 验证必需的配置变量
+if [ -z "$PACKAGES" ]; then
+    echo "Error: PACKAGES variable not defined in config file" >&2
+    exit 1
+fi
+
+if [ -z "$DOCKER_TAG" ]; then
+    echo "Error: DOCKER_TAG variable not defined in config file" >&2
+    exit 1
+fi
+
+if [ -z "$TAR_NAME" ]; then
+    echo "Error: TAR_NAME variable not defined in config file" >&2
+    exit 1
+fi
+
+echo "Package config: $PACKAGE_CONFIG_NAME"
+echo "Docker tag: $DOCKER_TAG"
+echo "Packages: ${PACKAGES[*]}"
+echo "Output tar: $TAR_NAME"
+
+TAR_PATH="$OUTPUT_DIR/$TAR_NAME"
+
+# 创建输出目录
+if ! mkdir -p "$OUTPUT_DIR"; then
+    echo "Error: Failed to create output directory" >&2
+    exit 1
+fi
+if ! mkdir -p "$SYSROOT_DIR"; then
+    echo "Error: Failed to create sysroot directory" >&2
+    exit 1
+fi
+
+pushd . || { echo "pushd failed" >&2; exit 1; }
+cd "$DEB_DOWNLOAD_DIR" || { echo "cd to $DEB_DOWNLOAD_DIR failed" >&2; exit 1; }
+
+# 清理之前的构建
+if ! make clean; then
+    echo "Warning: make clean failed, retrying with sudo..." >&2
+    if ! sudo make clean; then
+        echo "Error: sudo make clean also failed" >&2
+        exit 1
+    fi
+fi
+
+# 下载包
+for PACKAGE in "${PACKAGES[@]}"; do
+    export PACKAGE_NAME=$PACKAGE
+    export DOCKER_TAG=$DOCKER_TAG
+    if ! make download; then
+        echo "Error: make download failed for $PACKAGE" >&2
+        exit 1
+    fi
+done
+
+# 解压包
+if ! make unpack; then
+    echo "Error: make unpack failed" >&2
+    exit 1
+fi
+
+# 执行后处理步骤(如果定义了的话)
+if declare -f post_unpack_hook > /dev/null; then
+    echo "Executing post-unpack hook..."
+    post_unpack_hook
+fi
+
+# 设置权限
+if ! sudo chmod -R a+r "$SYSROOT_DIR"; then
+    echo "Error: Failed to set read permissions on $SYSROOT_DIR" >&2
+    exit 1
+fi
+
+if ! sudo chmod a+rw "$OUTPUT_DIR"; then
+    echo "Error: Failed to set read/write permissions on $OUTPUT_DIR" >&2
+    exit 1
+fi
+
+pushd . || { echo "pushd failed" >&2; exit 1; }
+cd "$OUTPUT_DIR" || { echo "cd to $OUTPUT_DIR failed" >&2; exit 1; }
+
+echo "Packaging..."
+# 打包sysroot为tarball
+if ! sudo tar -cJf "$OUTPUT_DIR/${TAR_NAME}" sysroot; then
+    echo "Error: failed to create tarball" >&2
+    exit 1
+fi
+
+echo "Calculating MD5 and renaming the tarball..."
+# 计算MD5并重命名tarball
+MD5_SUM=$(md5sum "$OUTPUT_DIR/${TAR_NAME}" | cut -d' ' -f1)
+DATE_SUFFIX=$(date +"%Y%m%d%H%M")
+NEW_TAR_NAME="${TAR_NAME%.tar.xz}-${DATE_SUFFIX}-${MD5_SUM}.tar.xz"
+if ! mv "$OUTPUT_DIR/${TAR_NAME}" "$OUTPUT_DIR/${NEW_TAR_NAME}"; then
+    echo "Error: failed to rename tarball with MD5 sum" >&2
+    exit 1
+fi
+
+echo "Package ${NEW_TAR_NAME} downloaded, unpacked, and sysroot prepared successfully."
+
+popd || { echo "popd failed" >&2; exit 1; }
+popd || { echo "popd failed" >&2; exit 1; }

+ 105 - 0
packages/README.md

@@ -0,0 +1,105 @@
+# 通用打包脚本说明
+
+## 概述
+
+该项目现在包含一个通用的打包脚本 `pack.sh`,可以根据配置文件打包不同的deb包集合。
+
+## 使用方法
+
+### 基本用法
+
+```bash
+# 列出所有可用的包配置
+./pack.sh
+
+# 使用特定的包配置进行打包
+./pack.sh <config_name>
+```
+
+### 示例
+
+```bash
+# 打包glibc
+./pack.sh glibc-ubuntu2404
+
+# 打包构建工具
+./pack.sh build-essential-ubuntu2404
+
+# 打包示例包
+./pack.sh example-ubuntu2404
+```
+
+## 配置文件格式
+
+配置文件位于 `packages/` 目录下,以 `.conf` 为扩展名。
+
+### 必需的配置变量
+
+- `PACKAGES`: 包名数组,例如 `PACKAGES=("libc-bin" "libstdc++6")`
+- `DOCKER_TAG`: Docker标签,例如 `DOCKER_TAG="ubuntu2404"`
+- `TAR_NAME`: 输出tar文件名,例如 `TAR_NAME="glibc-ubuntu2404.tar.xz"`
+
+### 可选的配置
+
+- `post_unpack_hook()`: 后处理钩子函数,在解压完成后执行自定义操作
+
+### 配置文件示例
+
+```bash
+# packages/mypackage-ubuntu2404.conf
+
+# 包列表
+PACKAGES=("package1" "package2" "package3")
+
+# Docker标签
+DOCKER_TAG="ubuntu2404"
+
+# 输出tar文件名
+TAR_NAME="mypackage-ubuntu2404.tar.xz"
+
+# 可选: 后处理钩子函数
+post_unpack_hook() {
+    echo "Executing custom post-processing..."
+    # 在这里添加自定义处理步骤
+    # 例如: 创建符号链接,修改权限等
+}
+```
+
+## 目录结构
+
+```
+deb-downloader/
+├── pack.sh                              # 通用打包脚本
+├── packages/                            # 包配置目录
+│   ├── glibc-ubuntu2404.conf           # glibc配置
+│   ├── build-essential-ubuntu2404.conf  # 构建工具配置
+│   ├── example-ubuntu2404.conf         # 示例配置
+│   └── glibc-ubuntu2404/               # 原glibc目录(向后兼容)
+│       └── pack.sh                     # 调用通用脚本的包装器
+├── output/                             # 输出目录
+└── tmp/                               # 临时目录
+```
+
+## 向后兼容性
+
+原有的 `packages/glibc-ubuntu2404/pack.sh` 脚本仍然可以正常使用,它现在内部调用新的通用脚本。
+
+## 添加新的包配置
+
+1. 在 `packages/` 目录下创建新的 `.conf` 文件
+2. 按照配置文件格式填写必需的变量
+3. 如果需要特殊的后处理步骤,定义 `post_unpack_hook()` 函数
+4. 使用 `./pack.sh <config_name>` 进行打包
+
+## 工作流程
+
+1. 脚本读取指定的配置文件
+2. 验证必需的配置变量
+3. 创建输出目录
+4. 清理之前的构建
+5. 下载指定的包
+6. 解压包到sysroot
+7. 执行后处理钩子(如果定义)
+8. 设置文件权限
+9. 打包为tar.xz文件
+10. 计算MD5并重命名文件

+ 19 - 0
packages/example-ubuntu2404.conf

@@ -0,0 +1,19 @@
+# example-ubuntu2404 package configuration
+# 这是一个示例配置文件,展示如何为其他包创建配置
+
+# 包列表 - 可以包含多个包
+PACKAGES=("curl" "wget")
+
+# Docker标签
+DOCKER_TAG="ubuntu2404"
+
+# 输出tar文件名
+TAR_NAME="example-ubuntu2404.tar.xz"
+
+# 可选: 后处理钩子函数
+# 如果你的包需要特殊的后处理步骤,可以定义这个函数
+# post_unpack_hook() {
+#     echo "Executing custom post-processing steps..."
+#     # 在这里添加你的自定义处理步骤
+#     # 例如: 创建特定的符号链接,修改文件权限等
+# }

+ 35 - 0
packages/glibc-ubuntu2404.conf

@@ -0,0 +1,35 @@
+# glibc-ubuntu2404 package configuration
+# 包列表
+PACKAGES=("libc-bin" "libstdc++6")
+
+# Docker标签
+DOCKER_TAG="ubuntu2404"
+
+# 输出tar文件名
+TAR_NAME="glibc-ubuntu2404.tar.xz"
+
+# 后处理钩子函数 - 为glibc创建必要的符号链接
+post_unpack_hook() {
+    echo "Creating glibc-specific symlinks..."
+    
+    # 创建lib符号链接
+    if ! ln -sf usr/lib "$SYSROOT_DIR/lib"; then
+        echo "Warning: lib symlink creation failed with normal user, retrying with sudo..." >&2
+        if ! sudo ln -sf usr/lib "$SYSROOT_DIR/lib"; then
+            echo "Error: failed to create lib symlink" >&2
+            exit 1
+        else
+            echo "/usr/lib symlink creation successful with sudo." >&2
+        fi
+    fi
+    
+    # 创建lib64符号链接
+    if ! ln -sf usr/lib64 "$SYSROOT_DIR/lib64"; then
+        if ! sudo ln -sf usr/lib64 "$SYSROOT_DIR/lib64"; then
+            echo "Error: failed to create lib64 symlink" >&2
+            exit 1
+        else
+            echo "/usr/lib64 symlink creation successful with sudo." >&2
+        fi
+    fi
+}

+ 0 - 108
packages/glibc-ubuntu2404/pack.sh

@@ -1,108 +0,0 @@
-#!/bin/bash
-set -e
-
-DEB_DOWNLOAD_DIR=$(realpath "$(pwd)/../../")
-OUTPUT_DIR=${DEB_DOWNLOAD_DIR}/output
-SYSROOT_DIR=${OUTPUT_DIR}/sysroot
-
-PACKAGES=("libc-bin" "libstdc++6")
-export DOCKER_TAG=ubuntu2404
-
-TAR_NAME="glibc-ubuntu2404.tar.xz"
-TAR_PATH="$OUTPUT_DIR/$TAR_NAME"
-
-if ! mkdir -p "$OUTPUT_DIR"; then
-    echo "Error: Failed to create output directory" >&2
-    exit 1
-fi
-if ! mkdir -p "$SYSROOT_DIR"; then
-    echo "Error: Failed to create sysroot directory" >&2
-    exit 1
-fi
-
-
-pushd . || { echo "pushd failed" >&2; exit 1; }
-cd $DEB_DOWNLOAD_DIR || { echo "cd to $DEB_DOWNLOAD_DIR failed" >&2; exit 1; }
-
-if ! make clean; then
-    echo "Warning: make clean failed, retrying with sudo..." >&2
-    if ! sudo make clean; then
-        echo "Error: sudo make clean also failed" >&2
-        exit 1
-    fi
-fi
-
-for PACKAGE in "${PACKAGES[@]}"; do
-    export PACKAGE_NAME=$PACKAGE
-if ! make download; then
-        echo "Error: make download failed for $PACKAGE" >&2
-    exit 1
-fi
-done
-
-if ! make unpack; then
-    echo "Error: make unpack failed" >&2
-    exit 1
-fi
-
-pushd . || { echo "pushd failed" >&2; exit 1; }
-cd $SYSROOT_DIR || { echo "cd to $SYSROOT_DIR failed" >&2; exit 1; }
-# Create required symlinks in sysroot
-if ! ln -sf usr/lib $SYSROOT_DIR/lib; then
-    echo "Warning: lib symlink creation failed with normal user, retrying with sudo..." >&2
-    if ! sudo ln -sf usr/lib $SYSROOT_DIR/lib; then
-        echo "Error: failed to create lib symlink" >&2
-        exit 1
-    else
-       echo "/usr/lib symlink creation successful with sudo." >&2
-    fi
-fi
-if ! ln -sf usr/lib64 $SYSROOT_DIR/lib64; then
-    if ! sudo ln -sf usr/lib64 $SYSROOT_DIR/lib64; then
-        echo "Error: failed to create lib64 symlink" >&2
-        exit 1
-    else
-       echo "/usr/lib64 symlink creation successful with sudo." >&2
-    fi
-fi
-
-popd || { echo "popd failed" >&2; exit 1; }
-
-if ! sudo chmod a+r $SYSROOT_DIR ; then
-    echo "Error: Failed to set read permissions on $SYSROOT_DIR" >&2
-    exit 1
-fi
-
-if ! sudo chmod a+rw $OUTPUT_DIR ; then
-    echo "Error: Failed to set read/write permissions on $OUTPUT_DIR" >&2
-    exit 1
-fi
-
-
-pushd . || { echo "pushd failed" >&2; exit 1; }
-cd $OUTPUT_DIR || { echo "cd to $OUTPUT_DIR failed" >&2; exit 1; }
-
-echo "Packaging..."
-# Package sysroot into tarball
-if ! sudo tar -cJf $OUTPUT_DIR/${TAR_NAME} sysroot ; then
-     echo "Error: failed to create tarball" >&2
-    exit 1
-fi
-
-echo "Calculating MD5 and renaming the tarball..."
-# Calculate MD5 and rename the tarball
-MD5_SUM=$(md5sum $OUTPUT_DIR/${TAR_NAME} | cut -d' ' -f1)
-DATE_SUFFIX=$(date +"%Y%m%d%H%M")
-NEW_TAR_NAME="${TAR_NAME%.tar.xz}-${DATE_SUFFIX}-${MD5_SUM}.tar.xz"
-if ! mv $OUTPUT_DIR/${TAR_NAME} $OUTPUT_DIR/${NEW_TAR_NAME}; then
-    echo "Error: failed to rename tarball with MD5 sum" >&2
-    exit 1
-fi
-
-echo "Package ${NEW_TAR_NAME} downloaded, unpacked, and sysroot prepared successfully."
-
-
-popd || { echo "popd failed" >&2; exit 1; }
-
-popd || { echo "popd failed" >&2; exit 1; }
-

+ 19 - 0
packages/grep-ubuntu2404.conf

@@ -0,0 +1,19 @@
+# example-ubuntu2404 package configuration
+# 这是一个示例配置文件,展示如何为其他包创建配置
+
+# 包列表 - 可以包含多个包
+PACKAGES=("grep")
+
+# Docker标签
+DOCKER_TAG="ubuntu2404"
+
+# 输出tar文件名
+TAR_NAME="grep-ubuntu2404.tar.xz"
+
+# 可选: 后处理钩子函数
+# 如果你的包需要特殊的后处理步骤,可以定义这个函数
+# post_unpack_hook() {
+#     echo "Executing custom post-processing steps..."
+#     # 在这里添加你的自定义处理步骤
+#     # 例如: 创建特定的符号链接,修改文件权限等
+# }