# See: https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases # See: https://github.com/xpack-dev-tools/qemu-riscv-xpack/releases GCC_VER := 14.2.0-3 QEMU_VER := 8.2.6-1 SYS_TOOLPREFIX ?= riscv64-linux-gnu GCC_PATH := toolchain/gcc/bin LOCAL_TOOLPREFIX := $(GCC_PATH)/riscv-none-elf # TODO: Some wildcard condition to detect prefix TOOLPREFIX := $(LOCAL_TOOLPREFIX) # TOOLPREFIX := $(SYS_TOOLPREFIX) QEMU_PATH := toolchain/qemu/bin QEMU = $(QEMU_PATH)/qemu-system-riscv64 CC = $(TOOLPREFIX)-gcc AS = $(TOOLPREFIX)-as LD = $(TOOLPREFIX)-ld OBJCOPY = $(TOOLPREFIX)-objcopy OBJDUMP = $(TOOLPREFIX)-objdump ASFLAGS = -march=rv64gc -mabi=lp64 LDFLAGS = -Tkern/kernel.ld LDFLAGS += -m elf64lriscv CFLAGS = -Wall -Werror -O CFLAGS += -Wno-unused-result CFLAGS += -mcmodel=medany CFLAGS += -march=rv64gc -mabi=lp64 CFLAGS += -ffreestanding CFLAGS += -fno-common CFLAGS += -nostdlib CFLAGS += -mno-relax CFLAGS += -std=gnu99 CFLAGS += -fno-stack-protector # Prevents code that needs libc / runtime support CFLAGS += -MD # Generate header dependency files (.d) CFLAGS += -fno-pie -no-pie # Fixed address linking CFLAGS += -ggdb -gdwarf-2 # GDB debug info CFLAGS += -fno-omit-frame-pointer # More reliable backtraces in GDB CFLAGS += -I. CFLAGS += -I./kern CFLAGS += -I./kern/libkern all: kern/kernel.elf build: all quickstart: make get_toolchain && bear -- make -j$(nproc) && make qemu KERNEL_OBJ := \ kern/entry.o \ kern/start.o \ kern/kalloc.o \ kern/libkern/string.o \ kern/libkern/proc.o \ kern/libkern/uart.o \ kern/libkern/panic.o \ kern/libkern/memory.o \ kern/libkern/spinlock.o \ kern/libkern/mini-printf.o \ kern/libkern/stdio.o \ kern/libkern/badrand.o kern/kernel.elf: $(KERNEL_OBJ) @echo LD $@ @$(LD) $(LDFLAGS) -o $@ $^ %.o: %.c @echo CC $@ @$(CC) $(CFLAGS) -nostdinc -I. -c $< -o $@ %.o: %.S @echo AS $@ @$(AS) $(ASFLAGS) -o $@ $< qemu: kern/kernel.elf @echo QEMU $< @$(QEMU) -machine virt -bios none -nographic -m 128M -smp 4 -kernel $< clean: find . -type f -name '*.[od(elf)]' -exec rm -f {} + format: find kern -type f -name '*.[ch]' -exec clang-format -i {} \; help: @echo "Available targets:" @echo " quickstart – Runs get_toolchain, build and qemu in sequence. Generates compile-commands.json. RUN ONLY ONCE" @echo " build - Build the project" @echo " qemu - Run the kernel in qemu" @echo " clean – Remove build artifacts (*.o, *.d, *.elf)" @echo " distclean – Same as clean, but also purges toolchain" @echo " format – Run clang-format over all kernel sources" @echo " get_toolchain – Fetchest the toolchain and extracts it into ./toolchain" @echo " info – Get some general info on toolchain versions and flags" TOOLCHAIN_DIR := toolchain QEMU_TARBALL := xpack-qemu-riscv-$(QEMU_VER)-linux-x64.tar.gz GCC_TARBALL := xpack-riscv-none-elf-gcc-$(GCC_VER)-linux-x64.tar.gz QEMU_URL := https://github.com/xpack-dev-tools/qemu-riscv-xpack/releases/download/v$(QEMU_VER)/$(QEMU_TARBALL) GCC_URL := https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v$(GCC_VER)/$(GCC_TARBALL) QEMU_TARPATH := toolchain/$(QEMU_TARBALL) GCC_TARPATH := toolchain/$(GCC_TARBALL) QEMU_SYM_DIR := xpack-qemu-riscv-$(QEMU_VER) GCC_SYM_DIR := xpack-riscv-none-elf-gcc-$(GCC_VER) $(TOOLCHAIN_DIR): @mkdir -p $@ $(QEMU_TARPATH): $(TOOLCHAIN_DIR) @echo "Fetching qemu-riscv-xpack: v$(QEMU_VER)" @curl -# -L -o $@ $(QEMU_URL) $(GCC_TARPATH): $(TOOLCHAIN_DIR) @echo "Fetching riscv-none-elf-gcc-xpack: v$(GCC_VER)" @curl -# -L -o $@ $(GCC_URL) get_toolchain: $(TOOLCHAIN_DIR) $(GCC_TARPATH) $(QEMU_TARPATH) @echo "Unpacking qemu..." @cd toolchain && tar xf $(QEMU_TARBALL) @echo "Unpacking gcc..." @cd toolchain && tar xf $(GCC_TARBALL) @cd $(TOOLCHAIN_DIR) && ln -sfn $(QEMU_SYM_DIR) qemu @cd $(TOOLCHAIN_DIR) && ln -sfn $(GCC_SYM_DIR) gcc @echo "Toolchain in place, ready to make!" distclean: clean rm -rf $(TOOLCHAIN_DIR) info: @echo "Using qemu v$(QEMU_VER): $(QEMU)" @echo "Using toolchain gcc v$(GCC_VER): $(TOOLPREFIX)" @echo "CFLAGS:" @for flag in $(CFLAGS); do \ printf " %s\n" "$$flag"; \ done @echo "LDFLAGS:" @for flag in $(LDFLAGS); do \ printf " %s\n" "$$flag"; \ done -include *.d .PHONY: all qemu info quickstart help build