diff options
Diffstat (limited to 'Makefile')
| -rw-r--r-- | Makefile | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d370666 --- /dev/null +++ b/Makefile @@ -0,0 +1,152 @@ +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 |
