diff --git a/build_with_bazel.py b/build_with_bazel.py index 3fb8c59437b1..0855167752aa 100755 --- a/build_with_bazel.py +++ b/build_with_bazel.py @@ -9,11 +9,23 @@ import sys from subprocess import Popen BAZEL_BIN = "./tools/bazel" +CPU = "aarch64" +HOST_CROSSTOOL = "@bazel_tools//tools/cpp:toolchain" -def bazel(bazel_subcommand, targets, extra_options=[]): +def get_cross_cli_opts(toolchain): + return [ + "--cpu={}".format(CPU), + "--crosstool_top={}".format(toolchain), + "--host_crosstool_top={}".format(HOST_CROSSTOOL), + ] + + +def bazel(bazel_subcommand, targets, extra_options=[], us_cross_toolchain=None): cmdline = [BAZEL_BIN, bazel_subcommand] cmdline.extend(extra_options) + if us_cross_toolchain: + cmdline.extend(get_cross_cli_opts(us_cross_toolchain)) cmdline.extend(targets) cmdline_str = " ".join(cmdline) try: @@ -27,19 +39,22 @@ def bazel(bazel_subcommand, targets, extra_options=[]): sys.exit(1) -def build_targets(targets, user_opts=[]): - bazel("build", targets, user_opts) +def build_targets(targets, user_opts=[], us_cross_toolchain=None): + if not targets: + logging.warning("no targets to build") + bazel("build", targets, user_opts, us_cross_toolchain) -def run_targets(targets, user_opts=[]): +def run_targets(targets, user_opts=[], us_cross_toolchain=None): # bazel cannot _run_ multiple targets at once, so run them in serial for target in targets: - bazel("run", [target], user_opts) + bazel("run", [target], user_opts, us_cross_toolchain) def build( target_list, user_opts=[], + us_cross_toolchain=None, extra_targets=[], skip_kernel=False, skip_abl=False, @@ -49,9 +64,12 @@ def build( 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]) + extra_msm_targets.extend( + ["//msm-kernel:{}_{}_{}".format(t, v, extra) for t, v in target_list] + ) targets_to_build = [] + host_targets_to_build = [] for t in msm_targets: logging.info( "skipping kernel build" @@ -61,7 +79,7 @@ def build( ) logging.info( "skipping host tools build" - ) if skip_host_tools else targets_to_build.append(t + "_dtc") + ) if skip_host_tools else host_targets_to_build.append(t + "_dtc") targets_to_build += extra_msm_targets @@ -69,8 +87,13 @@ def 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) + logging.info("Building {} targets...".format(CPU)) + build_targets(targets_to_build, user_opts, us_cross_toolchain) + run_targets([t + "_dist" for t in targets_to_build], user_opts, us_cross_toolchain) + + logging.info("Building host targets...") + build_targets(host_targets_to_build, user_opts) + run_targets([t + "_dist" for t in host_targets_to_build], user_opts) def main(): @@ -85,6 +108,25 @@ def main(): required=True, help="Target and variant to build (e.g. -t kalama gki). May be passed multiple times.", ) + parser.add_argument( + "-u", + "--userspace_cross_toolchain", + default=None, + metavar="TOOLCHAIN", + help="Set a Bazel toolchain for cross-compiled userspace programs", + ) + parser.add_argument( + "-e", + "--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( "--skip_kernel", action="store_true", @@ -100,17 +142,6 @@ def main(): 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)", @@ -127,7 +158,13 @@ def main(): extra_targets = list(args.extra_build_target) - build(args.target, user_opts, extra_targets, **vars(args)) + build( + args.target, + user_opts, + args.userspace_cross_toolchain, + extra_targets, + **vars(args) + ) logging.info("Build completed successfully!")