blob: 32f8f9144fbc6e8c9e329fad4b8ae17b7a9dd693 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#!/usr/bin/env bash
#
# scripts/build-image.sh — assemble a bootable rs-dos disk image (UEFI/GPT)
#
# Layout:
# Partition 1: ESP (FAT32) — rsboot bootloader + kernel
#
# Output:
# rs-dos.img (or custom path) — bootable raw disk image for UEFI
#
# Usage:
# ./scripts/build-image.sh [output.img]
#
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
cd "$PROJECT_DIR"
BUILD_DIR="$PROJECT_DIR/build"
ESP_DIR="$PROJECT_DIR/esp"
IMAGE="${1:-$PROJECT_DIR/rs-dos.img}"
TARGET=x86_64-unknown-uefi
PROFILE=release
OUT_DIR="target/${TARGET}/${PROFILE}"
BOOTLOADER="$BUILD_DIR/bootloader/BOOTX64.EFI"
KERNEL="$OUT_DIR/rsdos.efi"
BZIMAGE="$ESP_DIR/bzImage"
INITRD="$ESP_DIR/initramfs.cpio.gz"
BOOT_EFI="$ESP_DIR/EFI/BOOT/BOOTX64.EFI"
ESP_START=2048 # 1 MiB offset (standard alignment)
ESP_SIZE_MB=64
IMAGE_SIZE_MB=$((ESP_SIZE_MB + 2)) # ESP + GPT gap + backup
# ---- checks ----
for cmd in sfdisk mkfs.vfat mcopy truncate dd; do
if ! command -v "$cmd" &>/dev/null; then
echo "Error: $cmd not found"
exit 1
fi
done
# ---- build kernel ----
echo "[1/4] Building kernel..."
cargo build --release --package rsdos --target x86_64-unknown-uefi ${CARGO_FLAGS:-}
# ---- build bootloader ----
echo "[2/4] Building bootloader..."
if [ ! -f "$BOOTLOADER" ]; then
"$SCRIPT_DIR/build-bootloader.sh"
fi
# ---- assemble ESP ----
echo "[3/4] Assembling ESP..."
mkdir -p "$ESP_DIR/EFI/BOOT"
cp "$KERNEL" "$BZIMAGE"
cp "$BOOTLOADER" "$BOOT_EFI"
if [ ! -f "$INITRD" ]; then
printf '' | gzip >"$INITRD"
fi
# ---- create disk image ----
echo "[4/4] Writing disk image..."
rm -f "$IMAGE"
truncate -s "${IMAGE_SIZE_MB}M" "$IMAGE"
# GPT partition table: single EFI System partition
sfdisk --quiet "$IMAGE" <<EOF
label: gpt
type=U, start=$ESP_START, size=+
EOF
# Build FAT32 image with ESP contents
ESP_IMG=$(mktemp)
truncate -s "${ESP_SIZE_MB}M" "$ESP_IMG"
mkfs.vfat -F 32 -n "RS-DOS" "$ESP_IMG" >/dev/null 2>&1
# Copy files into FAT
mmd -i "$ESP_IMG" ::/EFI 2>/dev/null || true
mmd -i "$ESP_IMG" ::/EFI/BOOT 2>/dev/null || true
mcopy -i "$ESP_IMG" "$BOOT_EFI" ::/EFI/BOOT/BOOTX64.EFI
mcopy -i "$ESP_IMG" "$BZIMAGE" ::/bzImage 2>/dev/null || true
mcopy -i "$ESP_IMG" "$INITRD" ::/initramfs.cpio.gz 2>/dev/null || true
# Inject FAT into image at partition offset
dd if="$ESP_IMG" of="$IMAGE" bs=512 seek="$ESP_START" conv=notrunc 2>/dev/null
rm -f "$ESP_IMG"
echo ""
echo "=== Done: $IMAGE ==="
ls -lh "$IMAGE"
echo ""
echo "Boot with: ./scripts/boot-image.sh"
echo "USB: sudo dd if=$IMAGE of=/dev/sdX bs=4M status=progress"
|