neptune/Makefile
2025-09-02 05:00:14 +02:00

153 lines
4.2 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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