mirror of
https://github.com/xomboverlord/xomb.git
synced 2026-01-10 01:36:37 +01:00
249 lines
8.1 KiB
Makefile
249 lines
8.1 KiB
Makefile
# XOmB Exokernel Makefile
|
|
#
|
|
# Targets:
|
|
# make build - Build both UEFI and multiboot2 kernels
|
|
# make build-uefi - Build UEFI kernel only
|
|
# make build-mb2 - Build multiboot2 kernel only (for Bochs)
|
|
# make qemu - Run UEFI kernel in QEMU
|
|
# make bochs - Run multiboot2 kernel in Bochs
|
|
# make qemu-gdb - Run in QEMU with GDB server
|
|
# make test - Run unit tests on host
|
|
# make clippy - Run clippy lints
|
|
# make fmt - Format code
|
|
# make clean - Clean build artifacts
|
|
|
|
# Targets
|
|
TARGET_UEFI := x86_64-unknown-uefi
|
|
TARGET_MB2 := x86_64-xomb.json
|
|
|
|
# Build directories
|
|
BUILD_DIR_UEFI := target/$(TARGET_UEFI)
|
|
BUILD_DIR_MB2 := target/x86_64-xomb
|
|
|
|
# Output files
|
|
DEBUG_EFI := $(BUILD_DIR_UEFI)/debug/xomb-uefi.efi
|
|
RELEASE_EFI := $(BUILD_DIR_UEFI)/release/xomb-uefi.efi
|
|
DEBUG_ELF := $(BUILD_DIR_MB2)/debug/xomb-multiboot2
|
|
RELEASE_ELF := $(BUILD_DIR_MB2)/release/xomb-multiboot2
|
|
|
|
# OVMF firmware paths (adjust for your system)
|
|
# Ubuntu/Debian: /usr/share/OVMF/
|
|
# Fedora: /usr/share/edk2/ovmf/
|
|
# Arch: /usr/share/ovmf/x64/
|
|
OVMF_DIR ?= /usr/share/OVMF
|
|
OVMF_CODE ?= $(OVMF_DIR)/OVMF_CODE_4M.fd
|
|
OVMF_VARS ?= $(OVMF_DIR)/OVMF_VARS_4M.fd
|
|
|
|
# ESP (EFI System Partition) image
|
|
ESP_DIR := esp
|
|
ESP_IMG := esp.img
|
|
|
|
# QEMU settings
|
|
QEMU := qemu-system-x86_64
|
|
QEMU_MEMORY := 512M
|
|
QEMU_UEFI := \
|
|
-machine q35 \
|
|
-m $(QEMU_MEMORY) \
|
|
-drive if=pflash,format=raw,readonly=on,file=$(OVMF_CODE) \
|
|
-drive if=pflash,format=raw,file=OVMF_VARS.fd \
|
|
-drive format=raw,file=$(ESP_IMG) \
|
|
-serial stdio \
|
|
-no-reboot
|
|
|
|
QEMU_MB2 := \
|
|
-machine q35 \
|
|
-m $(QEMU_MEMORY) \
|
|
-kernel $(DEBUG_ELF) \
|
|
-serial stdio \
|
|
-no-reboot
|
|
|
|
# Bochs settings
|
|
BOCHS := /home/$(USER)/Bochs/usr/bin/bochs
|
|
BOCHSRC := bochsrc.txt
|
|
|
|
# Build-std flags
|
|
BUILD_STD := -Z build-std=core,compiler_builtins,alloc -Z build-std-features=compiler-builtins-mem
|
|
BUILD_STD_NO_ALLOC := -Z build-std=core,compiler_builtins -Z build-std-features=compiler-builtins-mem
|
|
|
|
.PHONY: all build build-uefi build-mb2 release qemu bochs qemu-gdb qemu-mb2 test clippy fmt clean setup help
|
|
|
|
all: build
|
|
|
|
# Build both kernels
|
|
build: build-uefi build-mb2
|
|
|
|
# Build UEFI kernel
|
|
build-uefi:
|
|
cargo build --bin xomb-uefi --features uefi --target $(TARGET_UEFI) $(BUILD_STD)
|
|
|
|
# Build multiboot2 kernel
|
|
build-mb2:
|
|
cargo build --bin xomb-multiboot2 --features multiboot2 --target $(TARGET_MB2) $(BUILD_STD_NO_ALLOC)
|
|
|
|
# Release builds
|
|
release: release-uefi release-mb2
|
|
|
|
release-uefi:
|
|
cargo build --release --bin xomb-uefi --features uefi --target $(TARGET_UEFI) $(BUILD_STD)
|
|
|
|
release-mb2:
|
|
cargo build --release --bin xomb-multiboot2 --features multiboot2 --target $(TARGET_MB2) $(BUILD_STD_NO_ALLOC)
|
|
|
|
# Create ESP filesystem image
|
|
esp: build-uefi
|
|
@echo "Creating EFI System Partition image..."
|
|
@mkdir -p $(ESP_DIR)/EFI/BOOT
|
|
@cp $(DEBUG_EFI) $(ESP_DIR)/EFI/BOOT/BOOTX64.EFI
|
|
@dd if=/dev/zero of=$(ESP_IMG) bs=1M count=64 2>/dev/null
|
|
@mkfs.fat -F 32 $(ESP_IMG) >/dev/null
|
|
@mcopy -i $(ESP_IMG) -s $(ESP_DIR)/EFI ::
|
|
|
|
esp-release: release-uefi
|
|
@echo "Creating EFI System Partition image (release)..."
|
|
@mkdir -p $(ESP_DIR)/EFI/BOOT
|
|
@cp $(RELEASE_EFI) $(ESP_DIR)/EFI/BOOT/BOOTX64.EFI
|
|
@dd if=/dev/zero of=$(ESP_IMG) bs=1M count=64 2>/dev/null
|
|
@mkfs.fat -F 32 $(ESP_IMG) >/dev/null
|
|
@mcopy -i $(ESP_IMG) -s $(ESP_DIR)/EFI ::
|
|
|
|
# Copy OVMF_VARS to local directory (needed for writable vars)
|
|
OVMF_VARS.fd:
|
|
@if [ -f "$(OVMF_VARS)" ]; then \
|
|
cp "$(OVMF_VARS)" OVMF_VARS.fd; \
|
|
else \
|
|
echo "Error: OVMF_VARS not found at $(OVMF_VARS)"; \
|
|
echo "Please install OVMF or set OVMF_DIR"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
# Run targets
|
|
run: qemu
|
|
|
|
# QEMU with UEFI
|
|
qemu: esp OVMF_VARS.fd
|
|
@echo "Starting QEMU (UEFI)..."
|
|
$(QEMU) $(QEMU_UEFI)
|
|
|
|
qemu-release: esp-release OVMF_VARS.fd
|
|
@echo "Starting QEMU (UEFI, release build)..."
|
|
$(QEMU) $(QEMU_UEFI)
|
|
|
|
qemu-gdb: esp OVMF_VARS.fd
|
|
@echo "Starting QEMU with GDB server on :1234..."
|
|
@echo "Connect with: rust-gdb -ex 'target remote :1234'"
|
|
$(QEMU) $(QEMU_UEFI) -s -S
|
|
|
|
# QEMU with multiboot2 (boots from GRUB ISO)
|
|
qemu-mb2: $(BOOT_ISO)
|
|
@echo "Starting QEMU (multiboot2 via GRUB ISO)..."
|
|
$(QEMU) -machine q35 -m $(QEMU_MEMORY) -cdrom $(BOOT_ISO) -serial stdio -no-reboot
|
|
|
|
# Bootable ISO for Bochs (GRUB + multiboot2 kernel)
|
|
BOOT_ISO := xomb.iso
|
|
ISO_DIR := iso_staging
|
|
|
|
$(BOOT_ISO): build-mb2
|
|
@echo "Creating GRUB bootable ISO..."
|
|
@mkdir -p $(ISO_DIR)/boot/grub
|
|
@cp $(DEBUG_ELF) $(ISO_DIR)/boot/xomb-multiboot2
|
|
@cp boot/grub/grub.cfg $(ISO_DIR)/boot/grub/
|
|
@grub-mkrescue -o $(BOOT_ISO) $(ISO_DIR) 2>/dev/null || \
|
|
(echo "Error: grub-mkrescue failed. Install grub-pc-bin and xorriso." && exit 1)
|
|
@rm -rf $(ISO_DIR)
|
|
@echo "Bootable ISO created: $(BOOT_ISO)"
|
|
|
|
# Bochs with multiboot2 (boots from ISO)
|
|
bochs: $(BOOT_ISO)
|
|
@echo "Starting Bochs (multiboot2 via GRUB ISO)..."
|
|
@if [ ! -f "$(BOCHSRC)" ]; then \
|
|
echo "Error: $(BOCHSRC) not found"; \
|
|
exit 1; \
|
|
fi
|
|
$(BOCHS) -f $(BOCHSRC) -q
|
|
|
|
# Alternative: QEMU with ISO (useful for testing GRUB boot)
|
|
qemu-iso: $(BOOT_ISO)
|
|
@echo "Starting QEMU with GRUB ISO..."
|
|
$(QEMU) -machine q35 -m $(QEMU_MEMORY) -cdrom $(BOOT_ISO) -serial stdio -no-reboot
|
|
|
|
# Testing
|
|
test:
|
|
cargo test --lib --target x86_64-unknown-linux-gnu
|
|
|
|
test-verbose:
|
|
cargo test --lib --target x86_64-unknown-linux-gnu -- --nocapture
|
|
|
|
# Linting and formatting
|
|
clippy:
|
|
cargo clippy --lib --target x86_64-unknown-linux-gnu -- -D warnings
|
|
cargo clippy --bin xomb-uefi --features uefi --target $(TARGET_UEFI) $(BUILD_STD) -- -D warnings
|
|
|
|
fmt:
|
|
cargo fmt
|
|
|
|
fmt-check:
|
|
cargo fmt -- --check
|
|
|
|
# Clean
|
|
clean:
|
|
cargo clean
|
|
rm -rf $(ESP_DIR) $(ESP_IMG) $(BOOT_ISO) $(ISO_DIR) OVMF_VARS.fd bochs.log debugger.log serial.log
|
|
|
|
# Setup helper - checks dependencies
|
|
setup:
|
|
@echo "Checking dependencies..."
|
|
@echo ""
|
|
@echo "Rust toolchain:"
|
|
@rustc --version || echo " ERROR: rustc not found"
|
|
@cargo --version || echo " ERROR: cargo not found"
|
|
@echo ""
|
|
@echo "Required components:"
|
|
@rustup component list --installed | grep -E "(rust-src|llvm-tools)" || echo " Run: rustup component add rust-src llvm-tools-preview"
|
|
@echo ""
|
|
@echo "Targets:"
|
|
@rustup target list --installed | grep -E "($(TARGET_UEFI)|$(TARGET_MB2))" || echo " Run: rustup target add $(TARGET_UEFI) $(TARGET_MB2)"
|
|
@echo ""
|
|
@echo "OVMF firmware:"
|
|
@if [ -f "$(OVMF_CODE)" ]; then echo " Found: $(OVMF_CODE)"; else echo " NOT FOUND: $(OVMF_CODE)"; fi
|
|
@if [ -f "$(OVMF_VARS)" ]; then echo " Found: $(OVMF_VARS)"; else echo " NOT FOUND: $(OVMF_VARS)"; fi
|
|
@echo ""
|
|
@echo "Emulators:"
|
|
@which qemu-system-x86_64 >/dev/null 2>&1 && echo " QEMU: $$(which qemu-system-x86_64)" || echo " QEMU: NOT FOUND"
|
|
@which bochs >/dev/null 2>&1 && echo " Bochs: $$(which bochs)" || echo " Bochs: NOT FOUND"
|
|
@echo ""
|
|
@echo "Disk tools:"
|
|
@which mkfs.fat >/dev/null 2>&1 && echo " mkfs.fat: OK" || echo " mkfs.fat: NOT FOUND (install dosfstools)"
|
|
@which mcopy >/dev/null 2>&1 && echo " mcopy: OK" || echo " mcopy: NOT FOUND (install mtools)"
|
|
@echo ""
|
|
@echo "Assembler:"
|
|
@which as >/dev/null 2>&1 && echo " as (GNU assembler): OK" || echo " as: NOT FOUND (install binutils)"
|
|
@echo ""
|
|
@echo "ISO creation:"
|
|
@which grub-mkrescue >/dev/null 2>&1 && echo " grub-mkrescue: OK" || echo " grub-mkrescue: NOT FOUND (install grub-common)"
|
|
@which xorriso >/dev/null 2>&1 && echo " xorriso: OK" || echo " xorriso: NOT FOUND (install xorriso)"
|
|
|
|
# Help
|
|
help:
|
|
@echo "XOmB Exokernel Build System"
|
|
@echo ""
|
|
@echo "Build commands:"
|
|
@echo " make build Build both UEFI and multiboot2 kernels"
|
|
@echo " make build-uefi Build UEFI kernel only"
|
|
@echo " make build-mb2 Build multiboot2 kernel only"
|
|
@echo " make release Build both in release mode"
|
|
@echo ""
|
|
@echo "Run commands:"
|
|
@echo " make qemu Run UEFI kernel in QEMU"
|
|
@echo " make qemu-mb2 Run multiboot2 kernel in QEMU"
|
|
@echo " make bochs Run multiboot2 kernel in Bochs"
|
|
@echo " make qemu-gdb Run UEFI kernel with GDB server"
|
|
@echo ""
|
|
@echo "Test commands:"
|
|
@echo " make test Run unit tests on host"
|
|
@echo " make clippy Run clippy lints"
|
|
@echo " make fmt Format code"
|
|
@echo ""
|
|
@echo "Other:"
|
|
@echo " make setup Check development dependencies"
|
|
@echo " make clean Remove build artifacts"
|