pack.sh 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #!/bin/bash
  2. set -e
  3. # 通用打包脚本
  4. # 使用方法: ./pack.sh <package_config_name>
  5. # 例如: ./pack.sh glibc-ubuntu2404
  6. SCRIPT_DIR=$(realpath "$(dirname "$0")")
  7. DEB_DOWNLOAD_DIR="$SCRIPT_DIR"
  8. OUTPUT_DIR="${DEB_DOWNLOAD_DIR}/output"
  9. SYSROOT_DIR="${OUTPUT_DIR}/sysroot"
  10. # 显示使用方法
  11. show_usage() {
  12. echo "Usage: $0 <package_config_name>"
  13. echo "Available package configs:"
  14. find "${SCRIPT_DIR}/packages" -name "*.conf" | sed 's|.*/||' | sed 's|\.conf$||' | sort
  15. exit 1
  16. }
  17. # 检查参数
  18. if [ $# -ne 1 ]; then
  19. echo "Error: Missing package config name" >&2
  20. show_usage
  21. fi
  22. PACKAGE_CONFIG_NAME="$1"
  23. CONFIG_FILE="${SCRIPT_DIR}/packages/${PACKAGE_CONFIG_NAME}.conf"
  24. # 检查配置文件是否存在
  25. if [ ! -f "$CONFIG_FILE" ]; then
  26. echo "Error: Config file $CONFIG_FILE not found" >&2
  27. show_usage
  28. fi
  29. # 载入配置文件
  30. echo "Loading config from $CONFIG_FILE"
  31. source "$CONFIG_FILE"
  32. # 验证必需的配置变量
  33. if [ -z "$PACKAGES" ]; then
  34. echo "Error: PACKAGES variable not defined in config file" >&2
  35. exit 1
  36. fi
  37. if [ -z "$DOCKER_TAG" ]; then
  38. echo "Error: DOCKER_TAG variable not defined in config file" >&2
  39. exit 1
  40. fi
  41. if [ -z "$TAR_NAME" ]; then
  42. echo "Error: TAR_NAME variable not defined in config file" >&2
  43. exit 1
  44. fi
  45. echo "Package config: $PACKAGE_CONFIG_NAME"
  46. echo "Docker tag: $DOCKER_TAG"
  47. echo "Packages: ${PACKAGES[*]}"
  48. echo "Output tar: $TAR_NAME"
  49. TAR_PATH="$OUTPUT_DIR/$TAR_NAME"
  50. # 创建输出目录
  51. if ! mkdir -p "$OUTPUT_DIR"; then
  52. echo "Error: Failed to create output directory" >&2
  53. exit 1
  54. fi
  55. if ! mkdir -p "$SYSROOT_DIR"; then
  56. echo "Error: Failed to create sysroot directory" >&2
  57. exit 1
  58. fi
  59. pushd . || { echo "pushd failed" >&2; exit 1; }
  60. cd "$DEB_DOWNLOAD_DIR" || { echo "cd to $DEB_DOWNLOAD_DIR failed" >&2; exit 1; }
  61. # 清理之前的构建
  62. if ! make clean; then
  63. echo "Warning: make clean failed, retrying with sudo..." >&2
  64. if ! sudo make clean; then
  65. echo "Error: sudo make clean also failed" >&2
  66. exit 1
  67. fi
  68. fi
  69. # 下载包
  70. for PACKAGE in "${PACKAGES[@]}"; do
  71. export PACKAGE_NAME=$PACKAGE
  72. export DOCKER_TAG=$DOCKER_TAG
  73. if ! make download; then
  74. echo "Error: make download failed for $PACKAGE" >&2
  75. exit 1
  76. fi
  77. done
  78. # 解压包
  79. if ! make unpack; then
  80. echo "Error: make unpack failed" >&2
  81. exit 1
  82. fi
  83. # 执行后处理步骤(如果定义了的话)
  84. if declare -f post_unpack_hook > /dev/null; then
  85. echo "Executing post-unpack hook..."
  86. post_unpack_hook
  87. fi
  88. # 设置权限
  89. if ! sudo chmod -R a+r "$SYSROOT_DIR"; then
  90. echo "Error: Failed to set read permissions on $SYSROOT_DIR" >&2
  91. exit 1
  92. fi
  93. if ! sudo chmod a+rw "$OUTPUT_DIR"; then
  94. echo "Error: Failed to set read/write permissions on $OUTPUT_DIR" >&2
  95. exit 1
  96. fi
  97. pushd . || { echo "pushd failed" >&2; exit 1; }
  98. cd "$OUTPUT_DIR" || { echo "cd to $OUTPUT_DIR failed" >&2; exit 1; }
  99. echo "Packaging..."
  100. # 打包sysroot为tarball
  101. if ! sudo tar -cJf "$OUTPUT_DIR/${TAR_NAME}" sysroot; then
  102. echo "Error: failed to create tarball" >&2
  103. exit 1
  104. fi
  105. echo "Calculating MD5 and renaming the tarball..."
  106. # 计算MD5并重命名tarball
  107. MD5_SUM=$(md5sum "$OUTPUT_DIR/${TAR_NAME}" | cut -d' ' -f1)
  108. DATE_SUFFIX=$(date +"%Y%m%d%H%M")
  109. NEW_TAR_NAME="${TAR_NAME%.tar.xz}-${DATE_SUFFIX}-${MD5_SUM}.tar.xz"
  110. if ! mv "$OUTPUT_DIR/${TAR_NAME}" "$OUTPUT_DIR/${NEW_TAR_NAME}"; then
  111. echo "Error: failed to rename tarball with MD5 sum" >&2
  112. exit 1
  113. fi
  114. echo "Package ${NEW_TAR_NAME} downloaded, unpacked, and sysroot prepared successfully."
  115. popd || { echo "popd failed" >&2; exit 1; }
  116. popd || { echo "popd failed" >&2; exit 1; }