aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/bb/parse/__init__.py19
-rw-r--r--lib/bb/parse/parse_py/BBHandler.py5
-rw-r--r--lib/bb/parse/parse_py/ConfHandler.py9
-rw-r--r--lib/bb/utils.py8
4 files changed, 34 insertions, 7 deletions
diff --git a/lib/bb/parse/__init__.py b/lib/bb/parse/__init__.py
index c973f6fdb..97983c988 100644
--- a/lib/bb/parse/__init__.py
+++ b/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/lib/bb/parse/parse_py/BBHandler.py b/lib/bb/parse/parse_py/BBHandler.py
index 01f22d3b2..7cba64959 100644
--- a/lib/bb/parse/parse_py/BBHandler.py
+++ b/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/lib/bb/parse/parse_py/ConfHandler.py b/lib/bb/parse/parse_py/ConfHandler.py
index 7b30c8acb..f4fb2aa45 100644
--- a/lib/bb/parse/parse_py/ConfHandler.py
+++ b/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/lib/bb/utils.py b/lib/bb/utils.py
index 560f55a07..0be45e1af 100644
--- a/lib/bb/utils.py
+++ b/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):