使用 eapply 打补丁
在 ebuild 中应用补丁的规范方法是使用包管理器命令 eapply
,可以通过显式调用它,也可以通过分配默认 src_prepare
实现支持的 PATCHES
变量。
重要说明:强烈建议将补丁应用于来自上游 tarball 的源代码,而不是分发您自己的修改后的 tarball。
命令 eapply
接受一个或多个正则文件或目录路径作为其参数。 这些参数可以选择在前面加上 GNU patch
选项。
注意:分隔符
--
表示选项的结束。 如果文件名以连字符开头,这将很有用。- 如果参数是正则文件,则它将在工作目录中应用,方法是调用 GNU
patch
,补丁级别为-p1
。 指定显式-pN
选项将覆盖默认补丁级别。 - 对于目录,
eapply
应用目录中所有以.diff
或.patch
结尾的文件,按照其名称的 POSIX 排序顺序。 该目录中的任何其他文件都将被忽略。 同样,-pN
可用于覆盖默认-p1
补丁级别。 请注意,eapply
不会递归进入子目录。
eapply
是在 EAPI 6 中添加的。 它与之前可用的 epatch
有几个不同之处
-
eapply
不会为您解压缩补丁。 - 补丁级别不再自动检测。 必须手动指定除
-p1
之外的其他补丁级别。 - 在指定目录时,必须至少存在一个以
.diff
或.patch
结尾的文件,否则命令将失败。
基本 eapply
在最简单的形式中,eapply
接受一个文件名并应用该补丁。 如果应用失败,它将自动 die
。 以下内容摘自 sys-libs/gpm
eapply "${FILESDIR}"/${P}-musl.patch
在以下摘自 www-client/firefox
的简化示例中,补丁集被添加到 SRC_URI
中以便获取和解压缩它。 然后,eapply
被调用,并带有一个目录参数。 它将应用在该目录中找到的所有补丁
SRC_URI+="https://dev.gentoo.org/~larry/patchsets/${P}-patches-01.tar.xz"
src_prepare() {
eapply "${WORKDIR}/firefox-patches"
eapply_user
}
补丁 一章提供了一些关于补丁应该托管在哪里以及它们的格式的指南。
默认的 src_prepare
函数将查找全局 PATCHES 数组,以为您应用补丁列表。
PATCHES=(
# Fix install location
"${FILESDIR}/${P}-destdir.patch"
# Respect MAKEOPTS #876543
"${FILESDIR}/${P}-parallel_build.patch"
)