rework patch model

At the Buildroot Developers Meeting (4-5 February 2013, in Brussels) a change
to the patch logic was discussed. See

http://elinux.org/Buildroot:DeveloperDaysFOSDEM2013

for details. In summary:

* For patches stored in the package directory, if
  package/<pkg>/<version>/ does exist, apply package/<pkg>/<version>/*.patch,
  otherwise, apply package/<pkg>/*.patch
* For patches stored in the global patches directory, if
  $(GLOBAL_PATCH_DIR)/<pkg>/<version>/ does exist, apply
  $(GLOBAL_PATCH_DIR)/<pkg>/<version>/*.patch, otherwise, apply
  $(GLOBAL_PATCH_DIR)/<pkg>/*.patch

This patch adds the new BR2_GLOBAL_PATCH_DIR configuration item, and reworks
the generic package infrastructure to implement the new patch logic.

[Peter: fixup doc nits as pointed out by Thomas]
Signed-off-by: Simon Dawson <spdawson@gmail.com>
Acked-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Tested-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Acked-by: Samuel Martin <s.martin49@gmail.com>
Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
This commit is contained in:
Simon Dawson 2013-03-17 23:13:47 +00:00 committed by Peter Korsgaard
parent 424d69bc9b
commit 5538e47662
5 changed files with 59 additions and 11 deletions

View File

@ -437,6 +437,21 @@ config BR2_PACKAGE_OVERRIDE_FILE
as the source directory for a particular package. See the as the source directory for a particular package. See the
Buildroot documentation for more details on this feature. Buildroot documentation for more details on this feature.
config BR2_GLOBAL_PATCH_DIR
string "global patch directory"
help
You may specify a directory containing global package patches.
For a specific version <packageversion> of a specific package
<packagename>, patches are applied as follows.
First, the default Buildroot patch set for the package is applied.
If the directory $(BR2_GLOBAL_PATCH_DIR)/<packagename>/<packageversion>
exists, then all *.patch files in the directory will be applied.
Otherwise, if the directory $(BR2_GLOBAL_PATCH_DIR)/<packagename> exists,
then all *.patch files in the directory will be applied.
endmenu endmenu
source "toolchain/Config.in" source "toolchain/Config.in"

View File

@ -0,0 +1,23 @@
// -*- mode:doc -*- ;
[[packages-custom]]
Customizing packages
~~~~~~~~~~~~~~~~~~~~
It is sometimes useful to apply 'extra' patches to packages - over and
above those provided in Buildroot. This might be used to support custom
features in a project, for example, or when working on a new architecture.
The +BR2_GLOBAL_PATCH_DIR+ configuration file option can be
used to specify a directory containing global package patches.
For a specific version <packageversion> of a specific package <packagename>,
patches are applied as follows.
First, the default Buildroot patch set for the package is applied.
If the directory +$(BR2_GLOBAL_PATCH_DIR)/<packagename>/<packageversion>+
exists, then all +*.patch+ files in the directory will be applied.
Otherwise, if the directory +$(BR2_GLOBAL_PATCH_DIR)/<packagename>+
exists, then all +*.patch+ files in the directory will be applied.

View File

@ -15,3 +15,5 @@ include::customize-kernel-config.txt[]
include::customize-toolchain.txt[] include::customize-toolchain.txt[]
include::customize-store.txt[] include::customize-store.txt[]
include::customize-packages.txt[]

View File

@ -11,8 +11,9 @@ necessary to patch the source of the software to get it cross-built within
Buildroot. Buildroot.
Buildroot offers an infrastructure to automatically handle this during Buildroot offers an infrastructure to automatically handle this during
the builds. It supports two ways of applying patch sets: downloaded patches the builds. It supports three ways of applying patch sets: downloaded patches,
and patches supplied within buildroot. patches supplied within buildroot and patches located in a user-defined
global patch directory.
Providing patches Providing patches
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
@ -45,6 +46,13 @@ application order.
reference in their filename. reference in their filename.
- The field +<number>+ in the patch file name refers to the 'apply order'. - The field +<number>+ in the patch file name refers to the 'apply order'.
Global patch directory
^^^^^^^^^^^^^^^^^^^^^^
The +BR2_GLOBAL_PATCH_DIR+ configuration file option can be
used to specify a directory containing global package patches. See
xref:packages-custom[] for details.
How patches are applied How patches are applied
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
@ -57,7 +65,7 @@ How patches are applied
tarballs are applied; tarballs are applied;
. If there are some +*.patch+ files in the package directory or in the . If there are some +*.patch+ files in the package directory or in the
a package subdirectory named +<packagename>-<packageversion>+, then: a package subdirectory named +<packageversion>+, then:
+ +
* If a +series+ file exists in the package directory, then patches are * If a +series+ file exists in the package directory, then patches are
applied according to the +series+ file; applied according to the +series+ file;

View File

@ -82,21 +82,21 @@ endif
# find the package directory (typically package/<pkgname>) and the # find the package directory (typically package/<pkgname>) and the
# prefix of the patches # prefix of the patches
$(BUILD_DIR)/%/.stamp_patched: NAMEVER = $(RAWNAME)-$($(PKG)_VERSION) $(BUILD_DIR)/%/.stamp_patched: NAMEVER = $(RAWNAME)-$($(PKG)_VERSION)
$(BUILD_DIR)/%/.stamp_patched: PATCH_BASE_DIRS = $($(PKG)_DIR_PREFIX)/$(RAWNAME) $(call qstrip,$(BR2_GLOBAL_PATCH_DIR))/$(RAWNAME)
$(BUILD_DIR)/%/.stamp_patched: $(BUILD_DIR)/%/.stamp_patched:
@$(call MESSAGE,"Patching $($(PKG)_DIR_PREFIX)/$(RAWNAME)") @$(call MESSAGE,"Patching $($(PKG)_DIR_PREFIX)/$(RAWNAME)")
$(foreach hook,$($(PKG)_PRE_PATCH_HOOKS),$(call $(hook))$(sep)) $(foreach hook,$($(PKG)_PRE_PATCH_HOOKS),$(call $(hook))$(sep))
$(foreach p,$($(PKG)_PATCH),support/scripts/apply-patches.sh $(@D) $(DL_DIR) $(p)$(sep)) $(foreach p,$($(PKG)_PATCH),support/scripts/apply-patches.sh $(@D) $(DL_DIR) $(p)$(sep))
$(Q)( \ $(Q)( \
if test -d $($(PKG)_DIR_PREFIX)/$(RAWNAME); then \ for D in $(PATCH_BASE_DIRS); do \
if test "$(wildcard $($(PKG)_DIR_PREFIX)/$(RAWNAME)/$(NAMEVER)*.patch*)"; then \ if test -d $${D}; then \
support/scripts/apply-patches.sh $(@D) $($(PKG)_DIR_PREFIX)/$(RAWNAME) $(NAMEVER)\*.patch $(NAMEVER)\*.patch.$(ARCH) || exit 1; \ if test -d $${D}/$($(PKG)_VERSION); then \
else \ support/scripts/apply-patches.sh $(@D) $${D}/$($(PKG)_VERSION) \*.patch \*.patch.$(ARCH) || exit 1; \
support/scripts/apply-patches.sh $(@D) $($(PKG)_DIR_PREFIX)/$(RAWNAME) $(RAWNAME)\*.patch $(RAWNAME)\*.patch.$(ARCH) || exit 1; \ else \
if test -d $($(PKG)_DIR_PREFIX)/$(RAWNAME)/$(NAMEVER); then \ support/scripts/apply-patches.sh $(@D) $${D} \*.patch \*.patch.$(ARCH) || exit 1; \
support/scripts/apply-patches.sh $(@D) $($(PKG)_DIR_PREFIX)/$(RAWNAME)/$(NAMEVER) \*.patch \*.patch.$(ARCH) || exit 1; \
fi; \ fi; \
fi; \ fi; \
fi; \ done; \
) )
$(foreach hook,$($(PKG)_POST_PATCH_HOOKS),$(call $(hook))$(sep)) $(foreach hook,$($(PKG)_POST_PATCH_HOOKS),$(call $(hook))$(sep))
$(Q)touch $@ $(Q)touch $@