在 RPM 构建过程中,%prep 部分负责准备构建环境,包括解压源码包和应用补丁。这个阶段是构建过程的第一步,确保源码已经准备好供后续的编译和安装使用。
%prep 部分的作用
%setup -q:
- 作用:解压缩源码包,并进入解压后的源码目录。这个宏命令是最常用的,通常用于解压原始的源码包(tarball)。
- 参数:
- -q:静默模式(quiet mode),减少输出信息量。
- 其他参数(未在此示例中使用):
- -c:创建一个新的目录,并在其中解压源码。
- -T:忽略默认的动作(即不自动解压源码),这在需要自定义解压步骤时使用。
- -n :指定解压后的目录名称,如果源码包解压后的目录名与包名版本不一致时使用。
%patch0 -p1:
- 作用:应用补丁文件。%patch 宏用于在源码目录中应用指定的补丁文件。
- 参数:
- 0:补丁编号,与 Patch0: 对应。这个编号对应于 SPEC 文件中定义的补丁文件(如 Patch0: fix-security-bug.patch)。
- -p1:patch 命令的参数,表示要去除路径前缀的层次。具体来说:
- -p0:不去除任何路径前缀,补丁文件中的路径层次完全保留。
- -p1:去除路径的第一层前缀,例如 /a/b/c/file -> b/c/file。
- -pN:去除路径的前 N 层前缀。
示例解读
假设你的 SPEC 文件中有如下定义:
Name: example-software
Version: 1.0.0
Release: 1%{?dist}
Summary: Example software
Source0: example-software-1.0.0.tar.gz
Patch0: fix-security-bug.patch
%description
Example software description.
%prep
%setup -q
%patch0 -p1
在这个例子中:
%setup -q:
解压 example-software-1.0.0.tar.gz,假设解压后的目录名为 example-software-1.0.0。
进入 example-software-1.0.0 目录。
%patch0 -p1:
应用 fix-security-bug.patch 补丁。
-p1 参数表示去除补丁文件路径的第一层前缀。例如,如果 fix-security-bug.patch 中的修改路径是 a/b/file.c,则实际应用时会将其视为 b/file.c。
补丁文件示例
假设 fix-security-bug.patch 内容如下:
--- a/source/file.c +++ b/source/file.c @@ -1,4 +1,4 @@ - old code + new code
在应用补丁时:
-p1 参数去除路径的第一层前缀,所以实际修改的是 source/file.c 文件中的内容。
总结
在 %prep 部分,%setup -q 用于解压缩源码包并进入解压后的目录,而 %patch0 -p1 用于应用指定的补丁文件。通过这些步骤,可以在构建 RPM 包之前自动化处理源码的准备工作,确保所有必要的修改已经应用。