1
+ # Configuration options
2
+ FEATURES ?=
3
+ PROFILE ?= release
4
+
5
+ # Command arguments
6
+ override CARGO_ARGS = --bin monoos --no-default-features
7
+ override QEMU_ARGS = -no-reboot -no-shutdown -M smm=off -machine q35 -drive file=$(ISO ) ,format=raw -bios $(BUILD_ROOT ) /OVMF.fd
8
+
9
+ # Checks
10
+ ifneq ($(PROFILE ) ,$(filter $(PROFILE ) ,debug release) )
11
+ $(error Error : unsupported cargo profile "$(PROFILE ) ". supported options are "debug" and "release")
12
+ endif
13
+
14
+ ifneq ($(FEATURES ) ,)
15
+ override CARGO_ARGS += --features $(FEATURES)
16
+ endif
17
+
18
+ ifeq ($(PROFILE ) , release)
19
+ override CARGO_ARGS += --release
20
+ endif
21
+
22
+ ifeq ($(PROFILE ) ,debug)
23
+ override QEMU_ARGS += -s -S
24
+ endif
25
+
26
+ ifneq ($(findstring la57,$(FEATURES ) ) ,)
27
+ override QEMU_ARGS += -cpu qemu64,+la57
28
+ endif
29
+
30
+ # Environment variables
31
+ export MHOS_VERSION = v0.1.0
32
+
33
+ # Overrides
34
+ override BUILD_DIR := build
35
+ override BUILD_ROOT := $(BUILD_DIR ) /root
36
+ override ISO := $(BUILD_ROOT ) /monoos.iso
37
+ override LIMINE_DIR := $(BUILD_DIR ) /limine
38
+ override ESP := $(BUILD_ROOT ) /EFI/BOOT
39
+ override KERNEL_BIN := $(BUILD_ROOT ) /monoos.elf
40
+
41
+ # Targets
42
+ .PHONY : all iso run miri clean
43
+ all : iso
44
+
45
+ gen_build_dirs :
46
+ @# recursively create from the deepest directory
47
+ @mkdir -p $(ESP )
48
+
49
+ limine : gen_build_dirs
50
+ @git clone --depth 1 --branch v5.x-branch-binary https://github.com/limine-bootloader/limine.git $(LIMINE_DIR )
51
+ @$(MAKE ) -C $(LIMINE_DIR )
52
+
53
+ ovmf :
54
+ @wget https://efi.akeo.ie/OVMF/OVMF-X64.zip -P $(BUILD_ROOT )
55
+ @unzip $(BUILD_ROOT ) /OVMF-X64.zip -d $(BUILD_ROOT ) -x * .txt
56
+
57
+ kernel_build :
58
+ @cargo build $(CARGO_ARGS )
59
+
60
+ $(ISO ) : limine ovmf kernel_build
61
+ @cp target/x86_64-unknown-none/$(PROFILE ) /monoos $(KERNEL_BIN )
62
+ @cp limine.cfg $(LIMINE_DIR ) /limine-uefi-cd.bin $(BUILD_ROOT )
63
+ @cp $(LIMINE_DIR ) /BOOTX64.EFI $(ESP )
64
+ @xorriso -as mkisofs --efi-boot limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label $(BUILD_ROOT ) -o $(ISO )
65
+
66
+ # Convenience target for $(ISO)
67
+ iso : $(ISO )
68
+
69
+ run : iso
70
+ @qemu-system-x86_64 $(QEMU_ARGS )
71
+
72
+ miri :
73
+ @MIRI_NO_STD=1 cargo miri run --target x86_64-unknown-none
74
+
75
+ clean :
76
+ @cargo clean
77
+ @rm -rf build
0 commit comments