diff --git a/scripts/codex_package/README.md b/scripts/codex_package/README.md index 6eb45eef47..7c89df6198 100644 --- a/scripts/codex_package/README.md +++ b/scripts/codex_package/README.md @@ -22,6 +22,10 @@ The builder creates a canonical Codex package directory: The package directory is the primary artifact. Archive formats such as `.tar.gz`, `.tar.zst`, and `.zip` are serializations of that directory. +If `--target` is omitted, the builder uses the current host platform. If +`--package-dir` is omitted, the builder creates a new temporary directory and +prints its path after the package is built. + ## Source-built artifacts Artifacts built from this repository are always built by the package builder in diff --git a/scripts/codex_package/cli.py b/scripts/codex_package/cli.py index c80f50a1a0..126f50e8cc 100644 --- a/scripts/codex_package/cli.py +++ b/scripts/codex_package/cli.py @@ -1,6 +1,7 @@ """Command-line interface for building Codex package directories.""" import argparse +import tempfile from pathlib import Path from .archive import write_archive @@ -11,6 +12,7 @@ from .layout import validate_package_dir from .ripgrep import resolve_rg_bin from .targets import TARGET_SPECS from .targets import PackageInputs +from .targets import default_target def parse_args() -> argparse.Namespace: @@ -20,9 +22,9 @@ def parse_args() -> argparse.Namespace: ) parser.add_argument( "--target", - required=True, + default=argparse.SUPPRESS, choices=sorted(TARGET_SPECS), - help="Rust target triple for the package.", + help="Rust target triple for the package. Defaults to the host platform.", ) parser.add_argument( "--version", @@ -37,8 +39,11 @@ def parse_args() -> argparse.Namespace: parser.add_argument( "--package-dir", type=Path, - required=True, - help="Output directory to create as the package root.", + default=argparse.SUPPRESS, + help=( + "Output directory to create as the package root. Defaults to a new " + "temporary directory." + ), ) parser.add_argument( "--archive-output", @@ -79,8 +84,13 @@ def parse_args() -> argparse.Namespace: def main() -> int: args = parse_args() - spec = TARGET_SPECS[args.target] - package_dir = args.package_dir.resolve() + spec = TARGET_SPECS[getattr(args, "target", None) or default_target()] + package_dir_arg = getattr(args, "package_dir", None) + package_dir = ( + package_dir_arg.resolve() + if package_dir_arg is not None + else Path(tempfile.mkdtemp(prefix="codex-package-")).resolve() + ) source_outputs = build_source_binaries( spec, diff --git a/scripts/codex_package/targets.py b/scripts/codex_package/targets.py index 0cb964a4cc..d3d3470e06 100644 --- a/scripts/codex_package/targets.py +++ b/scripts/codex_package/targets.py @@ -1,5 +1,6 @@ """Supported package targets and default binary discovery.""" +import platform import stat from dataclasses import dataclass from pathlib import Path @@ -78,6 +79,29 @@ TARGET_SPECS: dict[str, TargetSpec] = { } +HOST_TARGETS: dict[tuple[str, str], str] = { + ("darwin", "aarch64"): "aarch64-apple-darwin", + ("darwin", "x86_64"): "x86_64-apple-darwin", + ("linux", "aarch64"): "aarch64-unknown-linux-musl", + ("linux", "x86_64"): "x86_64-unknown-linux-musl", + ("windows", "aarch64"): "aarch64-pc-windows-msvc", + ("windows", "x86_64"): "x86_64-pc-windows-msvc", +} + + +def default_target() -> str: + system = platform.system().lower() + machine = normalize_machine(platform.machine()) + target = HOST_TARGETS.get((system, machine)) + if target is None: + supported = ", ".join(sorted(TARGET_SPECS)) + raise RuntimeError( + f"Unsupported host platform {platform.system()}/{platform.machine()}. " + f"Pass --target explicitly. Supported targets: {supported}" + ) + return target + + def resolve_input_path( explicit_path: Path | None, description: str, @@ -96,3 +120,12 @@ def resolve_input_path( def is_executable(path: Path) -> bool: return bool(path.stat().st_mode & (stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)) + + +def normalize_machine(machine: str) -> str: + machine = machine.lower() + if machine in ("amd64", "x86_64"): + return "x86_64" + if machine in ("aarch64", "arm64"): + return "aarch64" + return machine