Rename bzl files to scl
These files don't have anything to do with bazel, they just use starlark as a configuration language. Bazel recently introduced the scl file extension to use for this format, which doesn't have any bazel-specific symbols. Use that extension for our pure starlark files as well. Bug: 309686282 Test: Presubmits Change-Id: I7b08f342e7fb94405a52af0918ae6a7d542f3282
This commit is contained in:
@@ -1,224 +0,0 @@
|
||||
# Copyright (C) 2023 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
"""
|
||||
Export build flags (with values) to make.
|
||||
"""
|
||||
|
||||
load("//build/bazel/utils:schema_validation.bzl", "validate")
|
||||
|
||||
# Partitions that get build system flag summaries
|
||||
_flag_partitions = [
|
||||
"product",
|
||||
"system",
|
||||
"system_ext",
|
||||
"vendor",
|
||||
]
|
||||
|
||||
ALL = ["all"]
|
||||
PRODUCT = ["product"]
|
||||
SYSTEM = ["system"]
|
||||
SYSTEM_EXT = ["system_ext"]
|
||||
VENDOR = ["vendor"]
|
||||
|
||||
_valid_types = ["NoneType", "bool", "list", "string", "int"]
|
||||
|
||||
_all_flags_schema = {
|
||||
"type": "list",
|
||||
"of": {
|
||||
"type": "dict",
|
||||
"required_keys": {
|
||||
"name": {"type": "string"},
|
||||
"partitions": {
|
||||
"type": "list",
|
||||
"of": {
|
||||
"type": "string",
|
||||
"choices": _flag_partitions + ["all"],
|
||||
},
|
||||
"unique": True,
|
||||
},
|
||||
"default": {
|
||||
"or": [
|
||||
{"type": t}
|
||||
for t in _valid_types
|
||||
],
|
||||
},
|
||||
"declared_in": {"type": "string"},
|
||||
},
|
||||
"optional_keys": {
|
||||
"appends": {
|
||||
"type": "bool",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
_all_values_schema = {
|
||||
"type": "list",
|
||||
"of": {
|
||||
"type": "dict",
|
||||
"required_keys": {
|
||||
"name": {"type": "string"},
|
||||
"value": {
|
||||
"or": [
|
||||
{"type": t}
|
||||
for t in _valid_types
|
||||
],
|
||||
},
|
||||
"set_in": {"type": "string"},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
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_"):
|
||||
fail("Release flag names must start with RELEASE_")
|
||||
if " " in name or "\t" in name or "\n" in name:
|
||||
fail("Flag names must not contain whitespace: \"" + name + "\"")
|
||||
for partition in partitions:
|
||||
if partition == "all":
|
||||
if len(partitions) > 1:
|
||||
fail("\"all\" can't be combined with other partitions: " + str(partitions))
|
||||
elif partition not in _flag_partitions:
|
||||
fail("Invalid partition: " + partition + ", allowed partitions: " +
|
||||
str(_flag_partitions))
|
||||
if type(default) not in _valid_types:
|
||||
fail("Invalid type of default for flag \"" + name + "\" (" + type(default) + ")")
|
||||
return {
|
||||
"name": name,
|
||||
"partitions": partitions,
|
||||
"default": default,
|
||||
"appends": appends,
|
||||
}
|
||||
|
||||
def value(name, value):
|
||||
"""Define the flag value for a particular configuration.
|
||||
|
||||
Args:
|
||||
name: The name of the flag.
|
||||
value: The value for the flag.
|
||||
|
||||
Returns:
|
||||
A dictionary containing the name and value to be used.
|
||||
"""
|
||||
return {
|
||||
"name": name,
|
||||
"value": value,
|
||||
}
|
||||
|
||||
def _format_value(val):
|
||||
"""Format the starlark type correctly for make.
|
||||
|
||||
Args:
|
||||
val: The value to format
|
||||
|
||||
Returns:
|
||||
The value, formatted correctly for make.
|
||||
"""
|
||||
if type(val) == "NoneType":
|
||||
return ""
|
||||
elif type(val) == "bool":
|
||||
return "true" if val else ""
|
||||
else:
|
||||
return val
|
||||
|
||||
def release_config(all_flags, all_values):
|
||||
"""Return the make variables that should be set for this release config.
|
||||
|
||||
Args:
|
||||
all_flags: A list of flag objects (from flag() calls).
|
||||
all_values: A list of value objects (from value() calls).
|
||||
|
||||
Returns:
|
||||
A dictionary of {name: value} variables for make.
|
||||
"""
|
||||
validate(all_flags, _all_flags_schema)
|
||||
validate(all_values, _all_values_schema)
|
||||
|
||||
# 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 = {}
|
||||
for flag in all_flags:
|
||||
for partition in flag["partitions"]:
|
||||
if partition == "all":
|
||||
if len(flag["partitions"]) > 1:
|
||||
fail("\"all\" can't be combined with other partitions: " + str(flag["partitions"]))
|
||||
for partition in _flag_partitions:
|
||||
partitions.setdefault(partition, []).append(flag["name"])
|
||||
else:
|
||||
partitions.setdefault(partition, []).append(flag["name"])
|
||||
|
||||
# Generate final values.
|
||||
# Only declared flags may have a value.
|
||||
values = {}
|
||||
for value in all_values:
|
||||
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 = {
|
||||
"_ALL_RELEASE_FLAGS": sorted(flag_names),
|
||||
}
|
||||
for partition, names in partitions.items():
|
||||
result["_ALL_RELEASE_FLAGS.PARTITIONS." + partition] = names
|
||||
for flag in all_flags:
|
||||
if flag["name"] in values:
|
||||
val = values[flag["name"]]["value"]
|
||||
set_in = values[flag["name"]]["set_in"]
|
||||
else:
|
||||
val = flag["default"]
|
||||
set_in = flag["declared_in"]
|
||||
val = _format_value(val)
|
||||
result[flag["name"]] = val
|
||||
result["_ALL_RELEASE_FLAGS." + flag["name"] + ".PARTITIONS"] = flag["partitions"]
|
||||
result["_ALL_RELEASE_FLAGS." + flag["name"] + ".DEFAULT"] = _format_value(flag["default"])
|
||||
result["_ALL_RELEASE_FLAGS." + flag["name"] + ".VALUE"] = val
|
||||
result["_ALL_RELEASE_FLAGS." + flag["name"] + ".DECLARED_IN"] = flag["declared_in"]
|
||||
result["_ALL_RELEASE_FLAGS." + flag["name"] + ".SET_IN"] = set_in
|
||||
|
||||
return result
|
1
core/release_config.bzl
Symbolic link
1
core/release_config.bzl
Symbolic link
@@ -0,0 +1 @@
|
||||
release_config.scl
|
@@ -82,16 +82,6 @@ $(foreach f, $(config_map_files), \
|
||||
)
|
||||
FLAG_DECLARATION_FILES :=
|
||||
|
||||
# Make sure that the flag definitions are included for vendor/google builds.
|
||||
# This decouples the change in vendor/google/release/release_config_map.mk
|
||||
# from this logic change.
|
||||
# TODO: Remove this once the vendor/google FLAG_DECLARATION_FILES change is there.
|
||||
$(if $(wildcard vendor/google/release/release_config_map.mk),\
|
||||
$(if $(filter vendor/google/release/build_flags.bzl,$(_flag_declaration_files)),,\
|
||||
$(eval _flag_declaration_files := vendor/google/release/build_flags.bzl $(_flag_declaration_files)) \
|
||||
) \
|
||||
)
|
||||
|
||||
# If TARGET_RELEASE is set, fail if there is no matching release config
|
||||
# If it isn't set, no release config files will be included and all flags
|
||||
# will get their default values.
|
||||
|
224
core/release_config.scl
Normal file
224
core/release_config.scl
Normal file
@@ -0,0 +1,224 @@
|
||||
# Copyright (C) 2023 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
"""
|
||||
Export build flags (with values) to make.
|
||||
"""
|
||||
|
||||
load("//build/bazel/utils:schema_validation.scl", "validate")
|
||||
|
||||
# Partitions that get build system flag summaries
|
||||
_flag_partitions = [
|
||||
"product",
|
||||
"system",
|
||||
"system_ext",
|
||||
"vendor",
|
||||
]
|
||||
|
||||
ALL = ["all"]
|
||||
PRODUCT = ["product"]
|
||||
SYSTEM = ["system"]
|
||||
SYSTEM_EXT = ["system_ext"]
|
||||
VENDOR = ["vendor"]
|
||||
|
||||
_valid_types = ["NoneType", "bool", "list", "string", "int"]
|
||||
|
||||
_all_flags_schema = {
|
||||
"type": "list",
|
||||
"of": {
|
||||
"type": "dict",
|
||||
"required_keys": {
|
||||
"name": {"type": "string"},
|
||||
"partitions": {
|
||||
"type": "list",
|
||||
"of": {
|
||||
"type": "string",
|
||||
"choices": _flag_partitions + ["all"],
|
||||
},
|
||||
"unique": True,
|
||||
},
|
||||
"default": {
|
||||
"or": [
|
||||
{"type": t}
|
||||
for t in _valid_types
|
||||
],
|
||||
},
|
||||
"declared_in": {"type": "string"},
|
||||
},
|
||||
"optional_keys": {
|
||||
"appends": {
|
||||
"type": "bool",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
_all_values_schema = {
|
||||
"type": "list",
|
||||
"of": {
|
||||
"type": "dict",
|
||||
"required_keys": {
|
||||
"name": {"type": "string"},
|
||||
"value": {
|
||||
"or": [
|
||||
{"type": t}
|
||||
for t in _valid_types
|
||||
],
|
||||
},
|
||||
"set_in": {"type": "string"},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
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_"):
|
||||
fail("Release flag names must start with RELEASE_")
|
||||
if " " in name or "\t" in name or "\n" in name:
|
||||
fail("Flag names must not contain whitespace: \"" + name + "\"")
|
||||
for partition in partitions:
|
||||
if partition == "all":
|
||||
if len(partitions) > 1:
|
||||
fail("\"all\" can't be combined with other partitions: " + str(partitions))
|
||||
elif partition not in _flag_partitions:
|
||||
fail("Invalid partition: " + partition + ", allowed partitions: " +
|
||||
str(_flag_partitions))
|
||||
if type(default) not in _valid_types:
|
||||
fail("Invalid type of default for flag \"" + name + "\" (" + type(default) + ")")
|
||||
return {
|
||||
"name": name,
|
||||
"partitions": partitions,
|
||||
"default": default,
|
||||
"appends": appends,
|
||||
}
|
||||
|
||||
def value(name, value):
|
||||
"""Define the flag value for a particular configuration.
|
||||
|
||||
Args:
|
||||
name: The name of the flag.
|
||||
value: The value for the flag.
|
||||
|
||||
Returns:
|
||||
A dictionary containing the name and value to be used.
|
||||
"""
|
||||
return {
|
||||
"name": name,
|
||||
"value": value,
|
||||
}
|
||||
|
||||
def _format_value(val):
|
||||
"""Format the starlark type correctly for make.
|
||||
|
||||
Args:
|
||||
val: The value to format
|
||||
|
||||
Returns:
|
||||
The value, formatted correctly for make.
|
||||
"""
|
||||
if type(val) == "NoneType":
|
||||
return ""
|
||||
elif type(val) == "bool":
|
||||
return "true" if val else ""
|
||||
else:
|
||||
return val
|
||||
|
||||
def release_config(all_flags, all_values):
|
||||
"""Return the make variables that should be set for this release config.
|
||||
|
||||
Args:
|
||||
all_flags: A list of flag objects (from flag() calls).
|
||||
all_values: A list of value objects (from value() calls).
|
||||
|
||||
Returns:
|
||||
A dictionary of {name: value} variables for make.
|
||||
"""
|
||||
validate(all_flags, _all_flags_schema)
|
||||
validate(all_values, _all_values_schema)
|
||||
|
||||
# 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 = {}
|
||||
for flag in all_flags:
|
||||
for partition in flag["partitions"]:
|
||||
if partition == "all":
|
||||
if len(flag["partitions"]) > 1:
|
||||
fail("\"all\" can't be combined with other partitions: " + str(flag["partitions"]))
|
||||
for partition in _flag_partitions:
|
||||
partitions.setdefault(partition, []).append(flag["name"])
|
||||
else:
|
||||
partitions.setdefault(partition, []).append(flag["name"])
|
||||
|
||||
# Generate final values.
|
||||
# Only declared flags may have a value.
|
||||
values = {}
|
||||
for value in all_values:
|
||||
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 = {
|
||||
"_ALL_RELEASE_FLAGS": sorted(flag_names),
|
||||
}
|
||||
for partition, names in partitions.items():
|
||||
result["_ALL_RELEASE_FLAGS.PARTITIONS." + partition] = names
|
||||
for flag in all_flags:
|
||||
if flag["name"] in values:
|
||||
val = values[flag["name"]]["value"]
|
||||
set_in = values[flag["name"]]["set_in"]
|
||||
else:
|
||||
val = flag["default"]
|
||||
set_in = flag["declared_in"]
|
||||
val = _format_value(val)
|
||||
result[flag["name"]] = val
|
||||
result["_ALL_RELEASE_FLAGS." + flag["name"] + ".PARTITIONS"] = flag["partitions"]
|
||||
result["_ALL_RELEASE_FLAGS." + flag["name"] + ".DEFAULT"] = _format_value(flag["default"])
|
||||
result["_ALL_RELEASE_FLAGS." + flag["name"] + ".VALUE"] = val
|
||||
result["_ALL_RELEASE_FLAGS." + flag["name"] + ".DECLARED_IN"] = flag["declared_in"]
|
||||
result["_ALL_RELEASE_FLAGS." + flag["name"] + ".SET_IN"] = set_in
|
||||
|
||||
return result
|
Reference in New Issue
Block a user