Implement multi-platform build system with pure Go support

- Introduced a comprehensive build system that supports multiple platforms (Linux, macOS, Windows, Android) using pure Go builds (`CGO_ENABLED=0`).
- Updated all build and test scripts to ensure compatibility with the new purego approach, allowing for dynamic loading of `libsecp256k1` at runtime.
- Added detailed documentation on the build process, platform detection, and deployment options.
- Enhanced CI/CD workflows to automate builds for all supported platforms and include necessary libraries in releases.
- Updated `.gitignore` to exclude build output files.
- Created new documentation files for deployment and multi-platform build summaries.
This commit is contained in:
2025-11-04 20:29:19 +00:00
parent e0a95ca1cd
commit 202d3171f9
22 changed files with 1732 additions and 30 deletions

190
scripts/README_BUILD.md Normal file
View File

@@ -0,0 +1,190 @@
# Multi-Platform Build Scripts
This directory contains scripts for building and running ORLY relay binaries across multiple platforms.
## Available Scripts
### `build-all-platforms.sh`
Comprehensive build script that creates binaries for all supported platforms:
- Linux (AMD64, ARM64)
- macOS (AMD64 Intel, ARM64 Apple Silicon)
- Windows (AMD64)
- Android (ARM64, AMD64) - requires Android NDK
**Usage:**
```bash
./scripts/build-all-platforms.sh
```
**Output:** All binaries are placed in `build/` directory with platform-specific names.
### `platform-detect.sh`
Helper script for platform detection and binary/library name resolution.
**Usage:**
```bash
# Detect current platform
./scripts/platform-detect.sh detect
# Output: linux-amd64
# Get binary name for version
./scripts/platform-detect.sh binary v0.25.0
# Output: orly-v0.25.0-linux-amd64
# Get library name
./scripts/platform-detect.sh library
# Output: libsecp256k1-linux-amd64.so
```
### `run-orly.sh`
Universal launcher that automatically selects and runs the correct binary for your platform.
**Usage:**
```bash
./scripts/run-orly.sh [arguments for orly]
```
Features:
- Auto-detects platform
- Sets correct library path
- Passes all arguments to the binary
- Shows helpful error if binary not found
## Build Prerequisites
### For Linux Host
```bash
# Install cross-compilation tools
sudo apt-get update
sudo apt-get install -y \
gcc-mingw-w64-x86-64 \
gcc-aarch64-linux-gnu \
autoconf automake libtool
```
### For Android (optional)
Download and install Android NDK, then:
```bash
export ANDROID_NDK_HOME=/path/to/android-ndk
```
## Quick Start
1. **Build all platforms:**
```bash
./scripts/build-all-platforms.sh
```
2. **Run the binary:**
```bash
./scripts/run-orly.sh
```
3. **Or run specific platform binary:**
```bash
# Linux
export LD_LIBRARY_PATH=./build:$LD_LIBRARY_PATH
./build/orly-v0.25.0-linux-amd64
# macOS
./build/orly-v0.25.0-darwin-arm64
# Windows
set PATH=.\build;%PATH%
.\build\orly-v0.25.0-windows-amd64.exe
```
## Platform Support Matrix
| Platform | Architecture | CGO | Library Required | Status |
|----------------|--------------|-----|------------------|--------------|
| Linux | AMD64 | ✓ | libsecp256k1.so | Full Support |
| Linux | ARM64 | ✓ | libsecp256k1.so | Full Support |
| macOS | AMD64 | ✗ | - | Full Support |
| macOS | ARM64 | ✗ | - | Full Support |
| Windows | AMD64 | ✓ | libsecp256k1.dll | Full Support |
| Android | ARM64 | ✓ | libsecp256k1.so | Experimental |
| Android | AMD64 | ✓ | libsecp256k1.so | Experimental |
**Note:** macOS builds use pure Go (no CGO) for easier distribution. Crypto operations are slower but no library dependency is required.
## Integration with Other Scripts
All deployment and test scripts have been updated to support platform detection:
- `scripts/deploy.sh` - Builds with CGO and copies libraries
- `scripts/test.sh` - Sets library paths for tests
- `scripts/benchmark.sh` - Uses platform-specific binaries
- `scripts/runtests.sh` - Sets library paths for benchmark tests
## CI/CD
GitHub Actions workflow (`.github/workflows/go.yml`) automatically:
- Builds for all major platforms on release
- Includes platform-specific libraries
- Creates SHA256 checksums
- Uploads all artifacts to GitHub releases
## File Naming Convention
Binaries:
- `orly-{version}-{os}-{arch}[.ext]`
- Example: `orly-v0.25.0-linux-amd64`
Libraries:
- `libsecp256k1-{os}-{arch}.{ext}`
- Example: `libsecp256k1-linux-amd64.so`
## Distribution
When distributing binaries, include:
1. The platform-specific binary
2. The corresponding library file (for CGO builds)
3. SHA256SUMS file for verification
Example release structure:
```
release/
├── orly-v0.25.0-linux-amd64
├── orly-v0.25.0-linux-arm64
├── orly-v0.25.0-darwin-amd64
├── orly-v0.25.0-darwin-arm64
├── orly-v0.25.0-windows-amd64.exe
├── libsecp256k1-linux-amd64.so
├── libsecp256k1-linux-arm64.so
├── libsecp256k1-windows-amd64.dll
└── SHA256SUMS-v0.25.0.txt
```
## Troubleshooting
**Binary not found:**
Run `./scripts/build-all-platforms.sh` to build binaries.
**Library not found at runtime:**
Set the library path:
```bash
# Linux
export LD_LIBRARY_PATH=./build:$LD_LIBRARY_PATH
# macOS
export DYLD_LIBRARY_PATH=./build:$DYLD_LIBRARY_PATH
# Windows
set PATH=.\build;%PATH%
```
**Cross-compilation fails:**
Install the required cross-compiler (see Build Prerequisites above).
## Performance Comparison
| Build Type | Crypto Speed | Binary Size | Distribution |
|---------------|--------------|-------------|--------------|
| CGO (Linux) | Fast (2-3x) | Smaller | Needs .so |
| Pure Go (Mac) | Slower | Larger | Self-contained |
For detailed documentation, see [docs/BUILD_PLATFORMS.md](../docs/BUILD_PLATFORMS.md).