mirror of
https://github.com/openai/codex.git
synced 2026-05-20 19:23:21 +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
99 lines
2.5 KiB
Python
99 lines
2.5 KiB
Python
"""Supported package targets and default binary discovery."""
|
|
|
|
import stat
|
|
from dataclasses import dataclass
|
|
from pathlib import Path
|
|
|
|
|
|
SCRIPT_DIR = Path(__file__).resolve().parents[1]
|
|
REPO_ROOT = SCRIPT_DIR.parent
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class TargetSpec:
|
|
target: str
|
|
is_windows: bool
|
|
is_linux: bool
|
|
dotslash_platform: str
|
|
|
|
@property
|
|
def exe_suffix(self) -> str:
|
|
return ".exe" if self.is_windows else ""
|
|
|
|
@property
|
|
def codex_name(self) -> str:
|
|
return f"codex{self.exe_suffix}"
|
|
|
|
@property
|
|
def rg_name(self) -> str:
|
|
return f"rg{self.exe_suffix}"
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class PackageInputs:
|
|
codex_bin: Path
|
|
rg_bin: Path
|
|
bwrap_bin: Path | None
|
|
codex_command_runner_bin: Path | None
|
|
codex_windows_sandbox_setup_bin: Path | None
|
|
|
|
|
|
TARGET_SPECS: dict[str, TargetSpec] = {
|
|
"x86_64-unknown-linux-musl": TargetSpec(
|
|
target="x86_64-unknown-linux-musl",
|
|
is_windows=False,
|
|
is_linux=True,
|
|
dotslash_platform="linux-x86_64",
|
|
),
|
|
"aarch64-unknown-linux-musl": TargetSpec(
|
|
target="aarch64-unknown-linux-musl",
|
|
is_windows=False,
|
|
is_linux=True,
|
|
dotslash_platform="linux-aarch64",
|
|
),
|
|
"x86_64-apple-darwin": TargetSpec(
|
|
target="x86_64-apple-darwin",
|
|
is_windows=False,
|
|
is_linux=False,
|
|
dotslash_platform="macos-x86_64",
|
|
),
|
|
"aarch64-apple-darwin": TargetSpec(
|
|
target="aarch64-apple-darwin",
|
|
is_windows=False,
|
|
is_linux=False,
|
|
dotslash_platform="macos-aarch64",
|
|
),
|
|
"x86_64-pc-windows-msvc": TargetSpec(
|
|
target="x86_64-pc-windows-msvc",
|
|
is_windows=True,
|
|
is_linux=False,
|
|
dotslash_platform="windows-x86_64",
|
|
),
|
|
"aarch64-pc-windows-msvc": TargetSpec(
|
|
target="aarch64-pc-windows-msvc",
|
|
is_windows=True,
|
|
is_linux=False,
|
|
dotslash_platform="windows-aarch64",
|
|
),
|
|
}
|
|
|
|
|
|
def resolve_input_path(
|
|
explicit_path: Path | None,
|
|
description: str,
|
|
flag_name: str,
|
|
) -> Path:
|
|
if explicit_path is not None:
|
|
path = explicit_path.resolve()
|
|
if not path.is_file():
|
|
raise RuntimeError(f"{description} does not exist: {path}")
|
|
if not is_executable(path):
|
|
raise RuntimeError(f"{description} is not executable: {path}")
|
|
return path
|
|
|
|
raise RuntimeError(f"Must specify {flag_name} for {description}.")
|
|
|
|
|
|
def is_executable(path: Path) -> bool:
|
|
return bool(path.stat().st_mode & (stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH))
|