build: default Codex package target and output (#23541)

## Why

The package builder should be easy to run during local iteration.
Requiring callers to provide both a target triple and an output
directory every time makes the common host-package case more awkward
than necessary.

This PR keeps explicit overrides available, but makes the default
invocation useful: build for the current host platform and place the
package in a fresh temporary directory. Because a temp output path is
otherwise easy to lose, the builder continues to print the final package
directory path when it completes.

## What changed

- Makes `--target` optional and maps the host OS/architecture to
supported Codex package target triples.
- Uses GNU Linux target triples for Linux host defaults, while keeping
the musl targets available for release jobs that pass `--target`
explicitly.
- Makes `--package-dir` optional and creates a new `codex-package-*`
temp directory when omitted.
- Documents the new defaults in `scripts/codex_package/README.md`.

## Verification

- Compiled `scripts/build_codex_package.py` and
`scripts/codex_package/*.py` with `PYTHONDONTWRITEBYTECODE=1`.
- Ran `scripts/build_codex_package.py --help` from outside the repo.
- Verified Linux host detection maps `x86_64` and `aarch64` to GNU
target triples.
- Ran a fake-Cargo package build while omitting both `--target` and
`--package-dir`; verified the generated metadata target, expected
package files, and printed temp package path.
- Ran a fake-Cargo package build for `x86_64-unknown-linux-gnu` and
verified `codex`, `bwrap`, and `rg` are assembled into the package.
This commit is contained in:
Michael Bolin
2026-05-19 17:05:43 -07:00
committed by GitHub
parent c58c84d6ee
commit 79f044ed34
3 changed files with 72 additions and 7 deletions

View File

@@ -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,12 @@ 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 release target "
"for this host platform."
),
)
parser.add_argument(
"--version",
@@ -37,8 +42,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 +87,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,