summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Larson <kergoth@gmail.com>2014-04-28 08:27:34 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-06-26 10:35:06 +0100
commitb89c24085f005ca3abf37ae7357f85b6b6828170 (patch)
treebb46ed4412b5c60404fca4cda2f9befc3ea1f1ed
parent2ae1fa629acf1a37f2c8ad929285cc7c76a9a40b (diff)
downloadbitbake-b89c24085f005ca3abf37ae7357f85b6b6828170.tar.gz
codeparser: don't interact with the cache for subshells
Doing so was causing leakage between the execs of the main value and that of the subshell value, and was causing the cached subshell value to be used for the overall variable. At the least this could cause execs contamination between two variables that while differing, run the same subshell. Beyond that, it's possible we could have been using an incomplete cached value of a subshell for that of the main value. Before this, bb_codeparser.dat would change between parses with differing bbfile parse order. After, it does not change. The codeparser cache version is bumped, to ensure we don't use potentially incorrect cached values from previous runs. This should hopefully resolve the difficult-to-reproduce issues we've seen at Mentor Graphics where bitbake emits a script to run a task and misses dependent functions, resulting in 'command not found' failures. This issue has also been mentioned on the oe devel list, where someone hit a case where oe_runmake was missing from a do_install task (IIRC). Adding debug information showed that bitbake's information about the variable dependencies for this task is inaccurate in the failure cases. Signed-off-by: Christopher Larson <kergoth@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/bb/codeparser.py21
1 files changed, 12 insertions, 9 deletions
diff --git a/lib/bb/codeparser.py b/lib/bb/codeparser.py
index a50b9f268..de8d2eb08 100644
--- a/lib/bb/codeparser.py
+++ b/lib/bb/codeparser.py
@@ -35,7 +35,7 @@ def check_indent(codestr):
class CodeParserCache(MultiProcessCache):
cache_file_name = "bb_codeparser.dat"
- CACHE_VERSION = 4
+ CACHE_VERSION = 5
def __init__(self):
MultiProcessCache.__init__(self)
@@ -217,6 +217,15 @@ class ShellParser():
self.execs = codeparsercache.shellcacheextras[h]["execs"]
return self.execs
+ self._parse_shell(value)
+ self.execs = set(cmd for cmd in self.allexecs if cmd not in self.funcdefs)
+
+ codeparsercache.shellcacheextras[h] = {}
+ codeparsercache.shellcacheextras[h]["execs"] = self.execs
+
+ return self.execs
+
+ def _parse_shell(self, value):
try:
tokens, _ = pyshyacc.parse(value, eof=True, debug=False)
except pyshlex.NeedMore:
@@ -224,12 +233,6 @@ class ShellParser():
for token in tokens:
self.process_tokens(token)
- self.execs = set(cmd for cmd in self.allexecs if cmd not in self.funcdefs)
-
- codeparsercache.shellcacheextras[h] = {}
- codeparsercache.shellcacheextras[h]["execs"] = self.execs
-
- return self.execs
def process_tokens(self, tokens):
"""Process a supplied portion of the syntax tree as returned by
@@ -303,7 +306,7 @@ class ShellParser():
if part[0] in ('`', '$('):
command = pyshlex.wordtree_as_string(part[1:-1])
- self.parse_shell(command)
+ self._parse_shell(command)
if word[0] in ("cmd_name", "cmd_word"):
if word in words:
@@ -322,7 +325,7 @@ class ShellParser():
self.log.debug(1, self.unhandled_template % cmd)
elif cmd == "eval":
command = " ".join(word for _, word in words[1:])
- self.parse_shell(command)
+ self._parse_shell(command)
else:
self.allexecs.add(cmd)
break