Files
smarttms-config-rpm-build/build-smarttms-config-rpm.sh
2025-12-06 03:45:23 +08:00

94 lines
3.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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/"