8109e93a26
A path variable is assigned the value of PATH from the environment, before the PATH is set on the environemnt from the value of PATH in the bb datastore. This seems to be an unnecessary leftover. [YOCTO #8543] (From OE-Core rev: a3c7c5148017c652661f2c5f79d90aa80dcb479b) Signed-off-by: Alex Franco <alejandro.franco@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
188 lines
5.4 KiB
Text
188 lines
5.4 KiB
Text
# Copyright (C) 2006 OpenedHand LTD
|
|
|
|
# Point to an empty file so any user's custom settings don't break things
|
|
QUILTRCFILE ?= "${STAGING_ETCDIR_NATIVE}/quiltrc"
|
|
|
|
PATCHDEPENDENCY = "${PATCHTOOL}-native:do_populate_sysroot"
|
|
|
|
inherit terminal
|
|
|
|
def src_patches(d, all = False ):
|
|
workdir = d.getVar('WORKDIR', True)
|
|
fetch = bb.fetch2.Fetch([], d)
|
|
patches = []
|
|
sources = []
|
|
for url in fetch.urls:
|
|
local = patch_path(url, fetch, workdir)
|
|
if not local:
|
|
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
|
|
|
|
patchdir = parm.get('patchdir')
|
|
if patchdir:
|
|
patchparm['patchdir'] = patchdir
|
|
|
|
localurl = bb.fetch.encodeurl(('file', '', local, '', '', patchparm))
|
|
patches.append(localurl)
|
|
|
|
if all:
|
|
return sources
|
|
|
|
return patches
|
|
|
|
def patch_path(url, fetch, workdir):
|
|
"""Return the local path of a patch, or None if this isn't a patch"""
|
|
|
|
local = fetch.localpath(url)
|
|
base, ext = os.path.splitext(os.path.basename(local))
|
|
if ext in ('.gz', '.bz2', '.Z'):
|
|
local = os.path.join(workdir, base)
|
|
ext = os.path.splitext(base)[1]
|
|
|
|
urldata = fetch.ud[url]
|
|
if "apply" in urldata.parm:
|
|
apply = oe.types.boolean(urldata.parm["apply"])
|
|
if not apply:
|
|
return
|
|
elif ext not in (".diff", ".patch"):
|
|
return
|
|
|
|
return local
|
|
|
|
def should_apply(parm, d):
|
|
"""Determine if we should apply the given patch"""
|
|
|
|
if "mindate" in parm or "maxdate" in parm:
|
|
pn = d.getVar('PN', True)
|
|
srcdate = d.getVar('SRCDATE_%s' % pn, True)
|
|
if not srcdate:
|
|
srcdate = d.getVar('SRCDATE', True)
|
|
|
|
if srcdate == "now":
|
|
srcdate = d.getVar('DATE', True)
|
|
|
|
if "maxdate" in parm and parm["maxdate"] < srcdate:
|
|
return False, 'is outdated'
|
|
|
|
if "mindate" in parm and parm["mindate"] > srcdate:
|
|
return False, 'is predated'
|
|
|
|
|
|
if "minrev" in parm:
|
|
srcrev = d.getVar('SRCREV', True)
|
|
if srcrev and srcrev < parm["minrev"]:
|
|
return False, 'applies to later revisions'
|
|
|
|
if "maxrev" in parm:
|
|
srcrev = d.getVar('SRCREV', True)
|
|
if srcrev and srcrev > parm["maxrev"]:
|
|
return False, 'applies to earlier revisions'
|
|
|
|
if "rev" in parm:
|
|
srcrev = d.getVar('SRCREV', True)
|
|
if srcrev and parm["rev"] not in srcrev:
|
|
return False, "doesn't apply to revision"
|
|
|
|
if "notrev" in parm:
|
|
srcrev = d.getVar('SRCREV', True)
|
|
if srcrev and parm["notrev"] in srcrev:
|
|
return False, "doesn't apply to revision"
|
|
|
|
return True, None
|
|
|
|
should_apply[vardepsexclude] = "DATE SRCDATE"
|
|
|
|
python patch_do_patch() {
|
|
import oe.patch
|
|
|
|
patchsetmap = {
|
|
"patch": oe.patch.PatchTree,
|
|
"quilt": oe.patch.QuiltTree,
|
|
"git": oe.patch.GitApplyTree,
|
|
}
|
|
|
|
cls = patchsetmap[d.getVar('PATCHTOOL', True) or 'quilt']
|
|
|
|
resolvermap = {
|
|
"noop": oe.patch.NOOPResolver,
|
|
"user": oe.patch.UserResolver,
|
|
}
|
|
|
|
rcls = resolvermap[d.getVar('PATCHRESOLVE', True) or 'user']
|
|
|
|
classes = {}
|
|
|
|
s = d.getVar('S', True)
|
|
|
|
os.putenv('PATH', d.getVar('PATH', True))
|
|
|
|
# We must use one TMPDIR per process so that the "patch" processes
|
|
# don't generate the same temp file name.
|
|
|
|
import tempfile
|
|
process_tmpdir = tempfile.mkdtemp()
|
|
os.environ['TMPDIR'] = process_tmpdir
|
|
|
|
for patch in src_patches(d):
|
|
_, _, local, _, _, parm = bb.fetch.decodeurl(patch)
|
|
|
|
if "patchdir" in parm:
|
|
patchdir = parm["patchdir"]
|
|
if not os.path.isabs(patchdir):
|
|
patchdir = os.path.join(s, patchdir)
|
|
else:
|
|
patchdir = s
|
|
|
|
if not patchdir in classes:
|
|
patchset = cls(patchdir, d)
|
|
resolver = rcls(patchset, oe_terminal)
|
|
classes[patchdir] = (patchset, resolver)
|
|
patchset.Clean()
|
|
else:
|
|
patchset, resolver = classes[patchdir]
|
|
|
|
bb.note("Applying patch '%s' (%s)" % (parm['patchname'], oe.path.format_display(local, d)))
|
|
try:
|
|
patchset.Import({"file":local, "strippath": parm['striplevel']}, True)
|
|
except Exception as exc:
|
|
bb.utils.remove(process_tmpdir, True)
|
|
bb.fatal(str(exc))
|
|
try:
|
|
resolver.Resolve()
|
|
except bb.BBHandledException as e:
|
|
bb.utils.remove(process_tmpdir, True)
|
|
bb.fatal(str(e))
|
|
|
|
bb.utils.remove(process_tmpdir, True)
|
|
del os.environ['TMPDIR']
|
|
}
|
|
patch_do_patch[vardepsexclude] = "PATCHRESOLVE"
|
|
|
|
addtask patch after do_unpack
|
|
do_patch[dirs] = "${WORKDIR}"
|
|
do_patch[depends] = "${PATCHDEPENDENCY}"
|
|
|
|
EXPORT_FUNCTIONS do_patch
|