feat: include Windows binary of the CLI in the npm release (#2040)
To date, the build scripts in `codex-cli` still supported building the old TypeScript version of the Codex CLI to give Windows users something they can run, but we are just going to have them use the Rust version like everyone else, so: - updates `codex-cli/bin/codex.js` so that we run the native binary or throw if the target platform/arch is not supported (no more conditional usage based on `CODEX_RUST`, `use-native` file, etc.) - drops the `--native` flag from `codex-cli/scripts/stage_release.sh` and updates all the code paths to behave as if `--native` were passed (i.e., it is the only way to run it now) Tested this by running: ``` ./codex-cli/scripts/stage_rust_release.py --release-version 0.20.0-alpha.2 ```
This commit is contained in:
@@ -1,40 +1,13 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
// Unified entry point for the Codex CLI.
|
// Unified entry point for the Codex CLI.
|
||||||
/*
|
|
||||||
* Behavior
|
|
||||||
* =========
|
|
||||||
* 1. By default we import the JavaScript implementation located in
|
|
||||||
* dist/cli.js.
|
|
||||||
*
|
|
||||||
* 2. Developers can opt-in to a pre-compiled Rust binary by setting the
|
|
||||||
* environment variable CODEX_RUST to a truthy value (`1`, `true`, etc.).
|
|
||||||
* When that variable is present we resolve the correct binary for the
|
|
||||||
* current platform / architecture and execute it via child_process.
|
|
||||||
*
|
|
||||||
* If the CODEX_RUST=1 is specified and there is no native binary for the
|
|
||||||
* current platform / architecture, an error is thrown.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import fs from "fs";
|
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { fileURLToPath, pathToFileURL } from "url";
|
import { fileURLToPath } from "url";
|
||||||
|
|
||||||
// Determine whether the user explicitly wants the Rust CLI.
|
|
||||||
|
|
||||||
// __dirname equivalent in ESM
|
// __dirname equivalent in ESM
|
||||||
const __filename = fileURLToPath(import.meta.url);
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
const __dirname = path.dirname(__filename);
|
const __dirname = path.dirname(__filename);
|
||||||
|
|
||||||
// For the @native release of the Node module, the `use-native` file is added,
|
|
||||||
// indicating we should default to the native binary. For other releases,
|
|
||||||
// setting CODEX_RUST=1 will opt-in to the native binary, if included.
|
|
||||||
const wantsNative = fs.existsSync(path.join(__dirname, "use-native")) ||
|
|
||||||
(process.env.CODEX_RUST != null
|
|
||||||
? ["1", "true", "yes"].includes(process.env.CODEX_RUST.toLowerCase())
|
|
||||||
: false);
|
|
||||||
|
|
||||||
// Try native binary if requested.
|
|
||||||
if (wantsNative && process.platform !== 'win32') {
|
|
||||||
const { platform, arch } = process;
|
const { platform, arch } = process;
|
||||||
|
|
||||||
let targetTriple = null;
|
let targetTriple = null;
|
||||||
@@ -64,6 +37,17 @@ if (wantsNative && process.platform !== 'win32') {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "win32":
|
||||||
|
switch (arch) {
|
||||||
|
case "x64":
|
||||||
|
targetTriple = "x86_64-pc-windows-msvc.exe";
|
||||||
|
break;
|
||||||
|
case "arm64":
|
||||||
|
// We do not build this today, fall through...
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -136,19 +120,4 @@ if (wantsNative && process.platform !== 'win32') {
|
|||||||
} else {
|
} else {
|
||||||
process.exit(childResult.exitCode);
|
process.exit(childResult.exitCode);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// Fallback: execute the original JavaScript CLI.
|
|
||||||
|
|
||||||
// Resolve the path to the compiled CLI bundle
|
|
||||||
const cliPath = path.resolve(__dirname, "../dist/cli.js");
|
|
||||||
const cliUrl = pathToFileURL(cliPath).href;
|
|
||||||
|
|
||||||
// Load and execute the CLI
|
|
||||||
try {
|
|
||||||
await import(cliUrl);
|
|
||||||
} catch (err) {
|
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.error(err);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -2,13 +2,8 @@
|
|||||||
|
|
||||||
# Install native runtime dependencies for codex-cli.
|
# Install native runtime dependencies for codex-cli.
|
||||||
#
|
#
|
||||||
# By default the script copies the sandbox binaries that are required at
|
|
||||||
# runtime. When called with the --full-native flag, it additionally
|
|
||||||
# bundles pre-built Rust CLI binaries so that the resulting npm package can run
|
|
||||||
# the native implementation when users set CODEX_RUST=1.
|
|
||||||
#
|
|
||||||
# Usage
|
# Usage
|
||||||
# install_native_deps.sh [--full-native] [--workflow-url URL] [CODEX_CLI_ROOT]
|
# install_native_deps.sh [--workflow-url URL] [CODEX_CLI_ROOT]
|
||||||
#
|
#
|
||||||
# The optional RELEASE_ROOT is the path that contains package.json. Omitting
|
# The optional RELEASE_ROOT is the path that contains package.json. Omitting
|
||||||
# it installs the binaries into the repository's own bin/ folder to support
|
# it installs the binaries into the repository's own bin/ folder to support
|
||||||
@@ -21,18 +16,14 @@ set -euo pipefail
|
|||||||
# ------------------
|
# ------------------
|
||||||
|
|
||||||
CODEX_CLI_ROOT=""
|
CODEX_CLI_ROOT=""
|
||||||
INCLUDE_RUST=0
|
|
||||||
|
|
||||||
# Until we start publishing stable GitHub releases, we have to grab the binaries
|
# Until we start publishing stable GitHub releases, we have to grab the binaries
|
||||||
# from the GitHub Action that created them. Update the URL below to point to the
|
# from the GitHub Action that created them. Update the URL below to point to the
|
||||||
# appropriate workflow run:
|
# appropriate workflow run:
|
||||||
WORKFLOW_URL="https://github.com/openai/codex/actions/runs/15981617627"
|
WORKFLOW_URL="https://github.com/openai/codex/actions/runs/16840150768" # rust-v0.20.0-alpha.2
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--full-native)
|
|
||||||
INCLUDE_RUST=1
|
|
||||||
;;
|
|
||||||
--workflow-url)
|
--workflow-url)
|
||||||
shift || { echo "--workflow-url requires an argument"; exit 1; }
|
shift || { echo "--workflow-url requires an argument"; exit 1; }
|
||||||
if [ -n "$1" ]; then
|
if [ -n "$1" ]; then
|
||||||
@@ -81,14 +72,6 @@ trap 'rm -rf "$ARTIFACTS_DIR"' EXIT
|
|||||||
# NB: The GitHub CLI `gh` must be installed and authenticated.
|
# NB: The GitHub CLI `gh` must be installed and authenticated.
|
||||||
gh run download --dir "$ARTIFACTS_DIR" --repo openai/codex "$WORKFLOW_ID"
|
gh run download --dir "$ARTIFACTS_DIR" --repo openai/codex "$WORKFLOW_ID"
|
||||||
|
|
||||||
# Decompress the artifacts for Linux sandboxing.
|
|
||||||
zstd -d "$ARTIFACTS_DIR/x86_64-unknown-linux-musl/codex-linux-sandbox-x86_64-unknown-linux-musl.zst" \
|
|
||||||
-o "$BIN_DIR/codex-linux-sandbox-x64"
|
|
||||||
|
|
||||||
zstd -d "$ARTIFACTS_DIR/aarch64-unknown-linux-musl/codex-linux-sandbox-aarch64-unknown-linux-musl.zst" \
|
|
||||||
-o "$BIN_DIR/codex-linux-sandbox-arm64"
|
|
||||||
|
|
||||||
if [[ "$INCLUDE_RUST" -eq 1 ]]; then
|
|
||||||
# x64 Linux
|
# x64 Linux
|
||||||
zstd -d "$ARTIFACTS_DIR/x86_64-unknown-linux-musl/codex-x86_64-unknown-linux-musl.zst" \
|
zstd -d "$ARTIFACTS_DIR/x86_64-unknown-linux-musl/codex-x86_64-unknown-linux-musl.zst" \
|
||||||
-o "$BIN_DIR/codex-x86_64-unknown-linux-musl"
|
-o "$BIN_DIR/codex-x86_64-unknown-linux-musl"
|
||||||
@@ -101,6 +84,8 @@ if [[ "$INCLUDE_RUST" -eq 1 ]]; then
|
|||||||
# ARM64 macOS
|
# ARM64 macOS
|
||||||
zstd -d "$ARTIFACTS_DIR/aarch64-apple-darwin/codex-aarch64-apple-darwin.zst" \
|
zstd -d "$ARTIFACTS_DIR/aarch64-apple-darwin/codex-aarch64-apple-darwin.zst" \
|
||||||
-o "$BIN_DIR/codex-aarch64-apple-darwin"
|
-o "$BIN_DIR/codex-aarch64-apple-darwin"
|
||||||
fi
|
# x64 Windows
|
||||||
|
zstd -d "$ARTIFACTS_DIR/x86_64-pc-windows-msvc/codex-x86_64-pc-windows-msvc.exe.zst" \
|
||||||
|
-o "$BIN_DIR/codex-x86_64-pc-windows-msvc.exe"
|
||||||
|
|
||||||
echo "Installed native dependencies into $BIN_DIR"
|
echo "Installed native dependencies into $BIN_DIR"
|
||||||
|
|||||||
@@ -7,15 +7,8 @@
|
|||||||
# Usage:
|
# Usage:
|
||||||
#
|
#
|
||||||
# --tmp <dir> : Use <dir> instead of a freshly created temp directory.
|
# --tmp <dir> : Use <dir> instead of a freshly created temp directory.
|
||||||
# --native : Bundle the pre-built Rust CLI binaries for Linux alongside
|
|
||||||
# the JavaScript implementation (a so-called "fat" package).
|
|
||||||
# -h|--help : Print usage.
|
# -h|--help : Print usage.
|
||||||
#
|
#
|
||||||
# When --native is supplied we copy the linux-sandbox binaries (as before) and
|
|
||||||
# additionally fetch / unpack the two Rust targets that we currently support:
|
|
||||||
# - x86_64-unknown-linux-musl
|
|
||||||
# - aarch64-unknown-linux-musl
|
|
||||||
#
|
|
||||||
# NOTE: This script is intended to be run from the repository root via
|
# NOTE: This script is intended to be run from the repository root via
|
||||||
# `pnpm --filter codex-cli stage-release ...` or inside codex-cli with the
|
# `pnpm --filter codex-cli stage-release ...` or inside codex-cli with the
|
||||||
# helper script entry in package.json (`pnpm stage-release ...`).
|
# helper script entry in package.json (`pnpm stage-release ...`).
|
||||||
@@ -27,11 +20,10 @@ set -euo pipefail
|
|||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
Usage: $(basename "$0") [--tmp DIR] [--native] [--version VERSION]
|
Usage: $(basename "$0") [--tmp DIR] [--version VERSION]
|
||||||
|
|
||||||
Options
|
Options
|
||||||
--tmp DIR Use DIR to stage the release (defaults to a fresh mktemp dir)
|
--tmp DIR Use DIR to stage the release (defaults to a fresh mktemp dir)
|
||||||
--native Bundle Rust binaries for Linux (fat package)
|
|
||||||
--version Specify the version to release (defaults to a timestamp-based version)
|
--version Specify the version to release (defaults to a timestamp-based version)
|
||||||
-h, --help Show this help
|
-h, --help Show this help
|
||||||
|
|
||||||
@@ -42,7 +34,6 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
TMPDIR=""
|
TMPDIR=""
|
||||||
INCLUDE_NATIVE=0
|
|
||||||
# Default to a timestamp-based version (keep same scheme as before)
|
# Default to a timestamp-based version (keep same scheme as before)
|
||||||
VERSION="$(printf '0.1.%d' "$(date +%y%m%d%H%M)")"
|
VERSION="$(printf '0.1.%d' "$(date +%y%m%d%H%M)")"
|
||||||
WORKFLOW_URL=""
|
WORKFLOW_URL=""
|
||||||
@@ -57,9 +48,6 @@ while [[ $# -gt 0 ]]; do
|
|||||||
--tmp=*)
|
--tmp=*)
|
||||||
TMPDIR="${1#*=}"
|
TMPDIR="${1#*=}"
|
||||||
;;
|
;;
|
||||||
--native)
|
|
||||||
INCLUDE_NATIVE=1
|
|
||||||
;;
|
|
||||||
--version)
|
--version)
|
||||||
shift || { echo "--version requires an argument"; usage 1; }
|
shift || { echo "--version requires an argument"; usage 1; }
|
||||||
VERSION="$1"
|
VERSION="$1"
|
||||||
@@ -126,29 +114,15 @@ jq --arg version "$VERSION" \
|
|||||||
|
|
||||||
# 2. Native runtime deps (sandbox plus optional Rust binaries)
|
# 2. Native runtime deps (sandbox plus optional Rust binaries)
|
||||||
|
|
||||||
if [[ "$INCLUDE_NATIVE" -eq 1 ]]; then
|
./scripts/install_native_deps.sh --workflow-url "$WORKFLOW_URL" "$TMPDIR"
|
||||||
./scripts/install_native_deps.sh --full-native --workflow-url "$WORKFLOW_URL" "$TMPDIR"
|
|
||||||
touch "${TMPDIR}/bin/use-native"
|
|
||||||
else
|
|
||||||
./scripts/install_native_deps.sh "$TMPDIR"
|
|
||||||
fi
|
|
||||||
|
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
|
||||||
echo "Staged version $VERSION for release in $TMPDIR"
|
echo "Staged version $VERSION for release in $TMPDIR"
|
||||||
|
|
||||||
if [[ "$INCLUDE_NATIVE" -eq 1 ]]; then
|
|
||||||
echo "Verify the CLI:"
|
echo "Verify the CLI:"
|
||||||
echo " node ${TMPDIR}/bin/codex.js --version"
|
echo " node ${TMPDIR}/bin/codex.js --version"
|
||||||
echo " node ${TMPDIR}/bin/codex.js --help"
|
echo " node ${TMPDIR}/bin/codex.js --help"
|
||||||
else
|
|
||||||
echo "Test Node:"
|
|
||||||
echo " node ${TMPDIR}/bin/codex.js --help"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Print final hint for convenience
|
# Print final hint for convenience
|
||||||
if [[ "$INCLUDE_NATIVE" -eq 1 ]]; then
|
|
||||||
echo "Next: cd \"$TMPDIR\" && npm publish --tag native"
|
|
||||||
else
|
|
||||||
echo "Next: cd \"$TMPDIR\" && npm publish"
|
echo "Next: cd \"$TMPDIR\" && npm publish"
|
||||||
fi
|
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ Run this after the GitHub Release has been created and use
|
|||||||
version,
|
version,
|
||||||
"--workflow-url",
|
"--workflow-url",
|
||||||
workflow["url"],
|
workflow["url"],
|
||||||
"--native",
|
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
stage_release.check_returncode()
|
stage_release.check_returncode()
|
||||||
|
|||||||
Reference in New Issue
Block a user