Files
microhx/build-static.sh
T

186 lines
4.4 KiB
Bash
Executable File

#!/bin/bash
# MicroHX Static Build Script
#
# This script builds a fully static binary for Linux using musl or zig.
#
# Usage:
# ./build-static.sh # Build with musl
# ./build-static.sh --zig # Build with zig (better glibc compatibility)
# ./build-static.sh --help # Show help
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
show_help() {
cat << EOF
MicroHX Static Build Script
Usage:
$0 [OPTIONS]
Options:
--zig Use zig for building (better glibc compatibility)
--target ARCH Target architecture (default: x86_64)
--release Build in release mode (default)
--debug Build in debug mode
--help Show this help message
Examples:
$0 # Build release with musl
$0 --zig # Build release with zig
$0 --target aarch64 --zig # Build for ARM64 with zig
$0 --debug # Build debug version
EOF
}
# Default values
USE_ZIG=false
TARGET_ARCH="x86_64"
BUILD_MODE="release"
FEATURES="cli"
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--zig)
USE_ZIG=true
shift
;;
--target)
TARGET_ARCH="$2"
shift 2
;;
--release)
BUILD_MODE="release"
shift
;;
--debug)
BUILD_MODE="debug"
shift
;;
--help)
show_help
exit 0
;;
*)
log_error "Unknown option: $1"
show_help
exit 1
;;
esac
done
# Determine target triple
case $TARGET_ARCH in
x86_64)
TARGET="x86_64-unknown-linux-musl"
;;
aarch64|arm64)
TARGET="aarch64-unknown-linux-musl"
;;
i686|x86)
TARGET="i686-unknown-linux-musl"
;;
*)
log_error "Unsupported architecture: $TARGET_ARCH"
exit 1
;;
esac
log_info "Building MicroHX static binary"
log_info "Target: $TARGET"
log_info "Mode: $BUILD_MODE"
if [ "$USE_ZIG" = true ]; then
log_info "Using zig for building"
# Check if cargo-zigbuild is installed
if ! command -v cargo-zigbuild &> /dev/null; then
log_warn "cargo-zigbuild not found, installing..."
cargo install cargo-zigbuild
fi
# Determine zig target for glibc 2.17 compatibility
case $TARGET_ARCH in
x86_64)
ZIG_TARGET="x86_64-linux-gnu.2.17"
;;
aarch64)
ZIG_TARGET="aarch64-linux-gnu.2.17"
;;
*)
ZIG_TARGET="$TARGET_ARCH-linux-gnu.2.17"
;;
esac
log_info "Zig target: $ZIG_TARGET"
if [ "$BUILD_MODE" = "release" ]; then
cargo zigbuild --release --target "$TARGET" --features "$FEATURES"
BINARY_PATH="target/$TARGET/release/microhx"
else
cargo zigbuild --target "$TARGET" --features "$FEATURES"
BINARY_PATH="target/$TARGET/debug/microhx"
fi
else
# Using musl
log_info "Using musl for building"
# Check if musl target is installed
if ! rustup target list --installed | grep -q "$TARGET"; then
log_warn "Target $TARGET not installed, installing..."
rustup target add "$TARGET"
fi
if [ "$BUILD_MODE" = "release" ]; then
cargo build --release --target "$TARGET" --features "$FEATURES"
BINARY_PATH="target/$TARGET/release/microhx"
else
cargo build --target "$TARGET" --features "$FEATURES"
BINARY_PATH="target/$TARGET/debug/microhx"
fi
fi
# Verify the binary
if [ -f "$BINARY_PATH" ]; then
log_info "Build successful!"
log_info "Binary: $BINARY_PATH"
# Show binary info
if command -v file &> /dev/null; then
log_info "Binary info:"
file "$BINARY_PATH"
fi
if command -v ldd &> /dev/null; then
log_info "Dynamic dependencies (should be 'not a dynamic executable' or minimal):"
ldd "$BINARY_PATH" 2>&1 || true
fi
log_info "To run: $BINARY_PATH"
else
log_error "Build failed - binary not found at $BINARY_PATH"
exit 1
fi