mirror of
https://github.com/openai/codex.git
synced 2026-05-21 19:45:26 +00:00
## Why The Codex package builder should produce a complete package without requiring callers to pre-populate `rg` under `codex-cli/vendor` or have `dotslash` installed on `PATH`. The repo already tracks the authoritative DotSlash manifest in `codex-cli/bin/rg`, so the builder can read that metadata directly and fetch the correct ripgrep archive for the target it is packaging. ## What changed - Added `scripts/codex_package/ripgrep.py` to parse `codex-cli/bin/rg` after stripping the shebang, select the target platform entry, download the configured artifact, and verify the recorded size and SHA-256 digest. - Added a cache under `$TMPDIR/codex-package/<target>-rg` so verified archives can be reused without fetching again. - Extracted `rg`/`rg.exe` from `tar.gz` and `zip` artifacts into the package-builder cache, then copied that into `codex-path` through the existing package layout flow. - Kept `--rg-bin` as an explicit local override for offline tests and unusual local workflows. - Documented the default `rg` fetch/cache behavior in `scripts/codex_package/README.md`. ## Verification - Ran wrapper/module syntax compilation. - Ran `scripts/build_codex_package.py --help` from `/private/tmp`. - Ran a local manifest fetch test covering shebang-stripped manifest parsing, `tar.gz` extraction, `zip` extraction, size/SHA-256 verification, and cache reuse after deleting the original source archives. - Ran fake-cargo package/archive builds for macOS, Linux, and Windows target layouts with `--rg-bin`, including an assertion that generated tar archives contain no duplicate member names. --- [//]: # (BEGIN SAPLING FOOTER) Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/openai/codex/pull/23526). * #23541 * __->__ #23526
109 lines
3.3 KiB
Python
109 lines
3.3 KiB
Python
"""Command-line interface for building Codex package directories."""
|
|
|
|
import argparse
|
|
from pathlib import Path
|
|
|
|
from .archive import write_archive
|
|
from .cargo import build_source_binaries
|
|
from .layout import build_package_dir
|
|
from .layout import prepare_package_dir
|
|
from .layout import validate_package_dir
|
|
from .ripgrep import resolve_rg_bin
|
|
from .targets import TARGET_SPECS
|
|
from .targets import PackageInputs
|
|
|
|
|
|
def parse_args() -> argparse.Namespace:
|
|
parser = argparse.ArgumentParser(
|
|
description="Build a canonical Codex package directory and optional archive.",
|
|
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
|
)
|
|
parser.add_argument(
|
|
"--target",
|
|
required=True,
|
|
choices=sorted(TARGET_SPECS),
|
|
help="Rust target triple for the package.",
|
|
)
|
|
parser.add_argument(
|
|
"--version",
|
|
default="0.0.0-dev",
|
|
help="Codex version to record in codex-package.json.",
|
|
)
|
|
parser.add_argument(
|
|
"--variant",
|
|
default="codex",
|
|
help="Package variant to record in codex-package.json.",
|
|
)
|
|
parser.add_argument(
|
|
"--package-dir",
|
|
type=Path,
|
|
required=True,
|
|
help="Output directory to create as the package root.",
|
|
)
|
|
parser.add_argument(
|
|
"--archive-output",
|
|
type=Path,
|
|
help=(
|
|
"Optional archive output path. Supported suffixes: .tar.gz, .tgz, "
|
|
".tar.zst, .zip."
|
|
),
|
|
)
|
|
parser.add_argument(
|
|
"--force",
|
|
action="store_true",
|
|
help="Replace an existing package directory or archive output.",
|
|
)
|
|
parser.add_argument(
|
|
"--cargo",
|
|
default="cargo",
|
|
help="Cargo executable to use for source-built package artifacts.",
|
|
)
|
|
parser.add_argument(
|
|
"--cargo-profile",
|
|
default="dev-small",
|
|
help=(
|
|
"Cargo profile for source-built package artifacts. Use release for "
|
|
"release packages."
|
|
),
|
|
)
|
|
parser.add_argument(
|
|
"--rg-bin",
|
|
type=Path,
|
|
help=(
|
|
"Optional local ripgrep executable override instead of fetching from "
|
|
"codex-cli/bin/rg."
|
|
),
|
|
)
|
|
return parser.parse_args()
|
|
|
|
|
|
def main() -> int:
|
|
args = parse_args()
|
|
spec = TARGET_SPECS[args.target]
|
|
package_dir = args.package_dir.resolve()
|
|
|
|
source_outputs = build_source_binaries(
|
|
spec,
|
|
cargo=args.cargo,
|
|
profile=args.cargo_profile,
|
|
)
|
|
inputs = PackageInputs(
|
|
codex_bin=source_outputs.codex_bin,
|
|
rg_bin=resolve_rg_bin(spec, args.rg_bin),
|
|
bwrap_bin=source_outputs.bwrap_bin,
|
|
codex_command_runner_bin=source_outputs.codex_command_runner_bin,
|
|
codex_windows_sandbox_setup_bin=source_outputs.codex_windows_sandbox_setup_bin,
|
|
)
|
|
prepare_package_dir(package_dir, force=args.force)
|
|
build_package_dir(package_dir, args.version, args.variant, spec, inputs)
|
|
validate_package_dir(package_dir, spec)
|
|
|
|
archive_output = args.archive_output
|
|
if archive_output is not None:
|
|
archive_path = archive_output.resolve()
|
|
write_archive(package_dir, archive_path, force=args.force)
|
|
print(f"Built Codex package archive at {archive_path}")
|
|
|
|
print(f"Built Codex package directory at {package_dir}")
|
|
return 0
|