neptune/Makefile
2025-09-02 02:47:47 +02:00

138 lines
3.5 KiB
Makefile

# 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
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 {} \;
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