summaryrefslogtreecommitdiff
path: root/Makefile
blob: 406447a53265b6f7449d1ab9cc6223aaf9935bf3 (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
# HOST ARCH
ARCH=i686-aleksa-


# GCC CROSS COMPILER
export CC=$(ARCH)gcc
export AS=$(ARCH)as

WARNINGS := -Wall -Wextra -pedantic -Wshadow -Wpointer-arith -Wcast-align \
            -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations \
            -Wredundant-decls -Wnested-externs -Winline -Wno-long-long \
            -Wconversion -Wstrict-prototypes

export CFLAGS=-std=gnu99 -O3 $(WARNINGS) -ffreestanding -fstack-protector-all


# TOOLS
export MKDIR=mkdir -p
export RM=rm -rf
export CP=cp -r
QEMU=qemu-system-i386



# DIRS

## SOURCE
SOURCE_DIR=src

## BUILD
ISO_DIR=isodir
BUILD_DIR=${CURDIR}/build
export AS_OBJECT_DIR=$(BUILD_DIR)/as
export C_OBJECT_DIR=$(BUILD_DIR)/c

## GCC USR
GCC_USR_DIR=$(shell $(CC) -print-file-name=)



# TARGET
TARGET=aleksa-os
BINARY=$(BUILD_DIR)/$(TARGET).bin
ISO=$(TARGET).iso



# OBJECTS

## AS OBJECTS
AS_OBJ=boot.o ioport.o gdt.o idt.o irq.o paging.o
export AS_OBJECTS=$(patsubst %,$(AS_OBJECT_DIR)/%,$(AS_OBJ))

## 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_handler.o stack_protector.o timer.o paging.o
export C_OBJECTS=$(patsubst %,$(C_OBJECT_DIR)/%,$(C_OBJ))

## ALL OBJECTS IN ORDER
OBJ=$(GCC_USR_DIR)crti.o $(GCC_USR_DIR)crtbegin.o $(AS_OBJECTS) $(C_OBJECTS) $(GCC_USR_DIR)crtend.o $(GCC_USR_DIR)crtn.o



# OTHER FILES
LINKER=$(SOURCE_DIR)/linker.ld
GRUB.CFG=$(SOURCE_DIR)/grub.cfg


# RULES
.PHONY: all clean compile install_headers iso run run-iso
all: compile

clean:
	$(RM) $(BUILD_DIR) $(ISO_DIR) $(ISO)

$(BINARY): $(OBJ)
	$(CC) -T $(LINKER) -o $(BINARY) $(CFLAGS) -nostdlib -lgcc $(OBJ)

install_headers:
	./scripts/install_headers.sh

compile:
	$(MAKE) install_headers
	@$(MAKE) --directory $(SOURCE_DIR)
	$(MAKE) $(BINARY)

$(ISO): $(OBJ) $(GRUB.CFG)
ifeq ($(shell ./scripts/is_multiboot.sh), 0)
	$(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)
else
	@echo "$(BINARY) is not x86 multiboot compatible"
	$(RM) $(BINARY)
endif

iso: compile
	$(MAKE) $(ISO)

run: compile
	$(QEMU) -kernel $(BINARY) $(QEMU_DEBUG)

run-iso: iso
	$(QEMU) -cdrom $(ISO)