diff options
| -rw-r--r-- | bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml | 17 | ||||
| -rw-r--r-- | bitbake/lib/bb/parse/ast.py | 33 | ||||
| -rw-r--r-- | bitbake/lib/bb/parse/parse_py/ConfHandler.py | 12 | ||||
| -rw-r--r-- | bitbake/lib/bb/tests/parse.py | 17 |
4 files changed, 79 insertions, 0 deletions
diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml index 5df00050ce..64f08157f6 100644 --- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml +++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml | |||
| @@ -435,6 +435,23 @@ | |||
| 435 | </para> | 435 | </para> |
| 436 | </section> | 436 | </section> |
| 437 | 437 | ||
| 438 | <section id='unsetting-variables'> | ||
| 439 | <title>Unseting variables</title> | ||
| 440 | |||
| 441 | <para> | ||
| 442 | It is possible to completely remove a variable or a variable flag | ||
| 443 | from BitBake's internal data dictionary by using the "unset" keyword. | ||
| 444 | Here is an example: | ||
| 445 | <literallayout class='monospaced'> | ||
| 446 | unset DATE | ||
| 447 | unset do_fetch[noexec] | ||
| 448 | </literallayout> | ||
| 449 | These two statements remove the <filename>DATE</filename> and the | ||
| 450 | <filename>do_fetch[noexec]</filename> flag. | ||
| 451 | </para> | ||
| 452 | |||
| 453 | </section> | ||
| 454 | |||
| 438 | <section id='providing-pathnames'> | 455 | <section id='providing-pathnames'> |
| 439 | <title>Providing Pathnames</title> | 456 | <title>Providing Pathnames</title> |
| 440 | 457 | ||
diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index 0fc3a9e7a4..d7185b1664 100644 --- a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py | |||
| @@ -69,6 +69,33 @@ class ExportNode(AstNode): | |||
| 69 | def eval(self, data): | 69 | def eval(self, data): |
| 70 | data.setVarFlag(self.var, "export", 1, op = 'exported') | 70 | data.setVarFlag(self.var, "export", 1, op = 'exported') |
| 71 | 71 | ||
| 72 | class UnsetNode(AstNode): | ||
| 73 | def __init__(self, filename, lineno, var): | ||
| 74 | AstNode.__init__(self, filename, lineno) | ||
| 75 | self.var = var | ||
| 76 | |||
| 77 | def eval(self, data): | ||
| 78 | loginfo = { | ||
| 79 | 'variable': self.var, | ||
| 80 | 'file': self.filename, | ||
| 81 | 'line': self.lineno, | ||
| 82 | } | ||
| 83 | data.delVar(self.var,**loginfo) | ||
| 84 | |||
| 85 | class UnsetFlagNode(AstNode): | ||
| 86 | def __init__(self, filename, lineno, var, flag): | ||
| 87 | AstNode.__init__(self, filename, lineno) | ||
| 88 | self.var = var | ||
| 89 | self.flag = flag | ||
| 90 | |||
| 91 | def eval(self, data): | ||
| 92 | loginfo = { | ||
| 93 | 'variable': self.var, | ||
| 94 | 'file': self.filename, | ||
| 95 | 'line': self.lineno, | ||
| 96 | } | ||
| 97 | data.delVarFlag(self.var, self.flag, **loginfo) | ||
| 98 | |||
| 72 | class DataNode(AstNode): | 99 | class DataNode(AstNode): |
| 73 | """ | 100 | """ |
| 74 | Various data related updates. For the sake of sanity | 101 | Various data related updates. For the sake of sanity |
| @@ -270,6 +297,12 @@ def handleInclude(statements, filename, lineno, m, force): | |||
| 270 | def handleExport(statements, filename, lineno, m): | 297 | def handleExport(statements, filename, lineno, m): |
| 271 | statements.append(ExportNode(filename, lineno, m.group(1))) | 298 | statements.append(ExportNode(filename, lineno, m.group(1))) |
| 272 | 299 | ||
| 300 | def handleUnset(statements, filename, lineno, m): | ||
| 301 | statements.append(UnsetNode(filename, lineno, m.group(1))) | ||
| 302 | |||
| 303 | def handleUnsetFlag(statements, filename, lineno, m): | ||
| 304 | statements.append(UnsetFlagNode(filename, lineno, m.group(1), m.group(2))) | ||
| 305 | |||
| 273 | def handleData(statements, filename, lineno, groupd): | 306 | def handleData(statements, filename, lineno, groupd): |
| 274 | statements.append(DataNode(filename, lineno, groupd)) | 307 | statements.append(DataNode(filename, lineno, groupd)) |
| 275 | 308 | ||
diff --git a/bitbake/lib/bb/parse/parse_py/ConfHandler.py b/bitbake/lib/bb/parse/parse_py/ConfHandler.py index b9712929f3..875250de40 100644 --- a/bitbake/lib/bb/parse/parse_py/ConfHandler.py +++ b/bitbake/lib/bb/parse/parse_py/ConfHandler.py | |||
| @@ -57,6 +57,8 @@ __config_regexp__ = re.compile( r""" | |||
| 57 | __include_regexp__ = re.compile( r"include\s+(.+)" ) | 57 | __include_regexp__ = re.compile( r"include\s+(.+)" ) |
| 58 | __require_regexp__ = re.compile( r"require\s+(.+)" ) | 58 | __require_regexp__ = re.compile( r"require\s+(.+)" ) |
| 59 | __export_regexp__ = re.compile( r"export\s+([a-zA-Z0-9\-_+.${}/]+)$" ) | 59 | __export_regexp__ = re.compile( r"export\s+([a-zA-Z0-9\-_+.${}/]+)$" ) |
| 60 | __unset_regexp__ = re.compile( r"unset\s+([a-zA-Z0-9\-_+.${}/]+)$" ) | ||
| 61 | __unset_flag_regexp__ = re.compile( r"unset\s+([a-zA-Z0-9\-_+.${}/]+)\[([a-zA-Z0-9\-_+.${}/]+)\]$" ) | ||
| 60 | 62 | ||
| 61 | def init(data): | 63 | def init(data): |
| 62 | topdir = data.getVar('TOPDIR', False) | 64 | topdir = data.getVar('TOPDIR', False) |
| @@ -185,6 +187,16 @@ def feeder(lineno, s, fn, statements): | |||
| 185 | ast.handleExport(statements, fn, lineno, m) | 187 | ast.handleExport(statements, fn, lineno, m) |
| 186 | return | 188 | return |
| 187 | 189 | ||
| 190 | m = __unset_regexp__.match(s) | ||
| 191 | if m: | ||
| 192 | ast.handleUnset(statements, fn, lineno, m) | ||
| 193 | return | ||
| 194 | |||
| 195 | m = __unset_flag_regexp__.match(s) | ||
| 196 | if m: | ||
| 197 | ast.handleUnsetFlag(statements, fn, lineno, m) | ||
| 198 | return | ||
| 199 | |||
| 188 | raise ParseError("unparsed line: '%s'" % s, fn, lineno); | 200 | raise ParseError("unparsed line: '%s'" % s, fn, lineno); |
| 189 | 201 | ||
| 190 | # Add us to the handlers list | 202 | # Add us to the handlers list |
diff --git a/bitbake/lib/bb/tests/parse.py b/bitbake/lib/bb/tests/parse.py index c296db2013..0b2706af02 100644 --- a/bitbake/lib/bb/tests/parse.py +++ b/bitbake/lib/bb/tests/parse.py | |||
| @@ -68,6 +68,23 @@ C = "3" | |||
| 68 | with self.assertRaises(bb.parse.ParseError): | 68 | with self.assertRaises(bb.parse.ParseError): |
| 69 | d = bb.parse.handle(f.name, self.d)[''] | 69 | d = bb.parse.handle(f.name, self.d)[''] |
| 70 | 70 | ||
| 71 | unsettest = """ | ||
| 72 | A = "1" | ||
| 73 | B = "2" | ||
| 74 | B[flag] = "3" | ||
| 75 | |||
| 76 | unset A | ||
| 77 | unset B[flag] | ||
| 78 | """ | ||
| 79 | |||
| 80 | def test_parse_unset(self): | ||
| 81 | f = self.parsehelper(self.unsettest) | ||
| 82 | d = bb.parse.handle(f.name, self.d)[''] | ||
| 83 | self.assertEqual(d.getVar("A", True), None) | ||
| 84 | self.assertEqual(d.getVarFlag("A","flag", True), None) | ||
| 85 | self.assertEqual(d.getVar("B", True), "2") | ||
| 86 | |||
| 87 | |||
| 71 | overridetest = """ | 88 | overridetest = """ |
| 72 | RRECOMMENDS_${PN} = "a" | 89 | RRECOMMENDS_${PN} = "a" |
| 73 | RRECOMMENDS_${PN}_libc = "b" | 90 | RRECOMMENDS_${PN}_libc = "b" |
