summaryrefslogtreecommitdiffstats
path: root/Makefile
blob: 7701d9d125402a321481987efc1e2a339f14b948 (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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# shellcheck shell=sh disable=SC2046,SC2091,SC2086,SC2155
# NOTE: $(VAR) in this file is MAKE syntax, not shell substitution.
export TARGET=x86_64-unknown-uefi
export PROFILE=debug
export OUT_DIR=target/$(TARGET)/$(PROFILE)
export ESP_DIR=esp
export KERNEL=$(OUT_DIR)/rsdos.efi
export BZIMAGE=$(ESP_DIR)/bzImage
export INITRD=$(ESP_DIR)/initramfs.cpio.gz
export BOOTLOADER=rsboot/rsboot.efi
export OVMF=/usr/share/edk2/x64/OVMF.4m.fd
export BOOT_EFI=$(ESP_DIR)/EFI/BOOT/BOOTX64.EFI
# Attach a raw disk image as the SATA drive (disk.img -> ide.0, ESP -> ide.1).
# Create one with: mkfs.fat -F 32 -n RSDOS disk.img && mcopy -i disk.img files ::
export DISK_IMG ?= /tmp/disk.img

.PHONY: all run run-gui clean image debug release fmt bootloader boot-image

# ---- Build ---------------------------------------------------------------

all: $(BZIMAGE) $(INITRD)

release: PROFILE=release
release: export PROFILE=release
release: export OUT_DIR=target/$(TARGET)/release
release: CARGO_FLAGS=--release
release: all

# shellcheck disable=SC2034
CARGO_FLAGS=

$(OUT_DIR)/rsdos.efi: $(shell find rsnix shell rsdos -name '*.rs') Cargo.toml rsnix/Cargo.toml shell/Cargo.toml rsdos/Cargo.toml
	cargo build --package rsdos --target $(TARGET) $(CARGO_FLAGS)

$(BZIMAGE): $(KERNEL) | $(ESP_DIR)
	cp "$<" "$@"

$(ESP_DIR):
	mkdir -p $(ESP_DIR)

$(INITRD): | $(ESP_DIR)
	printf '' | gzip > "$@"

# ---- QEMU runners --------------------------------------------------------

run: all
	qemu-system-x86_64 \
	  -bios $(OVMF) \
	  -drive file=$(DISK_IMG),format=raw,if=none,id=disk \
	  -device ide-hd,drive=disk,bus=ide.0 \
	  -drive file=fat:rw:$(ESP_DIR),format=raw,if=none,id=esp \
	  -device ide-hd,drive=esp,bus=ide.1 \
	  -serial stdio \
	  -m 256M \
	  -machine q35 \
	  -cpu qemu64 \
	  -no-reboot \
	  -display none

run-gui: all
	qemu-system-x86_64 \
	  -bios $(OVMF) \
	  -drive file=$(DISK_IMG),format=raw,if=none,id=disk \
	  -device ide-hd,drive=disk,bus=ide.0 \
	  -drive file=fat:rw:$(ESP_DIR),format=raw,if=none,id=esp \
	  -device ide-hd,drive=esp,bus=ide.1 \
	  -serial stdio \
	  -m 256M \
	  -machine q35 \
	  -cpu qemu64 \
	  -no-reboot \
	  -vga std

# GDB stub on :1234
debug: all
	qemu-system-x86_64 \
	  -bios $(OVMF) \
	  -drive file=$(DISK_IMG),format=raw,if=none,id=disk \
	  -device ide-hd,drive=disk,bus=ide.0 \
	  -drive file=fat:rw:$(ESP_DIR),format=raw,if=none,id=esp \
	  -device ide-hd,drive=esp,bus=ide.1 \
	  -serial stdio \
	  -m 256M \
	  -machine q35 \
	  -cpu qemu64 \
	  -no-reboot \
	  -display none \
	  -s -S

# Boot from a raw disk image (delegates to boot-image.sh which builds the
# full chain if the image doesn't exist yet)
run-image: all
	./scripts/boot-image.sh rs-dos.img

# ---- Full boot chain -----------------------------------------------------

# Build bootloader only (rsboot submodule)
bootloader:
	./scripts/build-bootloader.sh

# Build the full boot chain disk image (kernel + bootloader)
image: all
	./scripts/build-image.sh rs-dos.img

# Boot the full chain disk image (builds it first if needed)
boot-image: all
	./scripts/boot-image.sh rs-dos.img

# ---- Utilities -----------------------------------------------------------

fmt:
	cargo fmt

clean:
	cargo clean
	rm -rf $(ESP_DIR) rs-dos.img

help:
	@echo "rs-dos — Make targets"
	@echo ""
	@echo "  make                build kernel + ESP (default)"
	@echo "  make release        build with --release (smaller binary)"
	@echo "  make bootloader     build rsboot from source"
	@echo "  make image          build full chain disk image (bootloader + kernel)"
	@echo "  make boot-image     build + boot full chain via QEMU"
	@echo "  make run            QEMU serial console (direct boot, no bootloader)"
	@echo "  make run-gui        QEMU with graphical window (GOP/PS2)"
	@echo "  make debug          QEMU + GDB stub on :1234"
	@echo "  make clean          remove build artifacts"
	@echo "  make fmt            format Rust source"
	@echo ""
	@echo "Scripts:"
	@echo "  ./scripts/boot.sh              quick direct boot (dev loop)"
	@echo "  ./scripts/boot-image.sh        boot full chain (builds if needed)"
	@echo "  ./scripts/build-image.sh       build full chain disk image"
	@echo "  ./scripts/build-bootloader.sh  build rsboot from source"
	@echo "  ./scripts/qemu.sh              flexible QEMU launcher"
	@echo "  ./scripts/debug-kernel.py      GDB plugin (attach after 'make debug')"