diff --git a/envsetup.sh b/envsetup.sh index 9d27c9d178f7..af6695fb9429 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2054,6 +2054,11 @@ function avbtool() { "$ANDROID_SOONG_HOST_OUT"/bin/avbtool $@ } +function overrideflags() { + local T="$(gettop)" + (\cd "${T}" && build/make/tools/overrideflags.sh "$@") +} + validate_current_shell set_global_paths source_vendorsetup diff --git a/tools/aconfig/overrideflags/overrideflags.py b/tools/aconfig/overrideflags/overrideflags.py new file mode 100644 index 000000000000..480af08d8e55 --- /dev/null +++ b/tools/aconfig/overrideflags/overrideflags.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +# +# 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. +"""Create Aconfig value building rules. + +This script will help to create Aconfig flag value building rules. It will +parse necessary information in the value file to create the building rules, but +it will not validate the value file. The validation will defer to the building +system. +""" + +import argparse +import pathlib +import re +import sys + + +_VALUE_LIST_TEMPLATE: str = """ +VALUE_LIST_LIST = [{}] +""" + +_ACONFIG_VALUES_TEMPLATE: str = """ +aconfig_values {{ + name: "aconfig-local-{}", + package: "{}", + srcs: [ + "{}", + ] +}} +""" + +_PACKAGE_REGEX = re.compile(r"^package\:\s*\"([\w\d\.]+)\"") +_ANDROID_BP_FILE_NAME = r"Android.bp" + + +def _parse_packages(file: pathlib.Path) -> set[str]: + packages = set() + with open(file) as f: + for line in f: + line = line.strip() + package_match = _PACKAGE_REGEX.match(line) + if package_match is None: + continue + package_name = package_match.group(1) + packages.add(package_name) + + return packages + + +def _create_android_bp(packages: set[str], file_name: str) -> str: + android_bp = "" + value_list = ",\n ".join(map(lambda n: "aconfig-local-" + n, packages)) + if value_list: + value_list = "\n " + value_list + "\n" + android_bp += _VALUE_LIST_TEMPLATE.format(value_list) + "\n" + + for package in packages: + android_bp += _ACONFIG_VALUES_TEMPLATE.format(package, package, file_name) + android_bp += "\n" + + return android_bp + + +def _write_android_bp(new_android_bp: str, out: pathlib.Path) -> None: + if not out.is_dir(): + out.mkdir(parents=True, exist_ok=True) + + output = out.joinpath(_ANDROID_BP_FILE_NAME) + with open(output, "w+") as f: + f.write(new_android_bp) + + +def main(args): + """Program entry point.""" + args_parser = argparse.ArgumentParser() + args_parser.add_argument( + "--overrides", + required=True, + help="The path to override file.", + ) + args_parser.add_argument( + "--out", + required=True, + help="The path to output directory.", + ) + + args = args_parser.parse_args(args) + file = pathlib.Path(args.overrides) + out = pathlib.Path(args.out) + if not file.is_file(): + raise FileNotFoundError(f"File '{file}' is not found") + + packages = _parse_packages(file) + new_android_bp = _create_android_bp(packages, file.name) + _write_android_bp(new_android_bp, out) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/tools/overrideflags.sh b/tools/overrideflags.sh new file mode 100755 index 000000000000..ff311dd9da44 --- /dev/null +++ b/tools/overrideflags.sh @@ -0,0 +1,99 @@ +#!/bin/bash -e +# 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. + + +source $(cd $(dirname $BASH_SOURCE) &> /dev/null && pwd)/../../make/shell_utils.sh +require_top + +function print_help() { + echo -e "overrideflags is used to set default value for local build." + echo -e "\nOptions:" + echo -e "\t--release-config \tPath to release configuration directory. Required" + echo -e "\t--no-edit \tIf present, skip editing flag value file." + echo -e "\t-h/--help \tShow this help." +} + +function main() { + while (($# > 0)); do + case $1 in + --release-config) + if [[ $# -le 1 ]]; then + echo "--release-config requires a path" + return 1 + fi + local release_config_dir="$2" + shift 2 + ;; + --no-edit) + local no_edit="true" + shift 1 + ;; + -h|--help) + print_help + return + ;; + *) + echo "$1 is unrecognized" + print_help + return 1 + ;; + esac + done + + + + case $(uname -s) in + Darwin) + local host_arch=darwin-x86 + ;; + Linux) + local host_arch=linux-x86 + ;; + *) + >&2 echo Unknown host $(uname -s) + return + ;; + esac + + if [[ -z "${release_config_dir}" ]]; then + echo "Please provide release configuration path by --release-config" + exit 1 + elif [ ! -d "${release_config_dir}" ]; then + echo "${release_config_dir} is an invalid directory" + exit 1 + fi + local T="$(gettop)" + local aconfig_dir="${T}"/build/make/tools/aconfig/ + local overrideflag_py="${aconfig_dir}"/overrideflags/overrideflags.py + local overridefile="${release_config_dir}/aconfig/override_values.textproto" + + # Edit override file + if [[ -z "${no_edit}" ]]; then + editor="${EDITOR:-$(which vim)}" + + eval "${editor} ${overridefile}" + if [ $? -ne 0 ]; then + echo "Fail to set override values" + return 1 + fi + fi + + ${T}/prebuilts/build-tools/${host_arch}/bin/py3-cmd -u "${overrideflag_py}" \ + --overrides "${overridefile}" \ + --out "${release_config_dir}/aconfig" +} + + +main "$@"