diff --git a/bitbake/lib/bb/parse/__init__.py b/bitbake/lib/bb/parse/__init__.py index c973f6fdbf..97983c9880 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 01f22d3b24..7cba649595 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 7b30c8acb3..f4fb2aa45c 100644 --- a/bitbake/lib/bb/parse/parse_py/ConfHandler.py +++ b/bitbake/lib/bb/parse/parse_py/ConfHandler.py @@ -82,9 +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 + 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: @@ -93,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 f9ee4f1c1d..20dea64c0e 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py @@ -793,22 +793,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):