diff options
| -rw-r--r-- | bitbake/lib/bb/parse/__init__.py | 19 | ||||
| -rw-r--r-- | bitbake/lib/bb/parse/parse_py/BBHandler.py | 5 | ||||
| -rw-r--r-- | bitbake/lib/bb/parse/parse_py/ConfHandler.py | 9 | ||||
| -rw-r--r-- | bitbake/lib/bb/utils.py | 8 |
4 files changed, 34 insertions, 7 deletions
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): | |||
| 73 | def mark_dependency(d, f): | 73 | def mark_dependency(d, f): |
| 74 | if f.startswith('./'): | 74 | if f.startswith('./'): |
| 75 | f = "%s/%s" % (os.getcwd(), f[2:]) | 75 | f = "%s/%s" % (os.getcwd(), f[2:]) |
| 76 | deps = (d.getVar('__depends') or []) + [(f, cached_mtime(f))] | 76 | deps = (d.getVar('__depends') or []) |
| 77 | d.setVar('__depends', deps) | 77 | s = (f, cached_mtime_noerror(f)) |
| 78 | 78 | if s not in deps: | |
| 79 | deps.append(s) | ||
| 80 | d.setVar('__depends', deps) | ||
| 81 | |||
| 82 | def check_dependency(d, f): | ||
| 83 | s = (f, cached_mtime_noerror(f)) | ||
| 84 | deps = (d.getVar('__depends') or []) | ||
| 85 | return s in deps | ||
| 86 | |||
| 79 | def supports(fn, data): | 87 | def supports(fn, data): |
| 80 | """Returns true if we have a handler for this file, false otherwise""" | 88 | """Returns true if we have a handler for this file, false otherwise""" |
| 81 | for h in handlers: | 89 | for h in handlers: |
| @@ -102,11 +110,14 @@ def init_parser(d): | |||
| 102 | def resolve_file(fn, d): | 110 | def resolve_file(fn, d): |
| 103 | if not os.path.isabs(fn): | 111 | if not os.path.isabs(fn): |
| 104 | bbpath = d.getVar("BBPATH", True) | 112 | bbpath = d.getVar("BBPATH", True) |
| 105 | newfn = bb.utils.which(bbpath, fn) | 113 | newfn, attempts = bb.utils.which(bbpath, fn, history=True) |
| 114 | for af in attempts: | ||
| 115 | mark_dependency(d, af) | ||
| 106 | if not newfn: | 116 | if not newfn: |
| 107 | raise IOError("file %s not found in %s" % (fn, bbpath)) | 117 | raise IOError("file %s not found in %s" % (fn, bbpath)) |
| 108 | fn = newfn | 118 | fn = newfn |
| 109 | 119 | ||
| 120 | mark_dependency(d, fn) | ||
| 110 | if not os.path.isfile(fn): | 121 | if not os.path.isfile(fn): |
| 111 | raise IOError("file %s not found" % fn) | 122 | raise IOError("file %s not found" % fn) |
| 112 | 123 | ||
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): | |||
| 77 | if not os.path.isabs(file): | 77 | if not os.path.isabs(file): |
| 78 | dname = os.path.dirname(fn) | 78 | dname = os.path.dirname(fn) |
| 79 | bbpath = "%s:%s" % (dname, d.getVar("BBPATH", True)) | 79 | bbpath = "%s:%s" % (dname, d.getVar("BBPATH", True)) |
| 80 | abs_fn = bb.utils.which(bbpath, file) | 80 | abs_fn, attempts = bb.utils.which(bbpath, file, history=True) |
| 81 | for af in attempts: | ||
| 82 | if af != abs_fn: | ||
| 83 | bb.parse.mark_dependency(d, af) | ||
| 81 | if abs_fn: | 84 | if abs_fn: |
| 82 | file = abs_fn | 85 | file = abs_fn |
| 83 | 86 | ||
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): | |||
| 82 | if not os.path.isabs(fn): | 82 | if not os.path.isabs(fn): |
| 83 | dname = os.path.dirname(oldfn) | 83 | dname = os.path.dirname(oldfn) |
| 84 | bbpath = "%s:%s" % (dname, data.getVar("BBPATH", True)) | 84 | bbpath = "%s:%s" % (dname, data.getVar("BBPATH", True)) |
| 85 | abs_fn = bb.utils.which(bbpath, fn) | 85 | abs_fn, attempts = bb.utils.which(bbpath, fn, history=True) |
| 86 | if abs_fn and bb.parse.check_dependency(data, abs_fn): | ||
| 87 | bb.warn("Duplicate inclusion for %s in %s" % (abs_fn, data.getVar('FILE', True))) | ||
| 88 | for af in attempts: | ||
| 89 | bb.parse.mark_dependency(data, af) | ||
| 86 | if abs_fn: | 90 | if abs_fn: |
| 87 | fn = abs_fn | 91 | fn = abs_fn |
| 92 | elif bb.parse.check_dependency(data, fn): | ||
| 93 | bb.warn("Duplicate inclusion for %s in %s" % (fn, data.getVar('FILE', True))) | ||
| 88 | 94 | ||
| 89 | from bb.parse import handle | 95 | from bb.parse import handle |
| 90 | try: | 96 | try: |
| @@ -93,6 +99,7 @@ def include(oldfn, fn, lineno, data, error_out): | |||
| 93 | if error_out: | 99 | if error_out: |
| 94 | raise ParseError("Could not %(error_out)s file %(fn)s" % vars(), oldfn, lineno) | 100 | raise ParseError("Could not %(error_out)s file %(fn)s" % vars(), oldfn, lineno) |
| 95 | logger.debug(2, "CONF file '%s' not found", fn) | 101 | logger.debug(2, "CONF file '%s' not found", fn) |
| 102 | bb.parse.mark_dependency(data, fn) | ||
| 96 | 103 | ||
| 97 | # We have an issue where a UI might want to enforce particular settings such as | 104 | # We have an issue where a UI might want to enforce particular settings such as |
| 98 | # an empty DISTRO variable. If configuration files do something like assigning | 105 | # 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 560f55a074..0be45e1af6 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): | |||
| 796 | newmtime = sstat[stat.ST_MTIME] | 796 | newmtime = sstat[stat.ST_MTIME] |
| 797 | return newmtime | 797 | return newmtime |
| 798 | 798 | ||
| 799 | def which(path, item, direction = 0): | 799 | def which(path, item, direction = 0, history = False): |
| 800 | """ | 800 | """ |
| 801 | Locate a file in a PATH | 801 | Locate a file in a PATH |
| 802 | """ | 802 | """ |
| 803 | 803 | ||
| 804 | hist = [] | ||
| 804 | paths = (path or "").split(':') | 805 | paths = (path or "").split(':') |
| 805 | if direction != 0: | 806 | if direction != 0: |
| 806 | paths.reverse() | 807 | paths.reverse() |
| 807 | 808 | ||
| 808 | for p in paths: | 809 | for p in paths: |
| 809 | next = os.path.join(p, item) | 810 | next = os.path.join(p, item) |
| 811 | hist.append(next) | ||
| 810 | if os.path.exists(next): | 812 | if os.path.exists(next): |
| 811 | if not os.path.isabs(next): | 813 | if not os.path.isabs(next): |
| 812 | next = os.path.abspath(next) | 814 | next = os.path.abspath(next) |
| 815 | if history: | ||
| 816 | return next, hist | ||
| 813 | return next | 817 | return next |
| 814 | 818 | ||
| 819 | if history: | ||
| 820 | return "", hist | ||
| 815 | return "" | 821 | return "" |
| 816 | 822 | ||
| 817 | def to_boolean(string, default=None): | 823 | def to_boolean(string, default=None): |
