summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile84
1 files changed, 84 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..12aadf8
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,84 @@
+CC = clang
+LD = ld.lld
+OBJCOPY = llvm-objcopy
+
+ARCH_FLAG = \
+ --target=riscv32-unknown-elf \
+ -march=rv32im \
+ -mabi=ilp32
+
+KERNEL_FLAG = \
+ -ffreestanding \
+ -fno-builtin \
+ -fno-stack-protector \
+ -fno-exceptions \
+ -fno-rtti \
+ -fno-unwind-tables \
+ -fno-asynchronous-unwind-tables \
+ -nostdlib \
+ -nostdinc \
+ -static \
+ -nodefaultlibs
+
+SECTION_FLAG = \
+ -ffunction-sections \
+ -fdata-sections \
+ -fno-common
+
+INCLUDE_FLAG = -Iinclude -Isrc
+OPT_FLAG = -O2 -g3
+WARN_FLAG = -Wall -Wextra -Werror -Wundef
+
+CFLAGS = $(ARCH_FLAG) $(KERNEL_FLAG) $(SECTION_FLAG) $(INCLUDE_FLAG) $(OPT_FLAG) $(WARN_FLAG)
+
+C_SRCS = $(wildcard src/*.c)
+ASM_SRCS = $(wildcard src/*.S)
+
+C_OBJS = $(notdir $(C_SRCS:.c=.o))
+ASM_OBJS = $(notdir $(ASM_SRCS:.S=.o))
+OBJS = $(C_OBJS) $(ASM_OBJS)
+
+KERNEL_ELF = out/bin/wkern.elf
+KERNEL_BIN = out/bin/wkern.bin
+MAP_FILE = out/bin/kernel.map
+
+OBJ_DIR = out/objects
+BIN_DIR = out/bin
+OBJS_PATH = $(addprefix $(OBJ_DIR)/, $(OBJS))
+
+LD_FLAG = -T linker.ld -fuse-ld=lld -Wl,-nostdlib -Wl,-melf32lriscv -Wl,--gc-sections -Wl,-Map=$(MAP_FILE)
+OBJCOPY_FLAG = -O binary \
+ --strip-all \
+ --remove-section=.comment \
+ --remove-section=.debug* \
+ --remove-section=.note* \
+ --remove-section=.eh_frame \
+ --remove-section=.eh_frame_ptr \
+ --remove-section=.eh_frame_hdr \
+
+
+.PHONY: all clean
+all: $(KERNEL_BIN)
+
+$(OBJ_DIR)/%.o: src/%.c | $(OBJ_DIR)
+ @echo " CC $<"
+ $(CC) $(CFLAGS) -c $< -o $@
+
+$(OBJ_DIR)/%.o: src/%.S | $(OBJ_DIR)
+ @echo " AS $<"
+ $(CC) $(CFLAGS) -c $< -o $@
+
+$(KERNEL_ELF): $(OBJS_PATH) linker.ld | $(BIN_DIR)
+ @echo " LD $@"
+ $(CC) $(CFLAGS) $(LD_FLAG) $(OBJS_PATH) -o $@
+
+$(KERNEL_BIN): $(KERNEL_ELF) | $(BIN_DIR)
+ @echo " OBJCOPY $@"
+ $(OBJCOPY) $(OBJCOPY_FLAG) $(KERNEL_ELF) $(KERNEL_BIN)
+
+$(OBJ_DIR) $(BIN_DIR):
+ mkdir -p $@
+
+clean:
+ rm -rf out
+