mirror of
https://github.com/openai/codex.git
synced 2026-10-20 17:38:45 +00:00
build: package and launch code mode host
This commit is contained in:
@@ -10,7 +10,8 @@ The builder creates a canonical Codex package directory:
|
||||
.
|
||||
├── codex-package.json
|
||||
├── bin
|
||||
│ └── <entrypoint>[.exe]
|
||||
│ ├── <entrypoint>[.exe]
|
||||
│ └── codex-code-mode-host[.exe]
|
||||
├── codex-resources
|
||||
│ ├── bwrap # Linux only
|
||||
│ ├── zsh/bin/zsh # supported Unix targets only
|
||||
@@ -40,6 +41,7 @@ grouped `cargo build` command per package when they are needed and no prebuilt
|
||||
override was provided:
|
||||
|
||||
- all targets: the selected entrypoint, unless `--entrypoint-bin` is provided
|
||||
- all targets: `codex-code-mode-host`, unless `--code-mode-host-bin` is provided
|
||||
- Linux targets: `bwrap`, unless `--bwrap-bin` is provided
|
||||
- Windows targets: `codex-command-runner` and `codex-windows-sandbox-setup`,
|
||||
unless the corresponding prebuilt helper flags are provided
|
||||
|
||||
@@ -17,6 +17,7 @@ CODEX_RS_ROOT = REPO_ROOT / "codex-rs"
|
||||
@dataclass(frozen=True)
|
||||
class SourceBuildOutputs:
|
||||
entrypoint_bin: Path
|
||||
code_mode_host_bin: Path
|
||||
bwrap_bin: Path | None
|
||||
codex_command_runner_bin: Path | None
|
||||
codex_windows_sandbox_setup_bin: Path | None
|
||||
@@ -29,6 +30,7 @@ def build_source_binaries(
|
||||
cargo: str,
|
||||
profile: str,
|
||||
entrypoint_bin: Path | None,
|
||||
code_mode_host_bin: Path | None,
|
||||
bwrap_bin: Path | None,
|
||||
codex_command_runner_bin: Path | None,
|
||||
codex_windows_sandbox_setup_bin: Path | None,
|
||||
@@ -43,6 +45,7 @@ def build_source_binaries(
|
||||
spec,
|
||||
variant,
|
||||
build_entrypoint=entrypoint_bin is None,
|
||||
build_code_mode_host=code_mode_host_bin is None,
|
||||
build_bwrap=spec.is_linux and bwrap_bin is None,
|
||||
build_codex_command_runner=spec.is_windows and codex_command_runner_bin is None,
|
||||
build_codex_windows_sandbox_setup=spec.is_windows
|
||||
@@ -61,7 +64,7 @@ def build_source_binaries(
|
||||
cmd.extend(["--bin", binary])
|
||||
|
||||
cargo_env = None
|
||||
if entrypoint_bin is None:
|
||||
if entrypoint_bin is None or code_mode_host_bin is None:
|
||||
codex_v8_env = resolve_codex_v8_cargo_env(spec)
|
||||
if codex_v8_env:
|
||||
cargo_env = {**os.environ, **codex_v8_env}
|
||||
@@ -80,6 +83,10 @@ def build_source_binaries(
|
||||
entrypoint_bin,
|
||||
output_dir / variant.entrypoint_name(spec),
|
||||
),
|
||||
code_mode_host_bin=resolve_output_path(
|
||||
code_mode_host_bin,
|
||||
output_dir / f"codex-code-mode-host{spec.exe_suffix}",
|
||||
),
|
||||
bwrap_bin=resolve_output_path(
|
||||
bwrap_bin,
|
||||
output_dir / "bwrap" if spec.is_linux else None,
|
||||
@@ -102,6 +109,7 @@ def source_binaries_for_target(
|
||||
variant: PackageVariant,
|
||||
*,
|
||||
build_entrypoint: bool,
|
||||
build_code_mode_host: bool,
|
||||
build_bwrap: bool,
|
||||
build_codex_command_runner: bool,
|
||||
build_codex_windows_sandbox_setup: bool,
|
||||
@@ -109,6 +117,8 @@ def source_binaries_for_target(
|
||||
binaries = []
|
||||
if build_entrypoint:
|
||||
binaries.append(variant.cargo_bin)
|
||||
if build_code_mode_host:
|
||||
binaries.append("codex-code-mode-host")
|
||||
if build_bwrap:
|
||||
binaries.append("bwrap")
|
||||
if build_codex_command_runner:
|
||||
@@ -174,6 +184,7 @@ def cargo_profile_dirname(profile: str) -> str:
|
||||
def validate_source_outputs(outputs: SourceBuildOutputs) -> None:
|
||||
for path in [
|
||||
outputs.entrypoint_bin,
|
||||
outputs.code_mode_host_bin,
|
||||
outputs.bwrap_bin,
|
||||
outputs.codex_command_runner_bin,
|
||||
outputs.codex_windows_sandbox_setup_bin,
|
||||
|
||||
@@ -82,6 +82,14 @@ def parse_args() -> argparse.Namespace:
|
||||
"variant. If omitted, the entrypoint is built with Cargo."
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
"--code-mode-host-bin",
|
||||
type=Path,
|
||||
help=(
|
||||
"Optional prebuilt codex-code-mode-host executable. If omitted, "
|
||||
"codex-code-mode-host is built with Cargo."
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
"--bwrap-bin",
|
||||
type=Path,
|
||||
@@ -140,6 +148,11 @@ def main() -> int:
|
||||
"prebuilt entrypoint executable",
|
||||
"--entrypoint-bin",
|
||||
),
|
||||
code_mode_host_bin=resolve_optional_input_path(
|
||||
args.code_mode_host_bin,
|
||||
"prebuilt code-mode host executable",
|
||||
"--code-mode-host-bin",
|
||||
),
|
||||
bwrap_bin=resolve_optional_input_path(
|
||||
args.bwrap_bin,
|
||||
"prebuilt Linux bwrap executable",
|
||||
@@ -159,6 +172,7 @@ def main() -> int:
|
||||
version = read_workspace_version()
|
||||
inputs = PackageInputs(
|
||||
entrypoint_bin=source_outputs.entrypoint_bin,
|
||||
code_mode_host_bin=source_outputs.code_mode_host_bin,
|
||||
rg_bin=resolve_rg_bin(spec, args.rg_bin),
|
||||
zsh_bin=resolve_zsh_bin(spec),
|
||||
bwrap_bin=source_outputs.bwrap_bin,
|
||||
|
||||
@@ -51,6 +51,11 @@ def build_package_dir(
|
||||
bin_dir / entrypoint_name,
|
||||
is_windows=spec.is_windows,
|
||||
)
|
||||
copy_executable(
|
||||
inputs.code_mode_host_bin,
|
||||
bin_dir / f"codex-code-mode-host{spec.exe_suffix}",
|
||||
is_windows=spec.is_windows,
|
||||
)
|
||||
copy_executable(inputs.rg_bin, path_dir / spec.rg_name, is_windows=spec.is_windows)
|
||||
|
||||
if inputs.zsh_bin is not None:
|
||||
@@ -83,6 +88,7 @@ def build_package_dir(
|
||||
"target": spec.target,
|
||||
"variant": variant.name,
|
||||
"entrypoint": f"bin/{entrypoint_name}",
|
||||
"codeModeHost": f"bin/codex-code-mode-host{spec.exe_suffix}",
|
||||
"resourcesDir": "codex-resources",
|
||||
"pathDir": "codex-path",
|
||||
}
|
||||
@@ -118,6 +124,7 @@ def validate_package_dir(
|
||||
"target": spec.target,
|
||||
"variant": variant.name,
|
||||
"entrypoint": f"bin/{variant.entrypoint_name(spec)}",
|
||||
"codeModeHost": f"bin/codex-code-mode-host{spec.exe_suffix}",
|
||||
"resourcesDir": "codex-resources",
|
||||
"pathDir": "codex-path",
|
||||
}
|
||||
@@ -130,6 +137,7 @@ def validate_package_dir(
|
||||
|
||||
required_files = [
|
||||
Path("bin") / variant.entrypoint_name(spec),
|
||||
Path("bin") / f"codex-code-mode-host{spec.exe_suffix}",
|
||||
Path("codex-path") / spec.rg_name,
|
||||
]
|
||||
executable_files = list(required_files)
|
||||
|
||||
@@ -39,6 +39,7 @@ class PackageVariant:
|
||||
@dataclass(frozen=True)
|
||||
class PackageInputs:
|
||||
entrypoint_bin: Path
|
||||
code_mode_host_bin: Path
|
||||
rg_bin: Path
|
||||
zsh_bin: Path | None
|
||||
bwrap_bin: Path | None
|
||||
|
||||
@@ -20,6 +20,7 @@ class SourceBinariesForTargetTest(unittest.TestCase):
|
||||
TARGET_SPECS["aarch64-apple-darwin"],
|
||||
PACKAGE_VARIANTS["codex"],
|
||||
build_entrypoint=False,
|
||||
build_code_mode_host=False,
|
||||
build_bwrap=False,
|
||||
build_codex_command_runner=False,
|
||||
build_codex_windows_sandbox_setup=False,
|
||||
@@ -35,6 +36,7 @@ class SourceBinariesForTargetTest(unittest.TestCase):
|
||||
TARGET_SPECS["x86_64-unknown-linux-musl"],
|
||||
PACKAGE_VARIANTS["codex"],
|
||||
build_entrypoint=False,
|
||||
build_code_mode_host=False,
|
||||
build_bwrap=False,
|
||||
build_codex_command_runner=False,
|
||||
build_codex_windows_sandbox_setup=False,
|
||||
@@ -50,6 +52,7 @@ class SourceBinariesForTargetTest(unittest.TestCase):
|
||||
TARGET_SPECS["x86_64-pc-windows-msvc"],
|
||||
PACKAGE_VARIANTS["codex"],
|
||||
build_entrypoint=False,
|
||||
build_code_mode_host=False,
|
||||
build_bwrap=False,
|
||||
build_codex_command_runner=False,
|
||||
build_codex_windows_sandbox_setup=False,
|
||||
@@ -63,6 +66,7 @@ class SourceBinariesForTargetTest(unittest.TestCase):
|
||||
TARGET_SPECS["x86_64-pc-windows-msvc"],
|
||||
PACKAGE_VARIANTS["codex"],
|
||||
build_entrypoint=False,
|
||||
build_code_mode_host=False,
|
||||
build_bwrap=False,
|
||||
build_codex_command_runner=True,
|
||||
build_codex_windows_sandbox_setup=True,
|
||||
@@ -70,10 +74,25 @@ class SourceBinariesForTargetTest(unittest.TestCase):
|
||||
["codex-command-runner", "codex-windows-sandbox-setup"],
|
||||
)
|
||||
|
||||
def test_missing_code_mode_host_is_built(self) -> None:
|
||||
self.assertEqual(
|
||||
source_binaries_for_target(
|
||||
TARGET_SPECS["x86_64-unknown-linux-musl"],
|
||||
PACKAGE_VARIANTS["codex"],
|
||||
build_entrypoint=False,
|
||||
build_code_mode_host=True,
|
||||
build_bwrap=False,
|
||||
build_codex_command_runner=False,
|
||||
build_codex_windows_sandbox_setup=False,
|
||||
),
|
||||
["codex-code-mode-host"],
|
||||
)
|
||||
|
||||
def test_build_uses_prebuilt_windows_helpers_without_running_cargo(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
root = Path(temp_dir)
|
||||
entrypoint = touch_file(root / "codex.exe")
|
||||
code_mode_host = touch_file(root / "codex-code-mode-host.exe")
|
||||
command_runner = touch_file(root / "codex-command-runner.exe")
|
||||
sandbox_setup = touch_file(root / "codex-windows-sandbox-setup.exe")
|
||||
|
||||
@@ -83,12 +102,14 @@ class SourceBinariesForTargetTest(unittest.TestCase):
|
||||
cargo=str(root / "cargo-that-should-not-run"),
|
||||
profile="release",
|
||||
entrypoint_bin=entrypoint,
|
||||
code_mode_host_bin=code_mode_host,
|
||||
bwrap_bin=None,
|
||||
codex_command_runner_bin=command_runner,
|
||||
codex_windows_sandbox_setup_bin=sandbox_setup,
|
||||
)
|
||||
|
||||
self.assertEqual(outputs.entrypoint_bin, entrypoint)
|
||||
self.assertEqual(outputs.code_mode_host_bin, code_mode_host)
|
||||
self.assertEqual(outputs.codex_command_runner_bin, command_runner)
|
||||
self.assertEqual(outputs.codex_windows_sandbox_setup_bin, sandbox_setup)
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ from .targets import TargetSpec
|
||||
|
||||
|
||||
DOWNLOAD_TIMEOUT_SECS = 120
|
||||
ARTIFACT_PROFILE = "ptrcomp_sandbox_release"
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
@@ -70,9 +71,9 @@ def fetch_codex_v8_artifacts(
|
||||
)
|
||||
target = spec.target
|
||||
cache_dir = (cache_root or default_cache_root()) / f"rusty-v8-{version}-{target}"
|
||||
archive = cache_dir / f"librusty_v8_release_{target}.a.gz"
|
||||
binding = cache_dir / f"src_binding_release_{target}.rs"
|
||||
checksums = cache_dir / f"rusty_v8_release_{target}.sha256"
|
||||
archive = cache_dir / f"librusty_v8_{ARTIFACT_PROFILE}_{target}.a.gz"
|
||||
binding = cache_dir / f"src_binding_{ARTIFACT_PROFILE}_{target}.rs"
|
||||
checksums = cache_dir / f"rusty_v8_{ARTIFACT_PROFILE}_{target}.sha256"
|
||||
|
||||
download_file(f"{release_url}/{checksums.name}", checksums)
|
||||
expected_checksums = load_checksums(checksums, {archive.name, binding.name})
|
||||
|
||||
Reference in New Issue
Block a user