#!/bin/bash set -e # 任何命令失败时立即退出 echo "--- 开始构建 RPM 包 ---" # 1. 获取脚本自身的绝对路径 # SCRIPT_PATH 是脚本的完整路径 (例如: /home/smart/smarttms-rpm-build/smarttms-rpm-build.sh) SCRIPT_PATH=$(readlink -f "${BASH_SOURCE[0]}") # PROJECT_ROOT 是脚本所在的目录,也是整个项目的根目录 (例如: /home/smart/smarttms-rpm-build) PROJECT_ROOT=$(dirname "$SCRIPT_PATH") # 2. 根据项目根目录确定 rpmbuild 的顶层目录 # TOP_DIR 是 rpmbuild 的根目录 (例如: /home/smart/smarttms-rpm-build/rpmbuild) TOP_DIR="$PROJECT_ROOT/rpmbuild" # 3. 定义其他重要目录的绝对路径 SOURCES_DIR="$TOP_DIR/SOURCES" SPECS_DIR="$TOP_DIR/SPECS" SPEC_FILE="$SPECS_DIR/smarttms.spec" # SPEC 文件的绝对路径 # 应用程序源代码的实际目录,它位于 SOURCES_DIR 下面 SOURCE_CODE_ORIGINAL_DIR="$SOURCES_DIR/smarttms" echo "脚本路径: $SCRIPT_PATH" echo "项目根目录: $PROJECT_ROOT" echo "RPM构建顶层目录 (_topdir): $TOP_DIR" echo "SOURCES目录: $SOURCES_DIR" echo "SPEC文件: $SPEC_FILE" echo "原始源代码目录 (待打包): $SOURCE_CODE_ORIGINAL_DIR" # 4. 检查原始源代码目录是否存在 if [ ! -d "$SOURCE_CODE_ORIGINAL_DIR" ]; then echo "错误:找不到应用程序原始源代码目录 '$SOURCE_CODE_ORIGINAL_DIR'。" echo "请确保你的 'smarttms/' 目录位于 '$SOURCES_DIR' 下。" exit 1 fi # 5. 确保 SOURCES 目录存在 mkdir -p "$SOURCES_DIR" # 6. 从 SPEC 文件中提取 Name 和 Version # rpmbuild 期望 Source0 的格式为 %{name}-%{version}.tar.gz # 因此,我们需要确保生成的 tarball 名称和其内部的顶层目录名匹配这个约定。 SPEC_NAME=$(grep "^Name:" "$SPEC_FILE" | awk '{print $2}') SPEC_VERSION=$(grep "^Version:" "$SPEC_FILE" | awk '{print $2}') if [ -z "$SPEC_NAME" ] || [ -z "$SPEC_VERSION" ]; then echo "错误:无法从 '$SPEC_FILE' 中提取 Name 或 Version。" echo "请确保 SPEC 文件中包含 'Name: ' 和 'Version: '。" exit 1 fi # rpmbuild 期望的解压后的顶层目录名 (例如 smarttms-1.0) EXPECTED_UNPACK_DIR_NAME="${SPEC_NAME}-${SPEC_VERSION}" # 最终生成的 tarball 文件名 (例如 smarttms-1.0.tar.gz),与 Source0 匹配 TARBALL_NAME="${EXPECTED_UNPACK_DIR_NAME}.tar.gz" TARBALL_PATH="$SOURCES_DIR/$TARBALL_NAME" echo "从SPEC文件获取到: Name=$SPEC_NAME, Version=$SPEC_VERSION" echo "rpmbuild预期的解压目录名: $EXPECTED_UNPACK_DIR_NAME" echo "最终的tarball名称 (应与SPEC文件中的Source0匹配): $TARBALL_NAME" # 7. 清理旧的 tarball echo "清理旧的 tarball: $TARBALL_PATH" rm -f "$TARBALL_PATH" # 8. 创建新的 tarball,使其解压后为期望的目录名 (例如 smarttms-1.0) echo "创建新的 tarball: $TARBALL_PATH" # 创建一个临时目录作为打包的暂存区 STAGING_TEMP_DIR=$(mktemp -d) # 确保脚本退出时清理临时目录 trap "rm -rf '$STAGING_TEMP_DIR'" EXIT # 将原始源代码复制到暂存区,并重命名为 rpmbuild 期望的目录名 echo "将原始源代码 '$SOURCE_CODE_ORIGINAL_DIR' 复制到临时暂存区并重命名为 '$EXPECTED_UNPACK_DIR_NAME'" cp -r "$SOURCE_CODE_ORIGINAL_DIR" "$STAGING_TEMP_DIR/$EXPECTED_UNPACK_DIR_NAME" # 在暂存区内执行 tar 命令,压缩重命名后的目录 # 这样生成的 tarball 解压后就会得到 EXPECTED_UNPACK_DIR_NAME/ 目录 (cd "$STAGING_TEMP_DIR" && tar -czvf "$TARBALL_PATH" "$EXPECTED_UNPACK_DIR_NAME") echo "Tarball '$TARBALL_PATH' 已创建,其内容解压后将为顶层目录 '$EXPECTED_UNPACK_DIR_NAME/'。" # 9. 执行 rpmbuild echo "执行 rpmbuild 命令..." # 使用 --define _topdir 明确告诉 rpmbuild 它的顶层目录 rpmbuild --define "_topdir $TOP_DIR" -ba "$SPEC_FILE" echo "--- RPM 包构建完成! ---" echo "生成的 RPM 包在: $TOP_DIR/RPMS/" echo "生成的 SRPM 包在: $TOP_DIR/SRPMS/"