summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-01-03 02:19:57 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-01-03 02:19:57 +0800
commit210025560c80b48af4875af199f183ad709e3bf0 (patch)
treeeb11aeb7b641187f207e3b572c5184cf3526b463 /Makefile
parentbde87490d61135dcaa94d9b1489ff6c39876d169 (diff)
parent10614e04929a6d109a5e90524e446b637aaf0c13 (diff)
downloadlume-210025560c80b48af4875af199f183ad709e3bf0.tar.gz
lume-210025560c80b48af4875af199f183ad709e3bf0.tar.xz
Merge pull request #4 from Richard-Qin-001/dev/shell
Rebuilt the system's underlying structure; it is now stable enough to merge. The system now supports a read-only file system and has a simple shell implemented.
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile82
1 files changed, 63 insertions, 19 deletions
diff --git a/Makefile b/Makefile
index 3e06e89..51366d5 100644
--- a/Makefile
+++ b/Makefile
@@ -10,42 +10,80 @@ 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 := link.ld
+LINKER_SCRIPT := linker.ld
-UPROGS_SRC := $(SRC_DIR)/user/init.cc
-UPROGS_OBJ := $(BUILD_DIR)/user/init.o
-ULIB_OBJ := $(BUILD_DIR)/user/usys.o
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
+
INITCODE_BIN := $(BUILD_DIR)/user/initcode
-SRCS_S := $(shell find $(SRC_DIR) -name "*.S" -not -path "$(SRC_DIR)/user/*")
-SRCS_CXX := $(shell find $(SRC_DIR) -name "*.cc" -not -path "$(SRC_DIR)/user/*")
+SH_SRC := $(SRC_DIR)/user/sh.cc
+SH_OBJ := $(BUILD_DIR)/user/sh.o
+SH_BIN := $(BUILD_DIR)/user/sh
+
+INIT_SRC := $(SRC_DIR)/user/init.cc
+INIT_OBJ := $(BUILD_DIR)/user/init.o
+INIT_BIN := $(BUILD_DIR)/user/init
+
+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)
+all: $(TARGET) 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 " U_CXX $<"
+ @echo " USER_CC $<"
@$(CXX) $(CXXFLAGS) -c $< -o $@
$(BUILD_DIR)/user/%.o: $(SRC_DIR)/user/%.S
@mkdir -p $(dir $@)
- @echo " U_AS $<"
+ @echo " USER_AS $<"
@$(CC) $(CFLAGS) -c $< -o $@
-$(INITCODE_BIN): $(UPROGS_OBJ) $(ULIB_OBJ) $(USER_LD)
+
+$(INITCODE_BIN): $(BUILD_DIR)/user/init.o $(ULIB_OBJS) $(USER_LD)
@echo " U_LD $@"
- @$(LD) -T $(USER_LD) -o $@.out $(UPROGS_OBJ) $(ULIB_OBJ)
+ @$(LD) -T $(USER_LD) -o $@.out $(BUILD_DIR)/user/init.o $(ULIB_OBJS)
@$(OBJCOPY) -S -O binary $@.out $@
@$(OBJDUMP) -S $@.out > $@.asm
+$(SH_BIN): $(SH_OBJ) $(ULIB_OBJS) $(USER_LD)
+ @echo " SH_LD $@"
+ @$(LD) -T $(USER_LD) -o $@ $(SH_OBJ) $(ULIB_OBJS)
+ @$(OBJDUMP) -S $@ > $@.asm
+
$(TARGET): $(OBJS) $(LINKER_SCRIPT)
- @echo " LD $@"
+ @echo " K_LD $@"
@$(LD) -T $(LINKER_SCRIPT) -o $@ $(OBJS)
$(BUILD_DIR)/src/kernel/initcode.o: $(SRC_DIR)/kernel/initcode.S $(INITCODE_BIN)
@@ -55,23 +93,29 @@ $(BUILD_DIR)/src/kernel/initcode.o: $(SRC_DIR)/kernel/initcode.S $(INITCODE_BIN)
$(BUILD_DIR)/%.o: %.S
@mkdir -p $(dir $@)
- @echo " AS $<"
+ @echo " K_AS $<"
@$(CC) $(CFLAGS) -c $< -o $@
$(BUILD_DIR)/%.o: %.cc
@mkdir -p $(dir $@)
- @echo " CXX $<"
+ @echo " K_CXX $<"
@$(CXX) $(CXXFLAGS) -c $< -o $@
-run: $(TARGET)
+fs.img: $(SH_BIN)
+ @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
+ @mcopy -i fs.img $(SH_BIN) ::/sh
+
+run: $(TARGET) fs.img
@echo " QEMU Running..."
@qemu-system-riscv64 -machine virt -nographic \
- -kernel $(TARGET) -m 128M
+ -kernel $(TARGET) -m 128M $(QEMUOPTS)
-debug: $(TARGET)
+debug: $(TARGET) fs.img
@echo " QEMU (DEBUG) Waiting for GDB..."
@qemu-system-riscv64 -machine virt -nographic \
- -kernel $(TARGET) -m 128M -s -S
+ -kernel $(TARGET) -m 128M -s -S $(QEMUOPTS)
clean:
- rm -rf $(BUILD_DIR)
+ rm -rf $(BUILD_DIR) fs.img