-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMakefile
109 lines (75 loc) · 3.1 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
SYSROOT = sysroot
TARGET := i686-elf
ARCH := i686
INCLUDE_DIR := /usr/include
BOOT_DIR := /boot
LIB_DIR := /usr/lib
LIBK := libk.a
ISO := hafos-$(ARCH).iso
CROSS_DIR ?= ~/opt/cross/bin
CC := $(CROSS_DIR)/$(TARGET)-gcc --sysroot=$(SYSROOT) -isystem=$(INCLUDE_DIR)
AR := $(CROSS_DIR)/$(TARGET)-ar
WARNINGS := -Wall -Wextra -pedantic -Wshadow -Wpointer-arith -Wcast-align \
-Wwrite-strings -Wredundant-decls \
-Wnested-externs -Winline -Wno-long-long -Wstrict-prototypes
CFLAGS += -std=gnu11 -ffreestanding -fno-builtin $(WARNINGS)
CPPFLAGS += -Iinclude
LIBK := $(SYSROOT)$(LIB_DIR)/libk.a
KERNEL := $(SYSROOT)$(BOOT_DIR)/hafos.kernel
KERNEL_DIR := kernel
ARCH_DIR := $(KERNEL_DIR)/arch/$(ARCH)
QEMU_FLAGS += -no-shutdown -no-reboot -d unimp,guest_errors,cpu_reset
KERNEL_SRC_DIRS := $(KERNEL_DIR)/core $(KERNEL_DIR)/drivers $(ARCH_DIR)
KERNEL_SRC_FILES := $(shell find $(KERNEL_SRC_DIRS) -type f -name "*.c")
KERNEL_ASM_FILES := $(shell find $(KERNEL_SRC_DIRS) -type f -name "*.S")
KERNEL_DBG_FILES ?= $(shell find $(KERNEL_SRC_DIRS) -type f -name "*.d")
KERNEL_OBJS := $(patsubst %.c, %.o, $(KERNEL_SRC_FILES))
KERNEL_OBJS += $(patsubst %.S, %.o, $(KERNEL_ASM_FILES))
KERNEL_INCLUDE_DIR := $(KERNEL_DIR)/include
KERNEL_LIBS := -nostdlib -lk -lgcc
LIBX_DIR := libc
LIBK_CPPFLAGS += $(CPPFLAGS) -D__is_libk
LIBX_HDR_FILES := $(shell find $(LIBX_DIR) -type f -name "*.h")
LIBX_SRC_FILES := $(shell find $(LIBX_DIR) -type f -name "*.c")
LIBX_ASM_FILES := $(shell find $(LIBX_DIR) -type f -name "*.S")
LIBX_DBG_FILES ?= $(shell find $(LIBX_DIR) -type f -name "*.d")
LIBC_OBJS := $(patsubst %.c, %.o, $(LIBX_SRC_FILES))
LIBC_OBJS += $(patsubst %.c, %.o, $(LIBX_ASM_FILES))
LIBK_OBJS := $(LIBC_OBJS:.o=.libk.o)
.PHONY: all kernel-headers kernel-install iso run clean debug_run debug_gdb
.SUFFIXES: .o .libk.o .c .S
all: kernel-install
libk-headers:
mkdir -p $(SYSROOT)$(INCLUDE_DIR)/
cp $(LIBX_HDR_FILES) $(SYSROOT)$(INCLUDE_DIR)/
libk-install: $(LIBK)
$(LIBK): libk-headers kernel-headers $(LIBK_OBJS)
mkdir -p $(SYSROOT)$(LIB_DIR)/
$(AR) rcs $@ $(LIBK_OBJS)
kernel-headers:
mkdir -p $(SYSROOT)$(INCLUDE_DIR)/
cp -r $(KERNEL_INCLUDE_DIR)/* $(SYSROOT)$(INCLUDE_DIR)/
kernel-install: $(KERNEL)
$(KERNEL): kernel-headers libk-install $(KERNEL_OBJS) $(ARCH_DIR)/linker.ld
$(CC) -T $(ARCH_DIR)/linker.ld -o $@ $(CFLAGS) $(CPPFLAGS) $(KERNEL_OBJS) $(KERNEL_LIBS)
grub-file --is-x86-multiboot $(KERNEL)
iso: $(ISO)
$(ISO): $(KERNEL) $(SYSROOT)$(BOOT_DIR)/grub/grub.cfg
grub-mkrescue -o $(ISO) $(SYSROOT)
run: $(ISO)
qemu-system-i386 $(QEMU_FLAGS) -cdrom $(ISO)
debug_run: CFLAGS += -ggdb
debug_run: QEMU_FLAGS += -s -S
debug_run: run
debug_gdb:
gdb $(KERNEL) -ex 'set architecture i386' -ex 'target remote localhost:1234' -ex 'layout asm'
clean:
rm -rf $(KERNEL) $(ISO) $(KERNEL_OBJS) $(KERNEL_DBG_FILES) $(SYSROOT)$(INCLUDE_DIR)/ $(SYSROOT)$(LIB_DIR) $(LIBK_OBJS) $(LIBC_OBJS) $(LIBX_DBG_FILES)
.c.o:
$(CC) -MD -c $< -o $@ $(CFLAGS) $(CPPFLAGS)
.S.o:
$(CC) -MD -c $< -o $@ $(CFLAGS) $(CPPFLAGS)
.c.libk.o:
$(CC) -MD -c $< -o $@ $(CFLAGS) $(LIBK_CPPFLAGS)
.S.libk.o:
$(CC) -MD -c $< -o $@ $(CFLAGS) $(LIBK_CPPFLAGS)