blob: 12aadf8253ab5ba6b669f420cb10b22e944cd9a9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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
|