summaryrefslogtreecommitdiff
path: root/lume-legacy/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'lume-legacy/Makefile')
-rw-r--r--lume-legacy/Makefile141
1 files changed, 141 insertions, 0 deletions
diff --git a/lume-legacy/Makefile b/lume-legacy/Makefile
new file mode 100644
index 0000000..0722f8c
--- /dev/null
+++ b/lume-legacy/Makefile
@@ -0,0 +1,141 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (C) 2026 Richard Qin
+
+# Try to find a suitable RISC-V toolchain prefix
+ifndef TOOLCHAIN_PREFIX
+ TOOLCHAIN_PREFIX := $(shell \
+ if command -v riscv64-linux-gnu-gcc >/dev/null 2>&1; then \
+ echo riscv64-linux-gnu-; \
+ elif command -v riscv64-unknown-gnu-gcc >/dev/null 2>&1; then \
+ echo riscv64-unknown-gnu-; \
+ elif command -v riscv64-unknown-linux-gnu-gcc >/dev/null 2>&1; then \
+ echo riscv64-unknown-linux-gnu-; \
+ elif command -v riscv64-unknown-elf-gcc >/dev/null 2>&1; then \
+ echo riscv64-unknown-elf-; \
+ else \
+ echo riscv64-linux-gnu-; \
+ fi)
+endif
+
+CC := $(TOOLCHAIN_PREFIX)gcc
+CXX := $(TOOLCHAIN_PREFIX)g++
+LD := $(TOOLCHAIN_PREFIX)ld
+OBJCOPY := $(TOOLCHAIN_PREFIX)objcopy
+OBJDUMP := $(TOOLCHAIN_PREFIX)objdump
+
+BUILD_DIR := build
+SRC_DIR := src
+
+CFLAGS := -Wall -Wextra -O2 -g -ffreestanding -nostdlib -mcmodel=medany -Iinclude
+CXXFLAGS := $(CFLAGS) -fno-exceptions -fno-rtti -fno-use-cxa-atexit
+LINKER_SCRIPT := linker.ld
+
+USER_LD := $(SRC_DIR)/user/user.ld
+ULIB_OBJS := $(BUILD_DIR)/user/entry.o \
+ $(BUILD_DIR)/user/usys.o \
+ $(BUILD_DIR)/ulib/stdio.o \
+ $(BUILD_DIR)/ulib/stdlib.o \
+ $(BUILD_DIR)/ulib/string.o \
+ $(BUILD_DIR)/ulib/cxx.o \
+ $(BUILD_DIR)/ulib/iostream.o \
+ $(BUILD_DIR)/ulib/syscalls.o
+
+INITCODE_BIN := $(BUILD_DIR)/user/initcode
+
+
+USER_SRCS := $(wildcard $(SRC_DIR)/user/*.cc)
+UPROGS := $(patsubst $(SRC_DIR)/user/%.cc, $(BUILD_DIR)/user/%, $(USER_SRCS))
+
+SRCS_S := $(shell find $(SRC_DIR) -name "*.S" -not -path "$(SRC_DIR)/user/*" -not -path "$(SRC_DIR)/ulib/*")
+SRCS_CXX := $(shell find $(SRC_DIR) -name "*.cc" -not -path "$(SRC_DIR)/user/*" -not -path "$(SRC_DIR)/ulib/*")
+OBJS := $(SRCS_S:%.S=$(BUILD_DIR)/%.o) $(SRCS_CXX:%.cc=$(BUILD_DIR)/%.o)
+
+TARGET := $(BUILD_DIR)/kernel.elf
+
+QEMUOPTS = -drive file=fs.img,if=none,format=raw,id=x0
+QEMUOPTS += -device virtio-blk-device,drive=x0 -global virtio-mmio.force-legacy=false
+
+.PHONY: all clean run debug
+
+all: $(TARGET) $(INITCODE_BIN) $(UPROGS) fs.img
+
+
+$(BUILD_DIR)/ulib/%.o: $(SRC_DIR)/ulib/%.c
+ @mkdir -p $(dir $@)
+ @echo " ULIB_C $<"
+ @$(CC) $(CFLAGS) -c $< -o $@
+
+$(BUILD_DIR)/ulib/%.o: $(SRC_DIR)/ulib/%.cc
+ @mkdir -p $(dir $@)
+ @echo " ULIB_CC $<"
+ @$(CXX) $(CXXFLAGS) -c $< -o $@
+
+$(BUILD_DIR)/ulib/%.o: $(SRC_DIR)/ulib/%.cpp
+ @mkdir -p $(dir $@)
+ @echo " ULIB_CPP $<"
+ @$(CXX) $(CXXFLAGS) -c $< -o $@
+
+$(BUILD_DIR)/user/%.o: $(SRC_DIR)/user/%.cc
+ @mkdir -p $(dir $@)
+ @echo " USER_CC $<"
+ @$(CXX) $(CXXFLAGS) -c $< -o $@
+
+$(BUILD_DIR)/user/%.o: $(SRC_DIR)/user/%.S
+ @mkdir -p $(dir $@)
+ @echo " USER_AS $<"
+ @$(CC) $(CFLAGS) -c $< -o $@
+
+$(INITCODE_BIN): $(BUILD_DIR)/user/init.o $(ULIB_OBJS) $(USER_LD)
+ @echo " U_LD $@"
+ @$(LD) -T $(USER_LD) -o $@.out $(BUILD_DIR)/user/init.o $(ULIB_OBJS)
+ @$(OBJCOPY) -S -O binary $@.out $@
+ @$(OBJDUMP) -S $@.out > $@.asm
+
+
+$(BUILD_DIR)/user/%: $(BUILD_DIR)/user/%.o $(ULIB_OBJS) $(USER_LD)
+ @echo " USER_LD $@"
+ @$(LD) -T $(USER_LD) -o $@ $< $(ULIB_OBJS)
+ @$(OBJDUMP) -S $@ > $@.asm
+ @$(OBJDUMP) -t $@ | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $@.sym
+
+
+$(TARGET): $(OBJS) $(LINKER_SCRIPT)
+ @echo " K_LD $@"
+ @$(LD) -T $(LINKER_SCRIPT) -o $@ $(OBJS)
+ @echo " K_ASM $@.asm"
+ @$(OBJDUMP) -S $@ > $@.asm
+ @$(OBJDUMP) -t $@ | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $@.sym
+
+$(BUILD_DIR)/src/kernel/initcode.o: $(SRC_DIR)/kernel/initcode.S $(INITCODE_BIN)
+ @mkdir -p $(dir $@)
+ @echo " AS_INC $<"
+ @$(CC) $(CFLAGS) -c $< -o $@
+
+$(BUILD_DIR)/%.o: %.S
+ @mkdir -p $(dir $@)
+ @echo " K_AS $<"
+ @$(CC) $(CFLAGS) -c $< -o $@
+
+$(BUILD_DIR)/%.o: %.cc
+ @mkdir -p $(dir $@)
+ @echo " K_CXX $<"
+ @$(CXX) $(CXXFLAGS) -c $< -o $@
+
+fs.img: $(UPROGS)
+ @echo " IMG Generating fs.img (FAT32)"
+ @dd if=/dev/zero of=fs.img bs=1M count=32 2>/dev/null
+ @mkfs.vfat -F 32 fs.img >/dev/null
+ $(foreach prog,$(UPROGS),mcopy -i fs.img $(prog) ::/$(notdir $(prog));)
+
+run: $(TARGET) fs.img
+ @echo " QEMU Running..."
+ @qemu-system-riscv64 -machine virt -nographic \
+ -kernel $(TARGET) -m 128M $(QEMUOPTS)
+
+debug: $(TARGET) fs.img
+ @echo " QEMU (DEBUG) Waiting for GDB..."
+ @qemu-system-riscv64 -machine virt -nographic \
+ -kernel $(TARGET) -m 128M -s -S $(QEMUOPTS)
+
+clean:
+ rm -rf $(BUILD_DIR) fs.img \ No newline at end of file