# Copyright Materialize, Inc. and contributors. All rights reserved. # # Use of this software is governed by the Business Source License # included in the LICENSE file at the root of this repository. # # As of the Change Date specified in that file, in accordance with # the Business Source License, use of this software will be governed # by the Apache License, Version 2.0. # # xcompile.py — builds Materialize-specific Docker images. import argparse import os import sys from materialize import mzbuild, spawn, xcompile def main() -> int: parser = argparse.ArgumentParser( prog="xcompile", description="Facilitates cross compilation of Rust binaries.", epilog="For additional help on a subcommand, run:\n\n %(prog)s -h", ) parser.add_argument( "--arch", default=mzbuild.Arch.X86_64, help="the CPU architecture to build for", type=mzbuild.Arch, choices=mzbuild.Arch, ) parser.add_argument( "--channel", default="nightly" if os.getenv("CI_SANITIZER", "none") else None, help="Rust compiler channel to use", ) subparsers = parser.add_subparsers( dest="command", metavar="", required=True ) cargo_parser = subparsers.add_parser( "cargo", help="run a cross-compiling cargo command" ) cargo_parser.add_argument( "--rustflags", action="append", default=[], help="override the default flags to the Rust compiler", ) cargo_parser.add_argument("subcommand", help="the cargo subcommand to invoke") cargo_parser.add_argument( "subargs", nargs=argparse.REMAINDER, help="the arguments to pass to cargo" ) tool_parser = subparsers.add_parser( "tool", help="run a cross-compiling binutils tool" ) tool_parser.add_argument( "--name-target-prefix", default=True, action=argparse.BooleanOptionalAction, help="whether the tool name should be prefixed with the target name", ) tool_parser.add_argument("tool", metavar="TOOL", help="the binutils tool to invoke") tool_parser.add_argument( "subargs", nargs=argparse.REMAINDER, help="the arguments to pass to the tool" ) args = parser.parse_args() if args.command == "cargo": spawn.runv( [ *xcompile.cargo( arch=args.arch, channel=args.channel, subcommand=args.subcommand, rustflags=args.rustflags, ), *args.subargs, ] ) elif args.command == "tool": spawn.runv( [ *xcompile.tool( args.arch, args.tool, prefix_name=args.name_target_prefix ), *args.subargs, ] ) else: raise RuntimeError("unreachable") return 0 if __name__ == "__main__": sys.exit(main())