build-scripts/rust.py (94 lines of code) (raw):

from functools import cache from os import environ import platform import shutil from typing import Dict, List, Optional from util import info, isDarwin, isLinux, isMusl, run_cmd_output, warn, Variant from datetime import datetime, timezone @cache def build_hash() -> str: if environ.get("CODEBUILD_RESOLVED_SOURCE_VERSION") is not None: build_hash = environ["CODEBUILD_RESOLVED_SOURCE_VERSION"] else: try: build_hash = run_cmd_output(["git", "rev-parse", "HEAD"]).strip() except Exception as e: warn("Failed to get build hash:", e) build_hash = "unknown" info("build_hash =", build_hash) return build_hash @cache def build_datetime() -> str: build_time = datetime.now(timezone.utc).isoformat() info("build_time =", build_time) return build_time @cache def skip_fish_tests() -> bool: skip_fish_tests = shutil.which("fish") is None if skip_fish_tests: warn("Skipping fish tests") return skip_fish_tests @cache def cargo_cmd_name() -> str: if isMusl(): return "cross" else: return "cargo" def rust_env(release: bool, variant: Optional[Variant] = None, linker=None) -> Dict[str, str]: env = { "CARGO_NET_GIT_FETCH_WITH_CLI": "true", } if release: rustflags = [ "-C force-frame-pointers=yes", ] if linker: rustflags.append(f"-C link-arg=-fuse-ld={linker}") if isLinux(): rustflags.append("-C link-arg=-Wl,--compress-debug-sections=zlib") env["CARGO_INCREMENTAL"] = "0" env["CARGO_PROFILE_RELEASE_LTO"] = "thin" env["RUSTFLAGS"] = " ".join(rustflags) if isDarwin(): env["MACOSX_DEPLOYMENT_TARGET"] = "10.13" env["AMAZON_Q_BUILD_TARGET_TRIPLE"] = get_target_triple() env["AMAZON_Q_BUILD_HASH"] = build_hash() env["AMAZON_Q_BUILD_DATETIME"] = build_datetime() if variant: env["AMAZON_Q_BUILD_VARIANT"] = variant.name # Test related env vars: env["Q_TELEMETRY_CLIENT_ID"] = "ffffffff-ffff-ffff-ffff-ffffffffffff" if skip_fish_tests(): env["AMAZON_Q_BUILD_SKIP_FISH_TESTS"] = "1" return env def rust_targets() -> List[str]: """ Returns the supported rust targets for the current environment. """ match platform.system(): case "Darwin": return ["x86_64-apple-darwin", "aarch64-apple-darwin"] case "Linux": return [get_target_triple()] case other: raise ValueError(f"Unsupported platform {other}") @cache def get_target_triple() -> str: """ Returns the target triple to be built and defined in the application manifest. """ env = environ.get("AMAZON_Q_BUILD_TARGET_TRIPLE") if env: return env elif isDarwin(): return "universal-apple-darwin" else: match (platform.machine(), isMusl()): case ("x86_64", True): return "x86_64-unknown-linux-musl" case ("x86_64", False): return "x86_64-unknown-linux-gnu" case ("aarch64", True): return "aarch64-unknown-linux-musl" case ("aarch64", False): return "aarch64-unknown-linux-gnu" case (other, _): raise ValueError(f"Unsupported machine {other}") if __name__ == "__main__": build_hash() build_datetime() info("rust_targets =", rust_targets()) info("get_target_triple =", get_target_triple())