From: Martin Jansa <martin.jansa@gmail.com>
To: Richard Purdie <richard.purdie@linuxfoundation.org>
Cc: bitbake-devel <bitbake-devel@lists.openembedded.org>
Subject: Re: [PATCH v2] parse/ConfHander/BBHandler/utils: Fix cache dependency bugs
Date: Sat, 30 Nov 2013 00:27:30 +0100 [thread overview]
Message-ID: <20131129232730.GD2860@jama> (raw)
In-Reply-To: <1385766956.11222.80.camel@ted>
[-- Attachment #1: Type: text/plain, Size: 7219 bytes --]
On Fri, Nov 29, 2013 at 11:15:56PM +0000, Richard Purdie wrote:
>
> Currently bitbake only adds files to its dependency list if they exist.
> If you add 'include foo.inc' to your recipe and the file doesn't exist,
> then later you add the file, the cache will not be invalidated.
>
> This leads to another bug which is that if files don't exist and then
> you add them and they should be found first due to BBPATH, again the
> cache won't invalidate.
>
> This patch adds in tracking of files we check for the existence of so
> that if they are added later, the cache correctly invalidates. This
> necessitated a new version of bb.utils.which which returns a list of
> files tested for.
>
> The patch also adds in checks for duplicate file includes and for now
> prints a warning about this. That will likely become a fatal error at
> some point since its never usually desired to include a file twice.
>
> The same issue is also fixed for class inheritance. Now when a class
> is added which would be found in the usual search path, it will cause
> the cache to be invalidated.
>
> Unfortunately this is old code in bitbake and the patch isn't the
> neatest since we have to work within that framework.
Does it depend on any other patches? Even after removing extra bitbake/
prefix (I guess the patch is for poky not bitbake repo) it doesn't apply
in current master:
error: patch failed: lib/bb/parse/parse_py/ConfHandler.py:82
error: lib/bb/parse/parse_py/ConfHandler.py: patch does not apply
Patch failed at 0001 parse/ConfHander/BBHandler/utils: Fix cache
dependency bugs
The copy of the patch that failed is found in:
/OE/bitbake/.git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
>
> [YOCTO #5611]
> [YOCTO #4425]
>
> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
> ---
> diff --git a/bitbake/lib/bb/parse/__init__.py b/bitbake/lib/bb/parse/__init__.py
> index c973f6f..97983c9 100644
> --- a/bitbake/lib/bb/parse/__init__.py
> +++ b/bitbake/lib/bb/parse/__init__.py
> @@ -73,9 +73,17 @@ def update_mtime(f):
> def mark_dependency(d, f):
> if f.startswith('./'):
> f = "%s/%s" % (os.getcwd(), f[2:])
> - deps = (d.getVar('__depends') or []) + [(f, cached_mtime(f))]
> - d.setVar('__depends', deps)
> -
> + deps = (d.getVar('__depends') or [])
> + s = (f, cached_mtime_noerror(f))
> + if s not in deps:
> + deps.append(s)
> + d.setVar('__depends', deps)
> +
> +def check_dependency(d, f):
> + s = (f, cached_mtime_noerror(f))
> + deps = (d.getVar('__depends') or [])
> + return s in deps
> +
> def supports(fn, data):
> """Returns true if we have a handler for this file, false otherwise"""
> for h in handlers:
> @@ -102,11 +110,14 @@ def init_parser(d):
> def resolve_file(fn, d):
> if not os.path.isabs(fn):
> bbpath = d.getVar("BBPATH", True)
> - newfn = bb.utils.which(bbpath, fn)
> + newfn, attempts = bb.utils.which(bbpath, fn, history=True)
> + for af in attempts:
> + mark_dependency(d, af)
> if not newfn:
> raise IOError("file %s not found in %s" % (fn, bbpath))
> fn = newfn
>
> + mark_dependency(d, fn)
> if not os.path.isfile(fn):
> raise IOError("file %s not found" % fn)
>
> diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py b/bitbake/lib/bb/parse/parse_py/BBHandler.py
> index 01f22d3..7cba649 100644
> --- a/bitbake/lib/bb/parse/parse_py/BBHandler.py
> +++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py
> @@ -77,7 +77,10 @@ def inherit(files, fn, lineno, d):
> if not os.path.isabs(file):
> dname = os.path.dirname(fn)
> bbpath = "%s:%s" % (dname, d.getVar("BBPATH", True))
> - abs_fn = bb.utils.which(bbpath, file)
> + abs_fn, attempts = bb.utils.which(bbpath, file, history=True)
> + for af in attempts:
> + if af != abs_fn:
> + bb.parse.mark_dependency(d, af)
> if abs_fn:
> file = abs_fn
>
> diff --git a/bitbake/lib/bb/parse/parse_py/ConfHandler.py b/bitbake/lib/bb/parse/parse_py/ConfHandler.py
> index c28f18b..f4fb2aa 100644
> --- a/bitbake/lib/bb/parse/parse_py/ConfHandler.py
> +++ b/bitbake/lib/bb/parse/parse_py/ConfHandler.py
> @@ -82,12 +82,15 @@ def include(oldfn, fn, lineno, data, error_out):
> if not os.path.isabs(fn):
> dname = os.path.dirname(oldfn)
> bbpath = "%s:%s" % (dname, data.getVar("BBPATH", True))
> - abs_fn = bb.utils.which(bbpath, fn)
> + abs_fn, attempts = bb.utils.which(bbpath, fn, history=True)
> + if abs_fn and bb.parse.check_dependency(data, abs_fn):
> + bb.warn("Duplicate inclusion for %s in %s" % (abs_fn, data.getVar('FILE', True)))
> + for af in attempts:
> + bb.parse.mark_dependency(data, af)
> if abs_fn:
> fn = abs_fn
> -
> - if fn in (data.getVar("__depends", False) or ""):
> - bb.warn("Duplicate inclusion for %s" % fn)
> + elif bb.parse.check_dependency(data, fn):
> + bb.warn("Duplicate inclusion for %s in %s" % (fn, data.getVar('FILE', True)))
>
> from bb.parse import handle
> try:
> @@ -96,6 +99,7 @@ def include(oldfn, fn, lineno, data, error_out):
> if error_out:
> raise ParseError("Could not %(error_out)s file %(fn)s" % vars(), oldfn, lineno)
> logger.debug(2, "CONF file '%s' not found", fn)
> + bb.parse.mark_dependency(data, fn)
>
> # We have an issue where a UI might want to enforce particular settings such as
> # an empty DISTRO variable. If configuration files do something like assigning
> diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py
> index 560f55a..0be45e1 100644
> --- a/bitbake/lib/bb/utils.py
> +++ b/bitbake/lib/bb/utils.py
> @@ -796,22 +796,28 @@ def copyfile(src, dest, newmtime = None, sstat = None):
> newmtime = sstat[stat.ST_MTIME]
> return newmtime
>
> -def which(path, item, direction = 0):
> +def which(path, item, direction = 0, history = False):
> """
> Locate a file in a PATH
> """
>
> + hist = []
> paths = (path or "").split(':')
> if direction != 0:
> paths.reverse()
>
> for p in paths:
> next = os.path.join(p, item)
> + hist.append(next)
> if os.path.exists(next):
> if not os.path.isabs(next):
> next = os.path.abspath(next)
> + if history:
> + return next, hist
> return next
>
> + if history:
> + return "", hist
> return ""
>
> def to_boolean(string, default=None):
>
>
> _______________________________________________
> bitbake-devel mailing list
> bitbake-devel@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/bitbake-devel
--
Martin 'JaMa' Jansa jabber: Martin.Jansa@gmail.com
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 205 bytes --]
next prev parent reply other threads:[~2013-11-29 23:27 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-29 23:15 [PATCH v2] parse/ConfHander/BBHandler/utils: Fix cache dependency bugs Richard Purdie
2013-11-29 23:27 ` Martin Jansa [this message]
2013-11-29 23:31 ` Richard Purdie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131129232730.GD2860@jama \
--to=martin.jansa@gmail.com \
--cc=bitbake-devel@lists.openembedded.org \
--cc=richard.purdie@linuxfoundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox