# TOOLPREFIX = riscv64-linux-gnu # TOOLPREFIX = toolchain/xpack-riscv-none-elf-gcc-14.2.0-3/bin/riscv-none-elf TOOLPREFIX = toolchain/gcc/bin/riscv-none-elf CC = $(TOOLPREFIX)-gcc AS = $(TOOLPREFIX)-as LD = $(TOOLPREFIX)-ld OBJCOPY = $(TOOLPREFIX)-objcopy OBJDUMP = $(TOOLPREFIX)-objdump ASFLAGS = -march=rv64gc -mabi=lp64 LDFLAGS = -Tkernel.ld LDFLAGS += -m elf64lriscv CFLAGS = -Wall -Werror -O CFLAGS += -Wno-unused-result CFLAGS += -mcmodel=medany CFLAGS += -march=rv64gc -mabi=lp64 CFLAGS += -ffreestanding -fno-common -nostdlib -mno-relax 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 KCFLAGS += $(CGFLAGS) KCFLAGS += -DNEPTUNE_KERNEL KCFLAGS += -Ikern KCFLAGS += -Ikern/libkern KCFLAGS += -I. CFLAGS += -I. CFLAGS += -Ilib all: kernel.elf main: main.o kernel.elf: entry.o start.o kern/libkern/string.o kern/libkern/proc.o kern/libkern/uart.o kern/libkern/panic.o kern/kalloc.o kern/libkern/memory.o kern/ispinlock.o kern/libkern/spinlock.o kern/libkern/string.o kern/libkern/mini-printf.o @echo LD $@ @$(LD) $(LDFLAGS) -o $@ $^ %.o: %.c @echo CC $@ @$(CC) $(KCFLAGS) -nostdinc -I. -c $< -o $@ %.o: %.S @echo AS $@ @$(AS) $(ASFLAGS) -o $@ $< qemu: kernel.elf @echo QEMU $< @qemu-system-riscv64 -machine virt -bios none -nographic -m 128M -smp 4 -kernel kernel.elf clean: rm -f *.o *.elf *.d lib/*.o lib/*.d fd -e o -x rm # TODO: Should only depend on posix -include *.d # -------------------------------------------------------------------- # Toolchain configuration # -------------------------------------------------------------------- TOOLCHAIN_DIR := toolchain # Versions QEMU_VER := 8.2.6-1 GCC_VER := 14.2.0-3 # Filenames QEMU_TARBALL := xpack-qemu-riscv-$(QEMU_VER)-linux-arm.tar.gz GCC_TARBALL := xpack-riscv-none-elf-gcc-$(GCC_VER)-linux-arm.tar.gz # URLs 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) # Paths QEMU_TARPATH := toolchain/xpack-qemu-riscv-8.2.6-1-linux-arm.tar.gz GCC_TARPATH := toolchain/xpack-riscv-none-elf-gcc-14.2.0-3-linux-arm.tar.gz # Extracted directories QEMU_DIR := $(TOOLCHAIN_DIR)/xpack-qemu-riscv-$(QEMU_VER) GCC_DIR := $(TOOLCHAIN_DIR)/xpack-riscv-none-elf-gcc-$(GCC_VER) # Symlink targets QEMU_SYM_DIR := xpack-qemu-riscv-$(QEMU_VER) GCC_SYM_DIR := xpack-riscv-none-elf-gcc-$(GCC_VER) # Final symlink/alias GCC_ALIAS := gcc QEMU_ALIAS := qemu QEMU_TARPATH: curl -# -L -o $@ $(QEMU_URL) GCC_TARPATH: curl -# -L -o $@ $(GCC_URL) extractions: cd toolchain && tar xf $(QEMU_TARBALL) cd toolchain && tar xf $(GCC_TARBALL) toolchain: $(QEMU_TARPATH) $(GCC_TARPATH) mkdir -p toolchain cd toolchain && tar xf $(QEMU_TARBALL) cd toolchain && tar xf $(GCC_TARBALL) cd $(TOOLCHAIN_DIR) && ln -sfn $(QEMU_SYM_DIR) $(QEMU_ALIAS) cd $(TOOLCHAIN_DIR) && ln -sfn $(GCC_SYM_DIR) $(GCC_ALIAS) distclean: clean rm -rf $(TOOLCHAIN_DIR) .PHONY: all toolchain