5b00b40a05
Previously, the documentation only requested links to upstream commits when backporting patches. Based on a mailing list discussion [0], patches should, when possible and when approriate, provide a link as evidence that the patch has been submitted upstream. The motivation is that hopefully the patch gets applied to upstream at some point reducing the long term maintenance burden within Buildroot. This also makes future patch review on subsequent package version bumps more streamlined. For patches that are unique to BR and do not apply to the upstream repository, patches should have a comment explaining why they do not apply upstream. [0] https://lists.buildroot.org/pipermail/buildroot/2023-March/666000.html Signed-off-by: Vincent Fazio <vfazio@gmail.com> Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
180 lines
6.6 KiB
Plaintext
180 lines
6.6 KiB
Plaintext
// -*- mode:doc; -*-
|
|
// vim: set syntax=asciidoc:
|
|
|
|
[[patch-policy]]
|
|
|
|
== Patching a package
|
|
|
|
While integrating a new package or updating an existing one, it may be
|
|
necessary to patch the source of the software to get it cross-built within
|
|
Buildroot.
|
|
|
|
Buildroot offers an infrastructure to automatically handle this during
|
|
the builds. It supports three ways of applying patch sets: downloaded patches,
|
|
patches supplied within buildroot and patches located in a user-defined
|
|
global patch directory.
|
|
|
|
=== Providing patches
|
|
|
|
==== Downloaded
|
|
|
|
If it is necessary to apply a patch that is available for download, then add it
|
|
to the +<packagename>_PATCH+ variable. If an entry contains +://+,
|
|
then Buildroot will assume it is a full URL and download the patch
|
|
from this location. Otherwise, Buildroot will assume that the patch should be
|
|
downloaded from +<packagename>_SITE+. It can be a single patch,
|
|
or a tarball containing a patch series.
|
|
|
|
Like for all downloads, a hash should be added to the +<packagename>.hash+
|
|
file.
|
|
|
|
This method is typically used for packages from Debian.
|
|
|
|
==== Within Buildroot
|
|
|
|
Most patches are provided within Buildroot, in the package
|
|
directory; these typically aim to fix cross-compilation, libc support,
|
|
or other such issues.
|
|
|
|
These patch files should be named +<number>-<description>.patch+.
|
|
|
|
.Notes
|
|
- The patch files coming with Buildroot should not contain any package version
|
|
reference in their filename.
|
|
- The field +<number>+ in the patch file name refers to the 'apply order',
|
|
and shall start at 1; It is preferred to pad the number with zeros up to 4
|
|
digits, like 'git-format-patch' does. E.g.: +0001-foobar-the-buz.patch+
|
|
- The patch email subject prefix shall not be numbered. Patches shall
|
|
be generated with the +git format-patch -N+ command, since this
|
|
numbering is automatically added for series. For example, the patch
|
|
subject line should look like +Subject: [PATCH] foobar the buz+ rather
|
|
than +Subject: [PATCH n/m] foobar the buz+.
|
|
- Previously, it was mandatory for patches to be prefixed with the name of
|
|
the package, like +<package>-<number>-<description>.patch+, but that is
|
|
no longer the case. Existing packages will be fixed as time passes. 'Do
|
|
not prefix patches with the package name.'
|
|
- Previously, a +series+ file, as used by +quilt+, could also be added in
|
|
the package directory. In that case, the +series+ file defines the patch
|
|
application order. This is deprecated, and will be removed in the future.
|
|
'Do not use a series file.'
|
|
|
|
|
|
==== Global patch directory
|
|
|
|
The +BR2_GLOBAL_PATCH_DIR+ configuration file option can be
|
|
used to specify a space separated list of one or more directories
|
|
containing global package patches. See xref:customize-patches[] for
|
|
details.
|
|
|
|
[[patch-apply-order]]
|
|
=== How patches are applied
|
|
|
|
. Run the +<packagename>_PRE_PATCH_HOOKS+ commands if defined;
|
|
|
|
. Cleanup the build directory, removing any existing +*.rej+ files;
|
|
|
|
. If +<packagename>_PATCH+ is defined, then patches from these
|
|
tarballs are applied;
|
|
|
|
. If there are some +*.patch+ files in the package's Buildroot
|
|
directory or in a package subdirectory named +<packageversion>+,
|
|
then:
|
|
+
|
|
* If a +series+ file exists in the package directory, then patches are
|
|
applied according to the +series+ file;
|
|
+
|
|
* Otherwise, patch files matching +*.patch+ are applied in alphabetical
|
|
order.
|
|
So, to ensure they are applied in the right order, it is highly
|
|
recommended to name the patch files like this:
|
|
+<number>-<description>.patch+, where +<number>+ refers to the
|
|
'apply order'.
|
|
|
|
. If +BR2_GLOBAL_PATCH_DIR+ is defined, the directories will be
|
|
enumerated in the order they are specified. The patches are applied
|
|
as described in the previous step.
|
|
|
|
. Run the +<packagename>_POST_PATCH_HOOKS+ commands if defined.
|
|
|
|
If something goes wrong in the steps _3_ or _4_, then the build fails.
|
|
|
|
=== Format and licensing of the package patches
|
|
|
|
Patches are released under the same license as the software they apply
|
|
to (see xref:legal-info-buildroot[]).
|
|
|
|
A message explaining what the patch does, and why it is needed, should
|
|
be added in the header commentary of the patch.
|
|
|
|
You should add a +Signed-off-by+ statement in the header of the each
|
|
patch to help with keeping track of the changes and to certify that the
|
|
patch is released under the same license as the software that is modified.
|
|
|
|
If the software is under version control, it is recommended to use the
|
|
upstream SCM software to generate the patch set.
|
|
|
|
Otherwise, concatenate the header with the output of the
|
|
+diff -purN package-version.orig/ package-version/+ command.
|
|
|
|
If you update an existing patch (e.g. when bumping the package version),
|
|
make sure the existing From header and Signed-off-by tags are not
|
|
removed, but do update the rest of the patch comment when appropriate.
|
|
|
|
At the end, the patch should look like:
|
|
|
|
---------------
|
|
configure.ac: add C++ support test
|
|
|
|
Signed-off-by: John Doe <john.doe@noname.org>
|
|
|
|
--- configure.ac.orig
|
|
+++ configure.ac
|
|
@@ -40,2 +40,12 @@
|
|
|
|
AC_PROG_MAKE_SET
|
|
+
|
|
+AC_CACHE_CHECK([whether the C++ compiler works],
|
|
+ [rw_cv_prog_cxx_works],
|
|
+ [AC_LANG_PUSH([C++])
|
|
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
|
|
+ [rw_cv_prog_cxx_works=yes],
|
|
+ [rw_cv_prog_cxx_works=no])
|
|
+ AC_LANG_POP([C++])])
|
|
+
|
|
+AM_CONDITIONAL([CXX_WORKS], [test "x$rw_cv_prog_cxx_works" = "xyes"])
|
|
---------------
|
|
|
|
=== Additional patch documentation
|
|
|
|
Ideally, all patches should document an upstream patch or patch submission, when
|
|
applicable, via the +Upstream+ trailer.
|
|
|
|
When backporting an upstream patch that has been accepted into mainline, it is
|
|
preferred that the URL to the commit is referenced:
|
|
|
|
---------------
|
|
Upstream: <URL to upstream commit>
|
|
---------------
|
|
|
|
If a new issue is identified in Buildroot and upstream is generally affected by
|
|
the issue (it's not a Buildroot specific issue), users should submit the patch
|
|
upstream and provide a link to that submission when possible:
|
|
|
|
---------------
|
|
Upstream: <URL to upstream mailing list submission or merge request>
|
|
---------------
|
|
|
|
Patches that have been submitted but were denied upstream should note that and
|
|
include comments about why the patch is being used despite the upstream status.
|
|
|
|
Note: in any of the above scenarios, it is also sensible to add a few words
|
|
about any changes to the patch that may have been necessary.
|
|
|
|
If a patch does not apply upstream then this should be noted with a comment:
|
|
|
|
---------------
|
|
Upstream: N/A <additional information about why patch is Buildroot specific>
|
|
---------------
|
|
|
|
Adding this documentation helps streamline the patch review process during
|
|
package version updates. |