94 lines
3.8 KiB
Bash
94 lines
3.8 KiB
Bash
#!/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: <package_name>' 和 'Version: <package_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/"
|