【rpm编程】 %patch教程说明

%patch

在 RPM 包构建中,%patch0 -p1 语法用于在构建过程中应用补丁。具体来说,这个命令通常出现在 .spec 文件中,用于指定补丁文件的应用方式。它的作用是将补丁文件(通常是一个 .diff 文件)应用到源代码中,以便修改或修复软件包的源代码。

%patch0 -p1 语法详解

  • %patch0:这是一个占位符,用来表示要应用的补丁文件的编号。%patch0 通常代表第一个补丁文件,后续的补丁文件会被编号为 %patch1%patch2 等。补丁文件通常存放在 SOURCES 目录下,并且被列在 .spec 文件中。

  • -p1:这个选项指定了补丁文件路径的剥离级别。-p1 表示剥离路径中的第一层目录。这是常见的做法,特别是当补丁文件中包含的路径结构与目标源代码的路径结构不完全匹配时。常见的做法是将补丁文件路径中的 a/b/ 去掉,使其能够正确地应用到源代码目录。

 

假设的情景

你正在构建一个名为 mypackage 的 RPM 包,想要修改源代码中的一个文件 hello.c。你已经准备好了一个补丁文件 mypatch.diff,用来修改 hello.c。你需要在 .spec 文件中应用这个补丁。

1. 创建补丁文件

首先,假设你已经对源代码做了修改,并且生成了补丁文件 mypatch.diff。补丁的内容如下:

--- a/src/hello.c
+++ b/src/hello.c
@@ -1,5 +1,6 @@
 #include <stdio.h>
 
 int main() {
     printf("Hello, World!\n");
+    printf("This is a patch example.\n");
     return 0;
 }

这个补丁在 hello.c 文件的末尾添加了一行打印语句。

2. 在 mypackage.spec 文件中,你需要指定如何使用这个补丁。假设 mypackage.spec 文件的基本结构如下:

Name:           mypackage
Version:        1.0
Release:        1%{?dist}
Summary:        A simple package for demonstration

License:        GPLv2
URL:            http://example.com/mypackage
Source0:        http://example.com/mypackage-%{version}.tar.gz
Patch0:         mypatch.diff

BuildRequires:  gcc
Requires:       libc

%description
This is a simple package to demonstrate RPM packaging.

%prep
# 解压源代码并准备补丁
%autosetup -n mypackage-%{version} -p1

%build
# 编译代码
make

%install
# 安装代码
make install

%files
%{_bindir}/mypackage

3. 目录结构

假设源代码包 mypackage-1.0.tar.gz 的结构如下:

mypackage-1.0/
├── src/
│   └── hello.c
└── Makefile

4. 详细步骤

1. 准备源代码和补丁文件

在构建 RPM 包之前,你需要确保补丁文件 mypatch.diff 已经放置在 SOURCES 目录下,源代码压缩包 mypackage-1.0.tar.gz 也应该放在同样的位置。

  • mypackage.spec 文件通常位于你的 RPM 包构建目录。
  • mypatch.diff 放在 SOURCES/ 目录。
  • mypackage-1.0.tar.gz 放在 SOURCES/ 目录。

 

2. 使用 %patch0 -p1 应用补丁

%prep 部分,使用 %autosetup 来解压源代码并应用补丁。-p1 是一个重要的选项,它告诉 patch 命令剥离路径的第一层目录。

%prep
# 解压源代码并应用补丁
%autosetup -n mypackage-%{version} -p1

%autosetup 会自动查找补丁文件并应用它们。-p1 会去除补丁文件路径中的第一层目录(通常是 a/b/,如果是 git 格式的补丁)。这样,补丁就会正确地应用到 src/hello.c 文件,而不需要多余的目录层级。

 

3. 结果

当执行 %autosetup -n mypackage-%{version} -p1 时,mypatch.diff 会被应用到源代码中。假设 mypackage-1.0.tar.gz 解压后的文件结构是:

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    printf("This is a patch example.\n");  // 新添加的行
    return 0;
}

4. 构建 RPM 包

接下来,你可以继续使用 rpmbuild 来构建 RPM 包:

rpmbuild -ba mypackage.spec

在构建过程中,%patch0 -p1 会自动应用补丁并修改源代码。

总结

  • %patch0:指定要应用的补丁文件,0 表示第一个补丁文件。
  • -p1:剥离补丁路径中的第一层目录,使其能够正确地应用到源代码中。
  • %autosetup:自动解压源代码并应用补丁,-p1 参数告诉 patch 命令剥离补丁文件路径的第一层目录。
posted @ 2022-05-19 20:57  苏格拉底的落泪  阅读(27)  评论(0编辑  收藏  举报