From bedbd46ece8d1285b5cd2ea07dc64b4875b479aa Mon Sep 17 00:00:00 2001 From: Jérémy Rosen Date: Tue, 16 Aug 2016 14:04:47 +0200 Subject: ast/ConfHandler: Add a syntax to clear variable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit unset VAR will clear variable VAR unset VAR[flag] will clear flag "flag" from var VAR Signed-off-by: Jérémy Rosen Signed-off-by: Richard Purdie --- .../bitbake-user-manual-metadata.xml | 17 +++++++++++ lib/bb/parse/ast.py | 33 ++++++++++++++++++++++ lib/bb/parse/parse_py/ConfHandler.py | 12 ++++++++ lib/bb/tests/parse.py | 17 +++++++++++ 4 files changed, 79 insertions(+) diff --git a/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml b/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml index 5df00050c..64f08157f 100644 --- a/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml +++ b/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml @@ -435,6 +435,23 @@ +
+ Unseting variables + + + It is possible to completely remove a variable or a variable flag + from BitBake's internal data dictionary by using the "unset" keyword. + Here is an example: + + unset DATE + unset do_fetch[noexec] + + These two statements remove the DATE and the + do_fetch[noexec] flag. + + +
+
Providing Pathnames diff --git a/lib/bb/parse/ast.py b/lib/bb/parse/ast.py index 0fc3a9e7a..d7185b166 100644 --- a/lib/bb/parse/ast.py +++ b/lib/bb/parse/ast.py @@ -69,6 +69,33 @@ class ExportNode(AstNode): def eval(self, data): data.setVarFlag(self.var, "export", 1, op = 'exported') +class UnsetNode(AstNode): + def __init__(self, filename, lineno, var): + AstNode.__init__(self, filename, lineno) + self.var = var + + def eval(self, data): + loginfo = { + 'variable': self.var, + 'file': self.filename, + 'line': self.lineno, + } + data.delVar(self.var,**loginfo) + +class UnsetFlagNode(AstNode): + def __init__(self, filename, lineno, var, flag): + AstNode.__init__(self, filename, lineno) + self.var = var + self.flag = flag + + def eval(self, data): + loginfo = { + 'variable': self.var, + 'file': self.filename, + 'line': self.lineno, + } + data.delVarFlag(self.var, self.flag, **loginfo) + class DataNode(AstNode): """ Various data related updates. For the sake of sanity @@ -270,6 +297,12 @@ def handleInclude(statements, filename, lineno, m, force): def handleExport(statements, filename, lineno, m): statements.append(ExportNode(filename, lineno, m.group(1))) +def handleUnset(statements, filename, lineno, m): + statements.append(UnsetNode(filename, lineno, m.group(1))) + +def handleUnsetFlag(statements, filename, lineno, m): + statements.append(UnsetFlagNode(filename, lineno, m.group(1), m.group(2))) + def handleData(statements, filename, lineno, groupd): statements.append(DataNode(filename, lineno, groupd)) diff --git a/lib/bb/parse/parse_py/ConfHandler.py b/lib/bb/parse/parse_py/ConfHandler.py index b9712929f..875250de4 100644 --- a/lib/bb/parse/parse_py/ConfHandler.py +++ b/lib/bb/parse/parse_py/ConfHandler.py @@ -57,6 +57,8 @@ __config_regexp__ = re.compile( r""" __include_regexp__ = re.compile( r"include\s+(.+)" ) __require_regexp__ = re.compile( r"require\s+(.+)" ) __export_regexp__ = re.compile( r"export\s+([a-zA-Z0-9\-_+.${}/]+)$" ) +__unset_regexp__ = re.compile( r"unset\s+([a-zA-Z0-9\-_+.${}/]+)$" ) +__unset_flag_regexp__ = re.compile( r"unset\s+([a-zA-Z0-9\-_+.${}/]+)\[([a-zA-Z0-9\-_+.${}/]+)\]$" ) def init(data): topdir = data.getVar('TOPDIR', False) @@ -185,6 +187,16 @@ def feeder(lineno, s, fn, statements): ast.handleExport(statements, fn, lineno, m) return + m = __unset_regexp__.match(s) + if m: + ast.handleUnset(statements, fn, lineno, m) + return + + m = __unset_flag_regexp__.match(s) + if m: + ast.handleUnsetFlag(statements, fn, lineno, m) + return + raise ParseError("unparsed line: '%s'" % s, fn, lineno); # Add us to the handlers list diff --git a/lib/bb/tests/parse.py b/lib/bb/tests/parse.py index c296db201..0b2706af0 100644 --- a/lib/bb/tests/parse.py +++ b/lib/bb/tests/parse.py @@ -68,6 +68,23 @@ C = "3" with self.assertRaises(bb.parse.ParseError): d = bb.parse.handle(f.name, self.d)[''] + unsettest = """ +A = "1" +B = "2" +B[flag] = "3" + +unset A +unset B[flag] +""" + + def test_parse_unset(self): + f = self.parsehelper(self.unsettest) + d = bb.parse.handle(f.name, self.d)[''] + self.assertEqual(d.getVar("A", True), None) + self.assertEqual(d.getVarFlag("A","flag", True), None) + self.assertEqual(d.getVar("B", True), "2") + + overridetest = """ RRECOMMENDS_${PN} = "a" RRECOMMENDS_${PN}_libc = "b" -- cgit 1.2.3-korg