182 lines
5.1 KiB
Bash
Executable File
182 lines
5.1 KiB
Bash
Executable File
#!/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 |