neptune/Makefile
2025-09-01 21:51:14 +02:00

117 lines
3.2 KiB
Makefile

# 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