-
Notifications
You must be signed in to change notification settings - Fork 1
/
Makefile
108 lines (86 loc) · 2.46 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
CONFIG_DIR=./config
ISO_DIR=./iso
# Docker
DOCKER_IMAGE=kevincharm/x86_64-elf-gcc-toolchain:latest
DOCKER_SH=docker run -it --rm \
-v `pwd`:/work \
-w /work \
--security-opt seccomp=unconfined \
$(DOCKER_IMAGE) /bin/bash -c
# Compilers
AS=x86_64-elf-as
CC=x86_64-elf-gcc
LD=x86_64-elf-ld
CFLAGS=-m64 -std=gnu11 -ffreestanding -fno-stack-protector -O2 -nostdlib -Wall -Wextra -mcmodel=kernel -mno-red-zone \
-mgeneral-regs-only -mno-mmx -mno-sse -mno-sse2 -mno-avx
# Build info
GIT_COMMIT=$(shell git log -1 --pretty=format:"%H")
KERNEL_DEFINES=__ARGIR_BUILD_COMMIT__=\"$(GIT_COMMIT)\"
# Sources
SRC_DIR=./src
KERNEL_INCLUDE=$(SRC_DIR)/include
KERNEL_OBJS=\
$(SRC_DIR)/boot.o \
$(SRC_DIR)/kernel/mb2.o \
$(SRC_DIR)/kernel/font_vga.o \
$(SRC_DIR)/kernel/gdt.o \
$(SRC_DIR)/kernel/gdt_rst.o \
$(SRC_DIR)/kernel/pic.o \
$(SRC_DIR)/kernel/idt.o \
$(SRC_DIR)/kernel/interrupts.o \
$(SRC_DIR)/kernel/isr.o \
$(SRC_DIR)/kernel/keyboard.o \
$(SRC_DIR)/kernel/terminal.o \
$(SRC_DIR)/kernel/pci.o \
$(SRC_DIR)/kernel/vmem.o \
$(SRC_DIR)/kernel/pmem.o \
$(SRC_DIR)/kernel/paging.o \
$(SRC_DIR)/kernel.o
KLIB_DIR=$(SRC_DIR)/klib
KLIB_INCLUDE=$(KLIB_DIR)/include
KLIB_OBJS=\
$(KLIB_DIR)/memory/memset.o \
$(KLIB_DIR)/memory/memcpy.o \
$(KLIB_DIR)/algo/qsort.o \
$(KLIB_DIR)/ringbuf/ringbuf.o \
$(KLIB_DIR)/stdio/putchar.o \
$(KLIB_DIR)/stdio/printf.o \
$(KLIB_DIR)/string/strlen.o
default: clean all
.PHONY: clean
all:
$(DOCKER_SH) "make _all"
_all: argir.iso
argir.bin: $(KERNEL_OBJS) $(KLIB_OBJS)
$(CC) -z max-page-size=0x1000 $(CFLAGS) -T kernel.ld -lgcc -o $@ $(KERNEL_OBJS) $(KLIB_OBJS)
%.o: %.s
$(AS) $< -o $@
%.o: %.S
$(CC) -c $< -o $@ -I$(KERNEL_INCLUDE)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@ -I$(KLIB_INCLUDE) -I$(KERNEL_INCLUDE) -D$(KERNEL_DEFINES)
# Disk image & Qemu
argir.iso: argir.bin
rm -rf $(ISO_DIR)
mkdir -p $(ISO_DIR)/boot/grub
mv argir.bin $(ISO_DIR)/boot/argir.bin
cp $(CONFIG_DIR)/grub.cfg $(ISO_DIR)/boot/grub/grub.cfg
grub-mkrescue -o argir.iso iso
QEMU=qemu-system-x86_64 -cdrom argir.iso -m 4G -netdev user,id=eth0 -device ne2k_pci,netdev=eth0 -monitor stdio -d int,cpu_reset -no-reboot -D ./tmp/qemu.log
run: all
$(QEMU)
debug: all
$(QEMU) -d int,cpu_reset
clean:
rm -f *.bin
rm -f *.iso
rm -rf $(ISO_DIR)
find $(SRC_DIR) -type f -name '*.o' -delete
print_toolchain:
$(DOCKER_SH) "make _print_toolchain"
_print_toolchain:
$(CC) --version
sections:
greadelf -S $(ISO_DIR)/boot/argir.bin
objdump:
objdump -dx $(ISO_DIR)/boot/argir.bin