export ARCH ?= x86_64 DEBUG ?= 1 RUST_LIB_PATH=debug CARGO_FLAGS = #QEMU_DEBUG=-d int -no-reboot -no-shutdown TARGET=kernel.iso ifeq ($(DEBUG), 0) RUST_LIB_PATH=release CARGO_FLAGS=--release endif ifeq ($(ARCH), x86) QEMU = qemu-system-i386 QEMU_OPTS = -serial file:serial.log MACHINE = -machine q35 BOOT = -cdrom kernel.iso ARCH_PREFIX = i386-elf- target = "./arch/x86.json" RUST_OBJS = ../target/x86/$(RUST_LIB_PATH)/libmyrustkernel.a ASM_PATHS = ./arch/x86/boot ASM_PATHS += ./arch/x86/common/boot CARGO_B = --target "./arch/x86.json" LD_SCRIPT=../arch/x86.ld endif ifeq ($(ARCH), x86_64) QEMU = qemu-system-x86_64 QEMU_OPTS = -serial file:serial.log MACHINE = -machine q35 BOOT = -cdrom kernel.iso ARCH_PREFIX = x86_64-elf- target = "./arch/x86_64.json" RUST_OBJS = ../target/x86_64/$(RUST_LIB_PATH)/libmyrustkernel.a ASM_PATHS = ./arch/x86_64/boot ASM_PATHS += ./arch/x86/common/boot CARGO_B = --target "./arch/x86_64.json" LD_SCRIPT=../arch/x86_64.ld endif ifeq ($(ARCH), riscv64) QEMU = qemu-system-riscv64 QEMU_OPTS = -nographic -serial mon:stdio MACHINE = -machine virt -bios none BOOT = -kernel ./src/kernel.bin ARCH_PREFIX = riscv64-elf- target = "./arch/riscv64.json" RUST_OBJS = ../target/riscv64/$(RUST_LIB_PATH)/libmyrustkernel.a ASM_PATHS = ./arch/riscv64/boot CARGO_B = --target "./arch/riscv64.json" LD_SCRIPT=../arch/riscv64.ld TARGET=src/kernel.bin endif ifndef ARCH_PREFIX $(error ARCH available: "x86_64", "x86", "riscv64") endif CC = $(ARCH_PREFIX)gcc AS = $(ARCH_PREFIX)as LD = $(ARCH_PREFIX)ld OBJDUMP = $(ARCH_PREFIX)objcopy OBJCOPY = $(ARCH_PREFIX)objdump W := -Wall -Werror -Wextra -Wshadow -Wcast-align # W:= -Wpointer-arith -pedantic -Wmissing-prototypes -Wmissing-declarations W += -Wwrite-strings -Wredundant-decls -Wnested-externs -Winline -Wno-long-long W += -Wconversion -Wstrict-prototypes WNO := -Wno-error=unused-parameter -Wno-error=unused-variable WNO += -Wno-error=unused-but-set-variable -Wno-error=unused-but-set-parameter WNO += -Wno-error=infinite-recursion CFLAGS = $(W) $(WNO) -fno-omit-frame-pointer CFLAGS += -MD -O3 -ffreestanding -nostdlib -std=gnu89 CFLAGS += -fno-common -fno-stack-protector CFLAGS += -fno-pie -no-pie -fno-pic CFLAGS += -g -fsanitize=undefined #CFLAGS += -fstack-protector-all LDFLAGS = -z max-page-size=4096 ifeq ($(ARCH), x86) CFLAGS += -mgeneral-regs-only endif ifeq ($(ARCH), x86_64) CFLAGS += -mcmodel=large CFLAGS += -mgeneral-regs-only endif ifeq ($(ARCH), riscv64) CFLAGS += -mcmodel=medany endif MAKE:=$(MAKE) -s all: $(TARGET) FORCE: src/kernel.bin: FORCE cargo b $(CARGO_B) $(CARGO_FLAGS) @rm -f src/kernel.bin @$(MAKE) -C $(@D) isodir: $(info [all] $@) @mkdir -p isodir/boot/grub @cp src/grub.cfg isodir/boot/grub/grub.cfg @mkdir -p isodir/modules @dd if=/dev/zero of=isodir/modules/ext2.img bs=4M count=2 > /dev/null 2>&1 @mkfs.ext2 isodir/modules/ext2.img > /dev/null 2>&1 kernel.iso: src/kernel.bin src/grub.cfg Makefile isodir FORCE $(info [all] $@) @cp src/kernel.bin isodir/boot/kernel.bin @sudo cp src/kernel.bin /srv/tftp/boot/kernel.bin @grub-mkrescue -o kernel.iso isodir > /dev/null 2>&1 .PHONY: all build qemu bochs mount umount clean BOCHS = bochs -q qemu: kernel.iso $(QEMU) $(MACHINE) $(BOOT) $(QEMU_OPTS) $(QEMU_DEBUG) @cat serial.log bochs: kernel.iso @$(BOCHS) -qf .bochsrc @cat serial.log mount: isodir ifeq ("$(wildcard /mnt/ext2/lost+found/)","") $(info [all] $@) @doas mount isodir/modules/ext2.img /mnt/ext2 -o loop @doas chown -R aleksa:aleksa /mnt/ext2 endif umount: ifneq ("$(wildcard /mnt/ext2/lost+found/)","") $(info [all] $@) @doas umount /mnt/ext2 endif clean: @find ./src/ -name "*.o" -exec rm {} \; @find ./src/ -name "*.d" -exec rm {} \; @rm -f kernel.iso src/kernel.bin xbochs.log bx_enh_dbg.ini log serial.log @rm -rf isodir @cargo clean @$(MAKE) umount