-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMakefile
More file actions
193 lines (178 loc) Β· 7.24 KB
/
Makefile
File metadata and controls
193 lines (178 loc) Β· 7.24 KB
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# TrustOS β Cross-platform Makefile
# Works on Linux, macOS, and Windows (via WSL/MSYS2/Git Bash)
#
# Usage:
# make build β Build the kernel (release)
# make iso β Build kernel + create bootable ISO
# make run β Build + run in QEMU (UEFI)
# make run-bios β Build + run in QEMU (BIOS/legacy)
# make clean β Clean build artifacts
# make help β Show available targets
#
# Requirements:
# - Rust nightly toolchain (see rust-toolchain.toml)
# - xorriso (for ISO creation)
# - qemu-system-x86_64 (for running)
# - OVMF firmware (for UEFI boot in QEMU)
.PHONY: build iso run run-bios clean help check-deps disk limine
# ββ Configuration (override via environment) ββ
KERNEL_PKG ?= trustos_kernel
TARGET ?= x86_64-unknown-none
PROFILE ?= release
ISO_NAME ?= trustos.iso
QEMU ?= qemu-system-x86_64
QEMU_MEMORY ?= 512M
QEMU_CPUS ?= 4
DATA_IMG ?= trustos_data.img
DATA_SIZE ?= 64M
# ββ Derived paths (no hardcoded absolute paths) ββ
ROOT_DIR := $(shell pwd)
KERNEL_BIN := target/$(TARGET)/$(PROFILE)/$(KERNEL_PKG)
ISO_ROOT := iso_root
ISO_FILE := $(ISO_NAME)
# Detect OVMF location
OVMF_CODE ?= $(shell \
if [ -f "$(ROOT_DIR)/OVMF.fd" ]; then echo "$(ROOT_DIR)/OVMF.fd"; \
elif [ -f /usr/share/OVMF/OVMF_CODE.fd ]; then echo "/usr/share/OVMF/OVMF_CODE.fd"; \
elif [ -f /usr/share/edk2/ovmf/OVMF_CODE.fd ]; then echo "/usr/share/edk2/ovmf/OVMF_CODE.fd"; \
elif [ -f /usr/share/qemu/OVMF.fd ]; then echo "/usr/share/qemu/OVMF.fd"; \
elif [ -f /opt/homebrew/share/qemu/edk2-x86_64-code.fd ]; then echo "/opt/homebrew/share/qemu/edk2-x86_64-code.fd"; \
else echo "OVMF_NOT_FOUND"; fi)
# ββ Colors ββ
GREEN := \033[0;32m
YELLOW := \033[0;33m
RED := \033[0;31m
CYAN := \033[0;36m
RESET := \033[0m
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
# Targets
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
help:
@echo ""
@echo "$(CYAN)βββ TrustOS Build System βββ$(RESET)"
@echo ""
@echo " $(GREEN)make build$(RESET) Build the kernel (release)"
@echo " $(GREEN)make iso$(RESET) Build kernel + create bootable ISO"
@echo " $(GREEN)make run$(RESET) Build + run in QEMU (UEFI mode)"
@echo " $(GREEN)make run-bios$(RESET) Build + run in QEMU (BIOS/legacy)"
@echo " $(GREEN)make clean$(RESET) Clean build artifacts"
@echo " $(GREEN)make check-deps$(RESET) Check if required tools are installed"
@echo ""
@echo " Override variables: QEMU_MEMORY=1G QEMU_CPUS=2 make run"
@echo ""
## Build the kernel
build:
@echo "$(CYAN)ββ Building TrustOS kernel ($(PROFILE)) ββ$(RESET)"
cargo build --$(PROFILE) -p $(KERNEL_PKG)
@KSIZE=$$(du -h $(KERNEL_BIN) 2>/dev/null | cut -f1); \
echo "$(GREEN)β Kernel built: $(KERNEL_BIN) ($$KSIZE)$(RESET)"
## Create bootable ISO with Limine
iso: build limine
@echo "$(CYAN)ββ Creating bootable ISO ββ$(RESET)"
@mkdir -p $(ISO_ROOT)/boot/limine
@mkdir -p $(ISO_ROOT)/EFI/BOOT
@# Copy kernel
@cp $(KERNEL_BIN) $(ISO_ROOT)/boot/$(KERNEL_PKG)
@# Copy Limine bootloader files
@cp -f limine/BOOTX64.EFI $(ISO_ROOT)/EFI/BOOT/BOOTX64.EFI
@cp -f limine/limine-bios.sys $(ISO_ROOT)/boot/limine/
@cp -f limine/limine-bios-cd.bin $(ISO_ROOT)/boot/limine/
@cp -f limine/limine-uefi-cd.bin $(ISO_ROOT)/boot/limine/
@# Copy boot config
@cp -f limine.conf $(ISO_ROOT)/limine.conf 2>/dev/null || true
@cp -f limine.conf $(ISO_ROOT)/boot/limine/limine.conf 2>/dev/null || true
@# Create ISO
xorriso -as mkisofs \
-b boot/limine/limine-bios-cd.bin \
-no-emul-boot -boot-load-size 4 -boot-info-table \
--efi-boot boot/limine/limine-uefi-cd.bin \
-efi-boot-part --efi-boot-image --protective-msdos-label \
--mbr-force-bootable \
-o $(ISO_FILE) $(ISO_ROOT)
@echo "$(GREEN)β ISO created: $(ISO_FILE)$(RESET)"
## Create a persistent data disk image (if it doesn't exist)
disk:
@if [ ! -f "$(DATA_IMG)" ]; then \
echo "$(YELLOW)Creating $(DATA_SIZE) data disk: $(DATA_IMG)$(RESET)"; \
if command -v qemu-img >/dev/null 2>&1; then \
qemu-img create -f raw $(DATA_IMG) $(DATA_SIZE); \
else \
truncate -s $(DATA_SIZE) $(DATA_IMG); \
fi; \
echo "$(GREEN)β Data disk created$(RESET)"; \
fi
## Run in QEMU (UEFI mode)
run: iso disk
@echo "$(CYAN)ββ Starting QEMU (UEFI) ββ$(RESET)"
@if [ "$(OVMF_CODE)" = "OVMF_NOT_FOUND" ]; then \
echo "$(RED)β OVMF firmware not found!$(RESET)"; \
echo " Install: sudo apt install ovmf (Debian/Ubuntu)"; \
echo " sudo dnf install edk2-ovmf (Fedora)"; \
echo " brew install qemu (macOS, includes OVMF)"; \
exit 1; \
fi
@echo " ISO: $(ISO_FILE)"
@echo " OVMF: $(OVMF_CODE)"
@echo " Memory: $(QEMU_MEMORY) CPUs: $(QEMU_CPUS)"
$(QEMU) \
-cdrom $(ISO_FILE) \
-m $(QEMU_MEMORY) \
-machine q35 \
-cpu max \
-smp $(QEMU_CPUS) \
-display gtk \
-vga std \
-device virtio-gpu-pci,xres=1280,yres=800 \
-device virtio-net-pci,netdev=net0 \
-netdev user,id=net0 \
-drive if=pflash,format=raw,readonly=on,file=$(OVMF_CODE) \
-drive file=$(DATA_IMG),format=raw,if=virtio,id=data0 \
-rtc base=utc,clock=vm \
-serial stdio \
-no-reboot
## Run in QEMU (BIOS/legacy mode β no OVMF needed)
run-bios: iso
@echo "$(CYAN)ββ Starting QEMU (BIOS) ββ$(RESET)"
$(QEMU) \
-cdrom $(ISO_FILE) \
-m $(QEMU_MEMORY) \
-machine pc \
-cpu max \
-smp $(QEMU_CPUS) \
-display gtk \
-vga std \
-serial stdio \
-no-reboot
## Check if required tools are installed
check-deps:
@echo "$(CYAN)ββ Checking dependencies ββ$(RESET)"
@command -v cargo >/dev/null 2>&1 && echo "$(GREEN)β cargo$(RESET)" || echo "$(RED)β cargo β install from https://rustup.rs$(RESET)"
@command -v rustup >/dev/null 2>&1 && echo "$(GREEN)β rustup$(RESET)" || echo "$(RED)β rustup β install from https://rustup.rs$(RESET)"
@command -v xorriso >/dev/null 2>&1 && echo "$(GREEN)β xorriso$(RESET)" || echo "$(RED)β xorriso β apt install xorriso / dnf install xorriso$(RESET)"
@command -v $(QEMU) >/dev/null 2>&1 && echo "$(GREEN)β qemu$(RESET)" || echo "$(RED)β qemu β apt install qemu-system-x86 / dnf install qemu$(RESET)"
@if [ "$(OVMF_CODE)" != "OVMF_NOT_FOUND" ]; then \
echo "$(GREEN)β OVMF ($(OVMF_CODE))$(RESET)"; \
else \
echo "$(YELLOW)β OVMF not found (needed for UEFI boot only)$(RESET)"; \
fi
@rustc --version 2>/dev/null || true
@echo ""
## Clean build artifacts
clean:
cargo clean
@rm -f $(ISO_FILE)
@echo "$(GREEN)β Cleaned$(RESET)"
## Auto-download Limine bootloader if not present
limine:
@if [ ! -f "limine/BOOTX64.EFI" ]; then \
echo "$(CYAN)ββ Downloading Limine bootloader ββ$(RESET)"; \
rm -rf limine; \
git clone https://github.com/limine-bootloader/limine.git \
--branch=v8.x-binary --depth=1; \
if [ -f limine/Makefile ]; then make -C limine 2>/dev/null || true; fi; \
if [ -f limine/BOOTX64.EFI ]; then \
echo "$(GREEN)β Limine ready$(RESET)"; \
else \
echo "$(RED)β Limine download failed$(RESET)"; exit 1; \
fi; \
fi