summaryrefslogtreecommitdiffstats
path: root/Makefile
blob: 9f03f93a542d9dff011b4c37b868361ad14aa902 (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
# 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)/raisernics.efi
export BZIMAGE=$(ESP_DIR)/bzImage
export INITRD=$(ESP_DIR)/initramfs.cpio.gz
export BOOTLOADER=../rng/rsbl/../build/bootloader/BOOTX64.EFI
export OVMF=/usr/share/edk2/x64/OVMF.4m.fd
export BOOT_EFI=$(ESP_DIR)/EFI/BOOT/BOOTX64.EFI

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

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

all: $(BZIMAGE) $(INITRD) $(BOOT_EFI)

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)/raisernics.efi: $(shell find src -name '*.rs') Cargo.toml build.rs
	cargo build --target $(TARGET) $(CARGO_FLAGS)

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

$(BOOT_EFI): $(BOOTLOADER) | $(ESP_DIR)
	mkdir -p $(ESP_DIR)/EFI/BOOT
	cp "$<" "$@"

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

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

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

run: all
	qemu-system-x86_64 \
	  -bios $(OVMF) \
	  -drive file=fat:rw:$(ESP_DIR),format=raw \
	  -serial stdio \
	  -m 256M \
	  -machine q35 \
	  -cpu qemu64 \
	  -no-reboot \
	  -display none

run-gui: all
	qemu-system-x86_64 \
	  -bios $(OVMF) \
	  -drive file=fat:rw:$(ESP_DIR),format=raw \
	  -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=fat:rw:$(ESP_DIR),format=raw \
	  -serial stdio \
	  -m 256M \
	  -machine q35 \
	  -cpu qemu64 \
	  -no-reboot \
	  -display none \
	  -s -S

# Boot from a raw disk image (created by tools/boot-image.sh)
run-image: all
	qemu-system-x86_64 \
	  -bios $(OVMF) \
	  -drive file=$(IMG),format=raw,if=none,id=hd \
	  -device ide-hd,drive=hd \
	  -serial stdio \
	  -m 256M \
	  -machine q35 \
	  -cpu qemu64 \
	  -no-reboot \
	  -display none

# ---- Disk image ----------------------------------------------------------

image: all
	./tools/boot-image.sh raisernics.img

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

fmt:
	cargo fmt

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

help:
	@echo "raisernics — Make targets"
	@echo ""
	@echo "  make              build kernel + ESP (default)"
	@echo "  make release      build with --release (smaller binary)"
	@echo "  make image        create bootable USB image (raisernics.img)"
	@echo "  make run          QEMU serial console (no graphics)"
	@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 "  ./tools/qemu.sh           flexible QEMU launcher"
	@echo "  ./tools/boot-image.sh     create bootable disk image"
	@echo "  ./tools/debug-kernel.py   GDB plugin (attach after 'make debug')"