blob: a9048a0a0b7de2f2fc07523f5d21f887575f136c (
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
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
|
# HOST ARCH
ARCH=i686-elf-
# GCC CROSS COMPILER
export CC=$(ARCH)gcc
export AS=$(ARCH)as
export CFLAGS=-ffreestanding -O2 -Wall -Wextra -fstack-protector-all
# TOOLS
MKDIR=mkdir -p
RM=rm -rf
CP=cp -r
QEMU=qemu-system-x86_64
#QEMU_DEBUG=-d int -D qemu.log
# DIRS
## SOURCE
SOURCE_DIR=src
AS_SOURCE_DIR=$(SOURCE_DIR)/as
C_SOURCE_DIR=$(SOURCE_DIR)/c
INCLUDE_DIR=$(SOURCE_DIR)/include
## BUILD
ISO_DIR=isodir
BUILD_DIR=${CURDIR}/build
export AS_OBJECT_DIR=$(BUILD_DIR)/as
export C_OBJECT_DIR=$(BUILD_DIR)/c
## SYSROOT
SYSROOT_DIR=sysroot
SYSROOT_USR_DIR=$(SYSROOT_DIR)/usr
SYSROOT_INCLUDE_DIR=$(SYSROOT_USR_DIR)/include
## GCC USR
GCC_USR_DIR=$(shell $(CC) -print-file-name=)
GCC_INCLUDE_DIR=$(GCC_USR_DIR)/include
# TARGET
TARGET=myos
BINARY=$(BUILD_DIR)/$(TARGET).bin
ISO=$(TARGET).iso
# OBJECTS
## AS OBJECTS
CRTI_OBJ=crti.o
CRTN_OBJ=crtn.o
AS_OBJ=boot.o irq.o paging.o
AS_OBJECT=$(patsubst %,$(AS_OBJECT_DIR)/%,$(AS_OBJ))
CRTI_OBJECT=$(patsubst %,$(AS_OBJECT_DIR)/%,$(CRTI_OBJ))
CRTN_OBJECT=$(patsubst %,$(AS_OBJECT_DIR)/%,$(CRTN_OBJ))
export AS_OBJECTS=$(AS_OBJECT) $(CRTI_OBJECT) $(CRTN_OBJECT)
CRTBEGIN_OBJECT=$(GCC_USR_DIR)/crtbegin.o
CRTEND_OBJECT=$(GCC_USR_DIR)/crtend.o
## C OBJECTS
C_OBJ=gdt.o heap.o idt.o kernel.o keyboard.o keymap.o stdio.o string.o tty.o vga.o irq.o stack_protector.o timer.o paging.o
export C_OBJECTS=$(patsubst %,$(C_OBJECT_DIR)/%,$(C_OBJ))
## ALL OBJECTS IN ORDER
OBJ=$(CRTI_OBJECT) $(CRTBEGIN_OBJECT) $(AS_OBJECT) $(C_OBJECTS) $(CRTEND_OBJECT) $(CRTN_OBJECT)
# OTHER FILES
LINKER=$(SOURCE_DIR)/linker.ld
GRUB.CFG=$(SOURCE_DIR)/grub.cfg
# RULES
.PHONY: all compile run run-iso clean install_headers
all: compile
$(BINARY): $(OBJ)
$(CC) -T $(LINKER) -o $(BINARY) $(CFLAGS) -nostdlib -lgcc $(OBJ)
install_headers:
$(RM) $(SYSROOT_INCLUDE_DIR)
$(MKDIR) $(SYSROOT_INCLUDE_DIR)
$(CP) $(GCC_INCLUDE_DIR)/* $(SYSROOT_INCLUDE_DIR)
$(CP) $(INCLUDE_DIR)/* $(SYSROOT_INCLUDE_DIR)
compile:
$(MAKE) install_headers
$(MKDIR) $(AS_OBJECT_DIR)
$(MKDIR) $(C_OBJECT_DIR)
$(MAKE) --directory $(AS_SOURCE_DIR)
$(MAKE) --directory $(C_SOURCE_DIR)
$(MAKE) $(BINARY)
$(ISO): $(BINARY)
grub-file --is-x86-multiboot $(BINARY)
$(MKDIR) $(ISO_DIR)/boot/grub
$(CP) $(BINARY) $(ISO_DIR)/boot/$(TARGET).bin
$(CP) $(GRUB.CFG) $(ISO_DIR)/boot/grub/grub.cfg
grub-mkrescue -o $(ISO) $(ISO_DIR)
run: compile
$(QEMU) -kernel $(BINARY) $(QEMU_DEBUG)
run-iso: compile
$(MAKE) $(ISO)
$(QEMU) -cdrom $(ISO)
clean:
$(RM) $(BUILD_DIR) $(ISO_DIR) $(ISO)
|