-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
124 lines (89 loc) · 3.51 KB
/
Makefile
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
PHONY: run debug gdb objdump symbols docs style clean
CC = mipsel-elf
CFLAGS = -g -Wall -Wextra -Werror -nostdlib -fno-builtin
AFLAGS = --gen-debug -mips32
VM = qemu-system-mipsel
VMFLAGS = -M malta -m 256 -serial stdio
VMFLAGS_DEBUG = -M malta -m 256 -s -S
ELF_NAME = armadillo.elf
# Directories
SRC_DIR = src
KER_SRC = $(SRC_DIR)/kernel
CMN_SRC = $(SRC_DIR)/common
INC_DIR = $(SRC_DIR)/include
OBJ_DIR = obj
BIN_DIR = bin
# Source and object files
HEADER_SOURCES=$(wildcard $(INC_DIR)/*.h)
KERNEL_SOURCES=$(wildcard $(KER_SRC)/*.c)
COMMON_SOURCES=$(wildcard $(CMN_SRC)/*.c)
ASSEMBLY_SOURCES=$(wildcard $(KER_SRC)/*.S)
OBJECTS = $(patsubst $(KER_SRC)/%.c, $(OBJ_DIR)/%.o, $(KERNEL_SOURCES))
OBJECTS += $(patsubst $(CMN_SRC)/%.c, $(OBJ_DIR)/%.o, $(COMMON_SOURCES))
OBJECTS += $(patsubst $(KER_SRC)/%.S, $(OBJ_DIR)/%.o, $(ASSEMBLY_SOURCES))
# Files to clean up
CLEAN_FILES = $(shell find . -type f -name '*.orig' -o -name '*~' -o -name '*.out')
all:
@echo "usage: make [build|compile|run|debug|gdb|objdump|symbols|clean]"
build: $(BIN_DIR)/$(ELF_NAME)
compile: $(OBJECTS)
@echo "Compilation done..."
$(OBJ_DIR)/%.o: $(KER_SRC)/%.c
$(CC)-gcc -I $(INC_DIR) $(CFLAGS) -o $@ -c $<
$(OBJ_DIR)/%.o: $(CMN_SRC)/%.c
$(CC)-gcc -I $(INC_DIR) $(CFLAGS) -o $@ -c $<
$(OBJ_DIR)/%.s: $(KER_SRC)/%.S
$(CC)-gcc -I $(INC_DIR) -E -o $@ $<
$(OBJ_DIR)/%.o: $(OBJ_DIR)/%.s
$(CC)-as $(AFLAGS) -o $@ $<
$(BIN_DIR)/$(ELF_NAME): $(OBJECTS)
@echo "Linking the kernel..."
$(CC)-ld -T $(SRC_DIR)/linker.ld -o $(BIN_DIR)/$(ELF_NAME) $(OBJECTS)
run: $(BIN_DIR)/$(ELF_NAME)
@echo "Running $(ELF_NAME) on qemu with flags: $(VMFLAGS)"
@$(VM) $(VMFLAGS) -kernel $(BIN_DIR)/$(ELF_NAME)
#######################
# Unit testing
#######################
TEST_DIR = tests
TKER_DIR = $(TEST_DIR)/kernel
TEST_INC = $(TEST_DIR)/include
TEST_KERNEL = $(OBJ_DIR)/test_boot.o $(OBJ_DIR)/test_exception.o $(OBJ_DIR)/test_kernel.o $(OBJ_DIR)/test_main.o $(OBJ_DIR)/rand.o $(OBJ_DIR)/test_processes.o
TEST_SOURCES = $(wildcard $(TEST_DIR)/*.c)
$(OBJ_DIR)/%.o: $(TKER_DIR)/%.c
$(CC)-gcc -I $(INC_DIR) -I $(TEST_INC) $(CFLAGS) -o $@ -c $<
$(OBJ_DIR)/%.s: $(TKER_DIR)/%.S
$(CC)-gcc -I $(INC_DIR) -E -o $@ $<
$(OBJ_DIR)/%.o: $(OBJ_DIR)/%.s
$(CC)-as $(AFLAGS) -o $@ $<
$(OBJ_DIR)/%.o: $(TEST_DIR)/%.c
$(CC)-gcc -I $(INC_DIR) -I $(TEST_INC) -I ./src/kernel -I ./src/common $(CFLAGS) -o $@ -c $<
test: $(BIN_DIR)/armadillo_test
$(BIN_DIR)/armadillo_test: $(TEST_KERNEL) $(OBJ_DIR)/stdio.o $(OBJ_DIR)/stdlib.o $(OBJ_DIR)/test_stdlib.o $(OBJ_DIR)/memory.o $(OBJ_DIR)/test_memory.o $(OBJ_DIR)/pcb.o $(OBJ_DIR)/queue.o $(OBJ_DIR)/k_rand.o $(OBJ_DIR)/test_dispatcher.o $(OBJ_DIR)/stack.o $(OBJ_DIR)/test_stack.o
$(CC)-ld -T $(TEST_DIR)/linker.ld -o $@ $^
@$(VM) $(VMFLAGS) -kernel $@
#######################
# Debugging
#######################
debug: $(BIN_DIR)/$(ELF_NAME)
@echo "Running $(ELF_NAME) on qemu with flags: $(VMFLAGS_DEBUG)"
@$(VM) $(VMFLAGS_DEBUG) -kernel $(BIN_DIR)/$(ELF_NAME)
gdb: $(BIN_DIR)/$(ELF_NAME)
mipsel-elf-gdb --symbols=$(BIN_DIR)/$(ELF_NAME) -ex "target extended-remote :1234" -ex "layout regs"
objdump: $(BIN_DIR)/$(ELF_NAME)
mipsel-elf-objdump -D $(BIN_DIR)/$(ELF_NAME) > $(BIN_DIR)/armadillo.asm
symbols: $(BIN_DIR)/$(ELF_NAME)
mipsel-elf-nm -n $(BIN_DIR)/$(ELF_NAME)
#######################
# Documentation
#######################
documentation:
doxygen Doxyfile
style:
astyle --style=google --indent=tab=2 --indent-continuation=2 $(KERNEL_SOURCES) $(COMMON_SOURCES) $(TEST_SOURCES)
clean:
rm -rf bin/*
rm -rf obj/*
ifneq ($(CLEAN_FILES), )
rm -f $(CLEAN_FILES)
endif