build: Add support for custom userspace toolchain

When using build_with_bazel.py, users may want to build extra
userspace cc_binary targets with a different toolchain.

Enable this capability by adding the --userspace_cross_toolchain
option.

Change-Id: I9eaaaa71ba483132fb68124e713a05d2918f9aa1
Signed-off-by: John Moon <quic_johmoo@quicinc.com>
This commit is contained in:
John Moon 2022-10-27 14:53:00 -07:00
parent 2b0465b6c3
commit 8e5c9866a0

View File

@ -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!")