diff options
-rw-r--r-- | bitbake/doc/manual/usermanual.xml | 8 | ||||
-rw-r--r-- | bitbake/lib/bb/parse/ast.py | 11 | ||||
-rw-r--r-- | bitbake/lib/bb/parse/parse_py/ConfHandler.py | 2 |
3 files changed, 19 insertions, 2 deletions
diff --git a/bitbake/doc/manual/usermanual.xml b/bitbake/doc/manual/usermanual.xml index c3403449f..450ac77d7 100644 --- a/bitbake/doc/manual/usermanual.xml +++ b/bitbake/doc/manual/usermanual.xml @@ -91,7 +91,13 @@ share common metadata between many packages.</para></listitem> <section> <title>Setting a default value (?=)</title> <para><screen><varname>A</varname> ?= "aval"</screen></para> - <para>If <varname>A</varname> is set before the above is called, it will retain it's previous value. If <varname>A</varname> is unset prior to the above call, <varname>A</varname> will be set to <literal>aval</literal>.</para> + <para>If <varname>A</varname> is set before the above is called, it will retain it's previous value. If <varname>A</varname> is unset prior to the above call, <varname>A</varname> will be set to <literal>aval</literal>. Note that this assignment is immediate, so if there are multiple ?= assignments to a single variable, the first of those will be used.</para> + </section> + <section> + <title>Setting a default value (??=)</title> + <para><screen><varname>A</varname> ??= "somevalue"</screen></para> + <para><screen><varname>A</varname> ??= "someothervalue"</screen></para> + <para>If <varname>A</varname> is set before the above, it will retain that value. If <varname>A</varname> is unset prior to the above, <varname>A</varname> will be set to <literal>someothervalue</literal>. This is a lazy version of ??=, in that the assignment does not occur until the end of the parsing process, so that the last, rather than the first, ??= assignment to a given variable will be used.</para> </section> <section> <title>Immediate variable expansion (:=)</title> diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index e0b795fa6..70a69b8d1 100644 --- a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py @@ -99,9 +99,15 @@ class DataNode(AstNode): val = "%s%s" % (groupd["value"], (self.getFunc(key, data) or "")) else: val = groupd["value"] + if 'flag' in groupd and groupd['flag'] != None: bb.msg.debug(3, bb.msg.domain.Parsing, "setVarFlag(%s, %s, %s, data)" % (key, groupd['flag'], val)) bb.data.setVarFlag(key, groupd['flag'], val, data) + elif groupd["lazyques"]: + assigned = bb.data.getVar("__lazy_assigned", data) or [] + assigned.append(key) + bb.data.setVar("__lazy_assigned", assigned, data) + bb.data.setVarFlag(key, "defaultval", val, data) else: bb.data.setVar(key, val, data) @@ -286,6 +292,11 @@ def handleInherit(statements, m): statements.append(InheritNode(m.group(1))) def finalise(fn, d): + for lazykey in bb.data.getVar("__lazy_assigned", d) or (): + if bb.data.getVar(lazykey, d) is None: + val = bb.data.getVarFlag(lazykey, "defaultval", d) + bb.data.setVar(lazykey, val, d) + bb.data.expandKeys(d) bb.data.update_data(d) anonqueue = bb.data.getVar("__anonqueue", d, 1) or [] diff --git a/bitbake/lib/bb/parse/parse_py/ConfHandler.py b/bitbake/lib/bb/parse/parse_py/ConfHandler.py index a1eaf317a..f4f85de24 100644 --- a/bitbake/lib/bb/parse/parse_py/ConfHandler.py +++ b/bitbake/lib/bb/parse/parse_py/ConfHandler.py @@ -28,7 +28,7 @@ import re, bb.data, os, sys from bb.parse import ParseError, resolve_file, ast #__config_regexp__ = re.compile( r"(?P<exp>export\s*)?(?P<var>[a-zA-Z0-9\-_+.${}]+)\s*(?P<colon>:)?(?P<ques>\?)?=\s*(?P<apo>['\"]?)(?P<value>.*)(?P=apo)$") -__config_regexp__ = re.compile( r"(?P<exp>export\s*)?(?P<var>[a-zA-Z0-9\-_+.${}/]+)(\[(?P<flag>[a-zA-Z0-9\-_+.]+)\])?\s*((?P<colon>:=)|(?P<ques>\?=)|(?P<append>\+=)|(?P<prepend>=\+)|(?P<predot>=\.)|(?P<postdot>\.=)|=)\s*(?P<apo>['\"]?)(?P<value>.*)(?P=apo)$") +__config_regexp__ = re.compile( r"(?P<exp>export\s*)?(?P<var>[a-zA-Z0-9\-_+.${}/]+)(\[(?P<flag>[a-zA-Z0-9\-_+.]+)\])?\s*((?P<colon>:=)|(?P<lazyques>\?\?=)|(?P<ques>\?=)|(?P<append>\+=)|(?P<prepend>=\+)|(?P<predot>=\.)|(?P<postdot>\.=)|=)\s*(?P<apo>['\"]?)(?P<value>.*)(?P=apo)$") __include_regexp__ = re.compile( r"include\s+(.+)" ) __require_regexp__ = re.compile( r"require\s+(.+)" ) __export_regexp__ = re.compile( r"export\s+(.+)" ) |