[PATCH 04/12] build: Improve value substitution
Sebastian Huber
sebastian.huber at embedded-brains.de
Wed Jun 29 06:30:40 UTC 2022
The waf build system uses lists for tool flags. The build items may use
variable substitution. Add the ability to use the variable substitution in
lists. For example:
MORE_FLAGS = ['-more', '-flags']
flags:
- -some-flag
- ${MORE_FLAGS}
Before this change, the ${MORE_FLAGS} was substituted to "-more -flags". This
would be passed by waf as a single command line argument to the tool.
After this change, the ${MORE_FLAGS} list extends the flags list:
flags = ['-some-flag', '-more', '-flags']
This list extension is performed if a list element consists of exactly one
variable.
Update #4670.
---
wscript | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/wscript b/wscript
index 731d1402ff..6ad230aca5 100755
--- a/wscript
+++ b/wscript
@@ -115,6 +115,9 @@ class Template(string.Template):
idpattern = "[_A-Za-z][_A-Za-z0-9:#]*"
+_VAR_PATTERN = re.compile("\$\{?(" + Template.idpattern + ")\}?$")
+
+
def _is_enabled_op_and(enabled, enabled_by):
for next_enabled_by in enabled_by:
if not _is_enabled(enabled, next_enabled_by):
@@ -249,18 +252,22 @@ class Item(object):
)
)
if isinstance(value, list):
- return [self.substitute(ctx, subvalue) for subvalue in value]
+ more = []
+ for item in value:
+ if isinstance(item, str):
+ m = _VAR_PATTERN.match(item)
+ else:
+ m = None
+ if m:
+ more.extend(ctx.env[m.group(1).strip("{}")])
+ else:
+ more.append(self.substitute(ctx, item))
+ return more
return value
def get(self, ctx, name):
return self.substitute(ctx, self.data[name])
- def get_values(self, ctx, name):
- more = []
- for value in self.data[name]:
- more.extend(self.substitute(ctx, value).split())
- return more
-
def install_target(self, bld):
install_path = self.data["install-path"]
if install_path:
@@ -512,12 +519,12 @@ class GroupItem(Item):
def prepare_build(self, bld, bic):
return BuildItemContext(
- bic.includes + self.get_values(bld, "includes"),
+ bic.includes + self.substitute(bld, self.data["includes"]),
bic.cppflags,
bic.cflags,
bic.cxxflags,
self.data["use-before"] + bic.use + self.data["use-after"],
- bic.ldflags + self.get_values(bld, "ldflags"),
+ bic.ldflags + self.substitute(bld, self.data["ldflags"]),
bic.objects,
)
--
2.35.3
More information about the devel
mailing list