Update build-binaries workflow and shell script to allow for packaging of both arm64 and x64 versions of the Windows application.
184 lines
6.1 KiB
Bash
Executable File
184 lines
6.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Build pi binaries for all platforms locally.
|
|
# Mirrors .github/workflows/build-binaries.yml
|
|
#
|
|
# Usage:
|
|
# ./scripts/build-binaries.sh [--skip-deps] [--platform <platform>]
|
|
#
|
|
# Options:
|
|
# --skip-deps Skip installing cross-platform dependencies
|
|
# --platform <name> Build only for specified platform (darwin-arm64, darwin-x64, linux-x64, linux-arm64, windows-x64, windows-arm64)
|
|
#
|
|
# Output:
|
|
# packages/coding-agent/binaries/
|
|
# pi-darwin-arm64.tar.gz
|
|
# pi-darwin-x64.tar.gz
|
|
# pi-linux-x64.tar.gz
|
|
# pi-linux-arm64.tar.gz
|
|
# pi-windows-x64.zip
|
|
# pi-windows-arm64.zip
|
|
|
|
set -euo pipefail
|
|
|
|
cd "$(dirname "$0")/.."
|
|
|
|
SKIP_DEPS=false
|
|
PLATFORM=""
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--skip-deps)
|
|
SKIP_DEPS=true
|
|
shift
|
|
;;
|
|
--platform)
|
|
PLATFORM="$2"
|
|
shift 2
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Validate platform if specified
|
|
if [[ -n "$PLATFORM" ]]; then
|
|
case "$PLATFORM" in
|
|
darwin-arm64|darwin-x64|linux-x64|linux-arm64|windows-x64)
|
|
;;
|
|
*)
|
|
echo "Invalid platform: $PLATFORM"
|
|
echo "Valid platforms: darwin-arm64, darwin-x64, linux-x64, linux-arm64, windows-x64, windows-arm64"
|
|
exit 1
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
echo "==> Installing dependencies..."
|
|
npm ci
|
|
|
|
if [[ "$SKIP_DEPS" == "false" ]]; then
|
|
echo "==> Installing cross-platform native bindings..."
|
|
# npm ci only installs optional deps for the current platform
|
|
# We need all platform bindings for bun cross-compilation
|
|
# Use --force to bypass platform checks (os/cpu restrictions in package.json)
|
|
# Install all in one command to avoid npm removing packages from previous installs
|
|
npm install --no-save --force \
|
|
@mariozechner/clipboard-darwin-arm64@0.3.0 \
|
|
@mariozechner/clipboard-darwin-x64@0.3.0 \
|
|
@mariozechner/clipboard-linux-x64-gnu@0.3.0 \
|
|
@mariozechner/clipboard-linux-arm64-gnu@0.3.0 \
|
|
@mariozechner/clipboard-win32-x64-msvc@0.3.0 \
|
|
@mariozechner/clipboard-win32-arm64-msvc@0.3.0 \
|
|
@img/sharp-darwin-arm64@0.34.5 \
|
|
@img/sharp-darwin-x64@0.34.5 \
|
|
@img/sharp-linux-x64@0.34.5 \
|
|
@img/sharp-linux-arm64@0.34.5 \
|
|
@img/sharp-win32-x64@0.34.5 \
|
|
@img/sharp-win32-arm64@0.34.5 \
|
|
@img/sharp-libvips-darwin-arm64@1.2.4 \
|
|
@img/sharp-libvips-darwin-x64@1.2.4 \
|
|
@img/sharp-libvips-linux-x64@1.2.4 \
|
|
@img/sharp-libvips-linux-arm64@1.2.4
|
|
else
|
|
echo "==> Skipping cross-platform native bindings (--skip-deps)"
|
|
fi
|
|
|
|
echo "==> Building all packages..."
|
|
npm run build
|
|
|
|
echo "==> Building binaries..."
|
|
cd packages/coding-agent
|
|
|
|
# Clean previous builds
|
|
rm -rf binaries
|
|
mkdir -p binaries/{darwin-arm64,darwin-x64,linux-x64,linux-arm64,windows-x64,windows-arm64}
|
|
|
|
# Determine which platforms to build
|
|
if [[ -n "$PLATFORM" ]]; then
|
|
PLATFORMS=("$PLATFORM")
|
|
else
|
|
PLATFORMS=(darwin-arm64 darwin-x64 linux-x64 linux-arm64 windows-x64 windows-arm64)
|
|
fi
|
|
|
|
for platform in "${PLATFORMS[@]}"; do
|
|
echo "Building for $platform..."
|
|
# Externalize koffi to avoid embedding all 18 platform .node files (~74MB)
|
|
# into every binary. Koffi is only used on Windows for VT input and the
|
|
# call site has a try/catch fallback. For Windows builds, we copy the
|
|
# appropriate .node file alongside the binary below.
|
|
if [[ "$platform" == windows-* ]]; then
|
|
bun build --compile --external koffi --target=bun-$platform ./dist/bun/cli.js --outfile binaries/$platform/pi.exe
|
|
else
|
|
bun build --compile --external koffi --target=bun-$platform ./dist/bun/cli.js --outfile binaries/$platform/pi
|
|
fi
|
|
done
|
|
|
|
echo "==> Creating release archives..."
|
|
|
|
# Copy shared files to each platform directory
|
|
for platform in "${PLATFORMS[@]}"; do
|
|
cp package.json binaries/$platform/
|
|
cp README.md binaries/$platform/
|
|
cp CHANGELOG.md binaries/$platform/
|
|
cp ../../node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm binaries/$platform/
|
|
mkdir -p binaries/$platform/theme
|
|
cp dist/modes/interactive/theme/*.json binaries/$platform/theme/
|
|
mkdir -p binaries/$platform/assets
|
|
cp dist/modes/interactive/assets/* binaries/$platform/assets/
|
|
cp -r dist/core/export-html binaries/$platform/
|
|
cp -r docs binaries/$platform/
|
|
cp -r examples binaries/$platform/
|
|
|
|
# Copy koffi native module for Windows (needed for VT input support)
|
|
if [[ "$platform" == windows-* ]]; then
|
|
if [[ "$platform" == "windows-arm64" ]]; then
|
|
koffi_arch_dir="win32_arm64"
|
|
else
|
|
koffi_arch_dir="win32_x64"
|
|
fi
|
|
mkdir -p binaries/$platform/node_modules/koffi/build/koffi/$koffi_arch_dir
|
|
cp ../../node_modules/koffi/index.js binaries/$platform/node_modules/koffi/
|
|
cp ../../node_modules/koffi/package.json binaries/$platform/node_modules/koffi/
|
|
cp ../../node_modules/koffi/build/koffi/$koffi_arch_dir/koffi.node binaries/$platform/node_modules/koffi/build/koffi/$koffi_arch_dir/
|
|
fi
|
|
done
|
|
|
|
# Create archives
|
|
cd binaries
|
|
|
|
for platform in "${PLATFORMS[@]}"; do
|
|
if [[ "$platform" == windows-* ]]; then
|
|
# Windows (zip)
|
|
echo "Creating pi-$platform.zip..."
|
|
(cd $platform && zip -r ../pi-$platform.zip .)
|
|
else
|
|
# Unix platforms (tar.gz) - use wrapper directory for mise compatibility
|
|
echo "Creating pi-$platform.tar.gz..."
|
|
mv $platform pi && tar -czf pi-$platform.tar.gz pi && mv pi $platform
|
|
fi
|
|
done
|
|
|
|
# Extract archives for easy local testing
|
|
echo "==> Extracting archives for testing..."
|
|
for platform in "${PLATFORMS[@]}"; do
|
|
rm -rf $platform
|
|
if [[ "$platform" == windows-* ]]; then
|
|
mkdir -p $platform && (cd $platform && unzip -q ../pi-$platform.zip)
|
|
else
|
|
tar -xzf pi-$platform.tar.gz && mv pi $platform
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo "==> Build complete!"
|
|
echo "Archives available in packages/coding-agent/binaries/"
|
|
ls -lh *.tar.gz *.zip 2>/dev/null || true
|
|
echo ""
|
|
echo "Extracted directories for testing:"
|
|
for platform in "${PLATFORMS[@]}"; do
|
|
echo " binaries/$platform/pi"
|
|
done
|