Reapply "release_config: build flags can be lists"
Allow a build flag definition to indicate that its value should be the
concatentation of assignements, rather than the final assigned value. In
this case, the "default" value from the flag definition is always
present as the start of the list.
The initial use case for this is RELEASE_ACONFIG_VALUE_SETS, where we
need apply multiple definition files that should be processed to arrive
at the final value.
Bug: b/302593603, b/304814040, b/309477343
Test: manual
Change-Id: I58eb71f2ee6d8f08f11a432993f23157831ec93c
diff --git a/core/release_config.bzl b/core/release_config.bzl
index 0c08858..a29f3f2 100644
--- a/core/release_config.bzl
+++ b/core/release_config.bzl
@@ -55,6 +55,11 @@
},
"declared_in": {"type": "string"},
},
+ "optional_keys": {
+ "appends": {
+ "type": "bool",
+ },
+ },
},
}
@@ -75,17 +80,23 @@
},
}
-def flag(name, partitions, default):
+def flag(name, partitions, default, _kwmarker = (), appends = False):
"""Declare a flag.
Args:
name: name of the flag
partitions: the partitions where this should be recorded.
default: the default value of the flag.
+ _kwmarker: Used to detect argument misuse.
+ appends: Whether new values should be append (not replace) the old.
Returns:
A dictionary containing the flag declaration.
"""
+
+ # If specified, appends must be a keyword value.
+ if _kwmarker != ():
+ fail("Too many positional parameters")
if not partitions:
fail("At least 1 partition is required")
if not name.startswith("RELEASE_"):
@@ -105,6 +116,7 @@
"name": name,
"partitions": partitions,
"default": default,
+ "appends": appends,
}
def value(name, value):
@@ -153,10 +165,12 @@
# Validate flags
flag_names = []
+ flags_dict = {}
for flag in all_flags:
if flag["name"] in flag_names:
fail(flag["declared_in"] + ": Duplicate declaration of flag " + flag["name"])
flag_names.append(flag["name"])
+ flags_dict[flag["name"]] = flag
# Record which flags go on which partition
partitions = {}
@@ -170,13 +184,21 @@
else:
partitions.setdefault(partition, []).append(flag["name"])
- # Validate values
- # TODO(joeo): Disallow duplicate values after we've split AOSP and vendor flags.
+ # Generate final values.
+ # Only declared flags may have a value.
values = {}
for value in all_values:
- if value["name"] not in flag_names:
- fail(value["set_in"] + ": Value set for undeclared build flag: " + value["name"])
- values[value["name"]] = value
+ name = value["name"]
+ if name not in flag_names:
+ fail(value["set_in"] + ": Value set for undeclared build flag: " + name)
+ if flags_dict[name]["appends"]:
+ if name in values:
+ values[name]["value"] += " " + value["value"]
+ values[name]["set_in"] += " " + value["set_in"]
+ else:
+ values[name] = value
+ else:
+ values[name] = value
# Collect values
result = {