From 473718d3d81c92c467f35a99c9fc3b70f31ba7af Mon Sep 17 00:00:00 2001 From: John Moon Date: Fri, 9 Sep 2022 11:54:34 -0700 Subject: [PATCH] build: Add build_with_bazel.py The raw Bazel build/run commands are difficult to parse and users could easily miss building something. To help improve the UX and efficiency of the build across platforms/variants, let's add a top-level script for the kernel platform build. Change-Id: I16dfad6c90acc882123f6129c1bd02cb3d2131fc Signed-off-by: John Moon --- build_with_bazel.py | 136 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100755 build_with_bazel.py diff --git a/build_with_bazel.py b/build_with_bazel.py new file mode 100755 index 000000000000..3fb8c59437b1 --- /dev/null +++ b/build_with_bazel.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: GPL-2.0-only +# Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + +import argparse +import logging +import os +import sys +from subprocess import Popen + +BAZEL_BIN = "./tools/bazel" + + +def bazel(bazel_subcommand, targets, extra_options=[]): + cmdline = [BAZEL_BIN, bazel_subcommand] + cmdline.extend(extra_options) + cmdline.extend(targets) + cmdline_str = " ".join(cmdline) + try: + logging.debug('Running "%s"', cmdline_str) + build_proc = Popen(cmdline_str, shell=True) + build_proc.wait() + if build_proc.returncode != 0: + sys.exit(build_proc.returncode) + except Exception as e: + logging.error(e), + sys.exit(1) + + +def build_targets(targets, user_opts=[]): + bazel("build", targets, user_opts) + + +def run_targets(targets, user_opts=[]): + # bazel cannot _run_ multiple targets at once, so run them in serial + for target in targets: + bazel("run", [target], user_opts) + + +def build( + target_list, + user_opts=[], + extra_targets=[], + skip_kernel=False, + skip_abl=False, + skip_host_tools=False, + **ignored +): + msm_targets = ["//msm-kernel:{}_{}".format(t, v) for t, v in target_list] + extra_msm_targets = [] + for extra in extra_targets: + extra_msm_targets.extend(["//msm-kernel:{}_{}_{}".format(t, v, extra) for t, v in target_list]) + + targets_to_build = [] + for t in msm_targets: + logging.info( + "skipping kernel build" + ) if skip_kernel else targets_to_build.append(t) + logging.info("skipping ABL build") if skip_abl else targets_to_build.append( + t + "_abl" + ) + logging.info( + "skipping host tools build" + ) if skip_host_tools else targets_to_build.append(t + "_dtc") + + targets_to_build += extra_msm_targets + + if not targets_to_build: + logging.error("no targets to build") + sys.exit(1) + + build_targets(targets_to_build, user_opts) + run_targets([t + "_dist" for t in targets_to_build], user_opts) + + +def main(): + parser = argparse.ArgumentParser(description="Build kernel platform with Bazel") + + parser.add_argument( + "-t", + "--target", + metavar=("TARGET", "VARIANT"), + action="append", + nargs=2, + required=True, + help="Target and variant to build (e.g. -t kalama gki). May be passed multiple times.", + ) + parser.add_argument( + "--skip_kernel", + action="store_true", + help="Skip building the kernel (note: may still need to build kernel if building ABL or tests)", + ) + parser.add_argument( + "--skip_abl", + action="store_true", + help="Skip building the Android Boot Loader (ABL)", + ) + parser.add_argument( + "--skip_host_tools", + action="store_true", + help="Skip building host tools (DTC, etc.)", + ) + parser.add_argument( + "--extra_build_target", + metavar="BUILD_TARGET", + action="append", + default=[], + help=""" + Additional Bazel target to build and run dist. For example, "-t kalama gki --extra_target foo" + would run "bazel build //msm-kernel:kalama_gki_foo && bazel run //msms-kernel:kalama_gki_foo_dist". + May be passed multiple times. + """ + ) + parser.add_argument( + "--log", + help="Log level (debug, info, warning, error)", + default="debug", + choices=["debug", "info", "warning", "error"], + ) + + args, user_opts = parser.parse_known_args(sys.argv[1:]) + + logging.basicConfig( + level=getattr(logging, args.log.upper()), + format="[{}] %(levelname)s: %(message)s".format(os.path.basename(sys.argv[0])), + ) + + extra_targets = list(args.extra_build_target) + + build(args.target, user_opts, extra_targets, **vars(args)) + + logging.info("Build completed successfully!") + + +if __name__ == "__main__": + main()