summaryrefslogtreecommitdiff
path: root/Makefile
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