Patching with epatch and eapply
The canonical way of applying patches in ebuilds is to
use epatch (from epatch.eclass, which you must make sure
to inherit!) inside src_prepare. This function automatically
handles -p levels, gunzip and so on as necessary.
Starting with EAPI=7, this function is banned and eapply must be used.
Beginning with EAPI=6, a new function eapply was added to apply patches
without the need for an eclass.
This function differs from epatch in several ways:
-
eapplywill not unpack patches for you. - The default patch level is -p1. Other patch levels must be specified manually or the command will fail.
- When specifying a directory, at least one file with a name ending in .patch or .diff must exist or the command fails. Other files are ignored.
Note that distributing modified tarballs rather than a vanilla tarball and patches is highly discouraged.
Basic eapply
The default src_prepare function will look for a global PATCHES array to apply a list of patches for you.
PATCHES=(
"${FILESDIR}/${P}-destdir.patch"
"${FILESDIR}/${P}-parallel_build.patch"
)
Advanced eapply
This example shows how different patch levels can be applied:
src_prepare() {
eapply -p2 "${WORKDIR}/${P}-suse-update.patch"
eapply -p0 "${FILESDIR}/${PV}-no-TIOCGDEV.patch"
eapply "${FILESDIR}/${PV}-gcc-6.patch"
eapply_user
}
Basic epatch
In its simplest form, epatch takes a single filename and
applies that patch. It will automatically die if the apply
fails. The following is taken from app-misc/detox:
src_prepare() {
epatch "${FILESDIR}/${P}-destdir.patch"
epatch "${FILESDIR}/${P}-parallel_build.patch"
}
For larger patches, using
your devspace rather than
${FILESDIR} is more appropriate. In these situations, it is
usually best to compress the patch in question with xz or
bzip2 (as opposed to ${FILESDIR} patches, which must not
be compressed). For example, from app-admin/showconsole:
src_prepare() {
epatch "${WORKDIR}/${P}-suse-update.patch.bz2"
epatch "${FILESDIR}/${PV}-no-TIOCGDEV.patch"
}
Remember to add the patch to SRC_URI.
Multiple Patches with epatch
epatch can also apply multiple patches (which can be selectively based upon arch) from a single directory. This can be useful if upstream have releases that need more patches.
A simple example:
src_prepare() {
EPATCH_SOURCE="${WORKDIR}/patches" EPATCH_SUFFIX="patch" \
EPATCH_FORCE="yes" epatch
}
Here, one of the SRC_URI components is a tarball containing
many patches with file extension .patch.
Variables which may be defined include:
| Variable | Purpose |
|---|---|
EPATCH_SOURCE |
Specifies the directory in which epatch looks for patches. |
EPATCH_SUFFIX |
File extension for patches. |
EPATCH_OPTS |
Default options to patch. |
EPATCH_EXCLUDE |
List of patches to exclude. |
EPATCH_FORCE |
Force epatch to apply patches even if they do not follow the
canonical naming form (set to yes).
|
Bulk patches should be named in the form
??_${ARCH}_foo.${EPATCH_SUFFIX}. If they are
not, EPATCH_FORCE="yes" must be set. To apply a patch on all
archs, use all for the ${ARCH} part.