aboutsummaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile152
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