This repository has been archived by the owner on Nov 20, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathMakefile
131 lines (103 loc) · 3.39 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
125
126
127
128
129
130
131
# Globals and files to compile.
KERNEL := qword
KERNELELF := $(KERNEL).elf
KERNELHDD := $(KERNEL).hdd
SOURCEDIR := src
RUNDIR := run
LIMINE_URL := https://github.com/limine-bootloader/limine.git
LIMINE_DIR := limine
CFILES := $(shell find $(SOURCEDIR) -type f -name '*.c')
ASMFILES := $(shell find $(SOURCEDIR) -type f -name '*.asm')
REALFILES := $(shell find $(SOURCEDIR) -type f -name '*.real')
BINS := $(REALFILES:.real=.bin)
OBJ := $(CFILES:.c=.o) $(ASMFILES:.asm=.asm.o)
DEPS := $(CFILES:.c=.d)
# User options.
DBGOUT = no
DBGSYM = no
PREFIX = $(shell pwd)
CC = gcc
LD = $(CC:gcc=ld)
AS = nasm
QEMU = qemu-system-x86_64
CFLAGS = -O2 -pipe -Wall -Wextra
LDFLAGS = -O2
QEMUFLAGS = -m 2G -enable-kvm -smp 4
# Flags for compilation.
BUILD_TIME := $(shell date)
CHARDFLAGS := $(CFLAGS) \
-DBUILD_TIME='"$(BUILD_TIME)"' \
-std=gnu99 \
-masm=intel \
-fno-pic \
-mno-sse \
-mno-sse2 \
-mno-mmx \
-mno-80387 \
-mno-red-zone \
-mcmodel=kernel \
-ffreestanding \
-fno-stack-protector \
-fno-omit-frame-pointer \
-I$(SOURCEDIR)
ifeq ($(DBGOUT), tty)
CHARDFLAGS := $(CHARDFLAGS) -D_DBGOUT_TTY_
else ifeq ($(DBGOUT), qemu)
CHARDFLAGS := $(CHARDFLAGS) -D_DBGOUT_QEMU_
else ifeq ($(DBGOUT), both)
CHARDFLAGS := $(CHARDFLAGS) -D_DBGOUT_TTY_ -D_DBGOUT_QEMU_
endif
ifeq ($(DBGSYM), yes)
CHARDFLAGS := $(CHARDFLAGS) -g -D_DEBUG_
endif
LDHARDFLAGS := $(LDFLAGS) \
-nostdlib \
-no-pie \
-z max-page-size=0x1000 \
-T $(SOURCEDIR)/linker.ld
QEMUHARDFLAGS := $(QEMUFLAGS) \
-debugcon stdio \
-hda $(KERNELHDD)
.PHONY: symlist all prepare install uninstall clean run
all: $(KERNELELF)
$(KERNELELF): $(BINS) $(OBJ) symlist
$(LD) $(LDHARDFLAGS) $(OBJ) symlist.o -o $@
OBJDUMP=$(CC:-gcc:-objdump) ./gensyms.sh
$(CC) -x c $(CHARDFLAGS) -c symlist.gen -o symlist.o
$(LD) $(LDHARDFLAGS) $(OBJ) symlist.o -o $@
symlist:
echo '#include <symlist.h>' > symlist.gen
echo 'struct symlist_t symlist[] = {{0xffffffffffffffff,""}};' >> symlist.gen
$(CC) -x c $(CHARDFLAGS) -c symlist.gen -o symlist.o
-include $(DEPS)
%.o: %.c
$(CC) $(CHARDFLAGS) -MMD -c $< -o $@
%.bin: %.real
$(AS) $< -f bin -o $@
%.asm.o: %.asm
$(AS) $< -I$(SOURCEDIR) -f elf64 -o $@
run: $(KERNELHDD)
$(QEMU) $(QEMUHARDFLAGS)
$(KERNELHDD): $(LIMINE_DIR) $(KERNELELF)
dd if=/dev/zero bs=1M count=0 seek=64 of=$(KERNELHDD)
parted -s $(KERNELHDD) mklabel msdos
parted -s $(KERNELHDD) mkpart primary 1 100%
echfs-utils -m -p0 $(KERNELHDD) quick-format 32768
echfs-utils -m -p0 $(KERNELHDD) import $(KERNELELF) $(KERNELELF)
echfs-utils -m -p0 $(KERNELHDD) import $(RUNDIR)/limine.cfg limine.cfg
make -C $(LIMINE_DIR)
$(LIMINE_DIR)/limine-install $(KERNELHDD)
$(LIMINE_DIR):
git clone $(LIMINE_URL) $(LIMINE_DIR) --depth=1 --branch=v0.4
install: all
install -d $(DESTDIR)$(PREFIX)/boot
install $(KERNELBIN) $(DESTDIR)$(PREFIX)/boot/
uninstall:
rm -f $(DESTDIR)$(PREFIX)/boot/$(KERNELBIN)
clean:
rm -f symlist.gen symlist.o $(OBJ) $(BINS) $(KERNELELF) $(KERNELHDD) $(DEPS)
distclean: clean
rm -rf $(LIMINE_DIR)
format:
find -type f -name "*.h" -exec clang-format -style=file -i {} \;
find -type f -name "*.c" -exec clang-format -style=file -i {} \;