The current developer manual specifies that patches that are part of a directory which is given in SRC_URI are applied by the do_patch task. However that is not implemented in the current code.
Implement part of it with two differences: - The implementation requires the parameter "apply=yes" and adds all files as patches, not only files ending in .patch and .diff. This keeps recipes which depend on the current implementation working. - The possibility to exclude a file in that directory from being applied by a follow up entry with "apply=no" is dropped. Signed-off-by: Max Krummenacher <max.krummenac...@toradex.com> --- meta/lib/oe/patch.py | 92 ++++++++++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 37 deletions(-) diff --git a/meta/lib/oe/patch.py b/meta/lib/oe/patch.py index 950fe723dc..39f8fb5097 100644 --- a/meta/lib/oe/patch.py +++ b/meta/lib/oe/patch.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-2.0-only # +import glob import oe.path import oe.types import subprocess @@ -794,68 +795,85 @@ class UserResolver(Resolver): raise os.chdir(olddir) - -def patch_path(url, fetch, workdir, expand=True): - """Return the local path of a patch, or return nothing if this isn't a patch""" - - local = fetch.localpath(url) - if os.path.isdir(local): - return +def is_patch(local, workdir, apply_all, expand): base, ext = os.path.splitext(os.path.basename(local)) if ext in ('.gz', '.bz2', '.xz', '.Z'): if expand: local = os.path.join(workdir, base) ext = os.path.splitext(base)[1] + if ext in (".diff", ".patch") or apply_all: + return True + return False + +def patch_path(url, fetch, workdir, expand=True): + """Return a list of local paths of patches or return an empty list if there are no patches""" + patches = [] + local = fetch.localpath(url) urldata = fetch.ud[url] + + apply_all = False if "apply" in urldata.parm: apply = oe.types.boolean(urldata.parm["apply"]) if not apply: - return - elif ext not in (".diff", ".patch"): - return + return patches + else: + apply_all = True - return local + if os.path.isdir(local) and apply_all: + for f in sorted(glob.glob(local + "/**", recursive=True)): + if os.path.isdir(f): + continue + if is_patch(f, workdir, apply_all, expand): + patches.append(f) + else: + if is_patch(local, workdir, apply_all, expand): + patches.append(local) + + return patches def src_patches(d, all=False, expand=True): + """Return a list of local paths from SRC_URI. With all=False all patches targeting do_patch, with all=True all other local paths""" workdir = d.getVar('WORKDIR') fetch = bb.fetch2.Fetch([], d) patches = [] sources = [] for url in fetch.urls: - local = patch_path(url, fetch, workdir, expand) - if not local: + locals = [] + locals = locals + patch_path(url, fetch, workdir, expand) + + if not locals: if all: local = fetch.localpath(url) sources.append(local) continue - - urldata = fetch.ud[url] - parm = urldata.parm - patchname = parm.get('pname') or os.path.basename(local) - - apply, reason = should_apply(parm, d) - if not apply: - if reason: - bb.note("Patch %s %s" % (patchname, reason)) - continue - - patchparm = {'patchname': patchname} - if "striplevel" in parm: - striplevel = parm["striplevel"] - elif "pnum" in parm: - #bb.msg.warn(None, "Deprecated usage of 'pnum' url parameter in '%s', please use 'striplevel'" % url) - striplevel = parm["pnum"] else: - striplevel = '1' - patchparm['striplevel'] = striplevel + for patch in locals: + parm = fetch.ud[url].parm + patchname = parm.get('pname') or os.path.basename(patch) + + apply, reason = should_apply(parm, d) + if not apply: + if reason: + bb.note("Patch %s %s" % (patchname, reason)) + continue + + patchparm = {'patchname': patchname} + if "striplevel" in parm: + striplevel = parm["striplevel"] + elif "pnum" in parm: + #bb.warn("Deprecated usage of 'pnum' url parameter in '%s', please use 'striplevel'" % url) + striplevel = parm["pnum"] + else: + striplevel = '1' + patchparm['striplevel'] = striplevel - patchdir = parm.get('patchdir') - if patchdir: - patchparm['patchdir'] = patchdir + patchdir = parm.get('patchdir') + if patchdir: + patchparm['patchdir'] = patchdir - localurl = bb.fetch.encodeurl(('file', '', local, '', '', patchparm)) - patches.append(localurl) + localurl = bb.fetch.encodeurl(('file', '', patch, '', '', patchparm)) + patches.append(localurl) if all: return sources -- 2.20.1
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#159860): https://lists.openembedded.org/g/openembedded-core/message/159860 Mute This Topic: https://lists.openembedded.org/mt/87853565/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-