#!/bin/bash # Host build script for Alpine Zero-OS Initramfs set -e # Colors for output GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color # Function to print colored output print_info() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # Default values BUILDMODE="${BUILDMODE:-debug}" SERVICE="builder" CLEAN_BUILD=false DEV_MODE=false MINIMAL_MODE=false # Help function show_help() { echo "Usage: $0 [OPTIONS]" echo "" echo "Options:" echo " -r, --release Build in release mode (default: debug)" echo " -m, --minimal Build minimal embedded initramfs (~50MB vs 700MB)" echo " -c, --clean Clean build without cache volumes" echo " -d, --dev Start development container with shell" echo " -t, --test Run test build without cache" echo " -h, --help Show this help message" echo "" echo "Examples:" echo " $0 # Build in debug mode with cache" echo " $0 --release # Build in release mode" echo " $0 --minimal # Build minimal embedded initramfs" echo " $0 --clean # Clean build without cache" echo " $0 --dev # Start development shell" echo "" echo "Environment variables:" echo " BUILDMODE=release # Override build mode" echo " TARGETARCH=amd64 # Target architecture" echo "" } # Parse command line arguments while [[ $# -gt 0 ]]; do case $1 in -r|--release) BUILDMODE="release" shift ;; -m|--minimal) MINIMAL_MODE=true shift ;; -c|--clean) CLEAN_BUILD=true shift ;; -d|--dev) DEV_MODE=true SERVICE="shell" shift ;; -t|--test) SERVICE="test" shift ;; -h|--help) show_help exit 0 ;; *) print_error "Unknown option: $1" show_help exit 1 ;; esac done print_info "Alpine Zero-OS Initramfs Builder" print_info "Build mode: $BUILDMODE" if [ "$MINIMAL_MODE" = true ]; then print_info "Initramfs type: MINIMAL (~50MB embedded cpio)" else print_info "Initramfs type: FULL (~700MB with all packages)" fi print_info "Service: $SERVICE" if [ "$CLEAN_BUILD" = true ]; then print_info "Clean build: removing cache and artifacts" fi # Change to build directory cd "$(dirname "$0")/build" # Handle clean build if [ "$CLEAN_BUILD" = true ]; then print_info "Cleaning build artifacts and cache..." # Remove output artifacts rm -rf ../output/* print_info " Removed output artifacts" # Remove cache directories rm -rf ../cache/* print_info " Removed cache directories" # Remove Docker volumes print_info " Removing Docker cache volumes..." docker volume rm alpine-initramfs_github-cache alpine-initramfs_kernel-cache 2>/dev/null || true print_info " Docker cache volumes removed" print_success "Clean completed successfully" exit 0 fi # Create necessary directories mkdir -p ../output ../cache/github ../cache/packages # Export environment variables for docker-compose export BUILDMODE export MINIMAL_MODE export TARGETARCH="${TARGETARCH:-amd64}" if [ "$DEV_MODE" = true ]; then print_info "Starting development container..." docker compose run --rm $SERVICE else print_info "Starting build process..." # Build the Docker image first print_info "Building Docker image..." docker compose build $SERVICE # Run the build print_info "Running Alpine initramfs build..." docker compose run --rm $SERVICE # Check if build was successful if [ -f "../output/vmlinuz.efi" ]; then print_success "Build completed successfully!" print_info "Build artifacts:" ls -la ../output/ # Show size information size=$(stat -c%s "../output/vmlinuz.efi" 2>/dev/null || stat -f%z "../output/vmlinuz.efi" 2>/dev/null || echo "unknown") print_info "Kernel size: $size bytes" if [ -f "../output/initramfs.cpio.xz" ]; then initramfs_size=$(stat -c%s "../output/initramfs.cpio.xz" 2>/dev/null || stat -f%z "../output/initramfs.cpio.xz" 2>/dev/null || echo "unknown") print_info "Initramfs size: $initramfs_size bytes" fi print_success "Alpine Zero-OS kernel ready: output/vmlinuz.efi" print_info "" print_info "To test with QEMU:" print_info " qemu-system-x86_64 -kernel output/vmlinuz.efi -m 2048 -enable-kvm -cpu host \\" print_info " -net nic,model=e1000 -net bridge,br=vm0 -nographic -serial null \\" print_info " -serial mon:stdio -append console=ttyS1,115200n8" else print_error "Build failed - no kernel image found in output/" exit 1 fi fi