-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
127 lines (92 loc) · 3.57 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
# **************************************************************************** #
# #
# ::: :::::::: #
# Makefile :+: :+: :+: #
# +:+ +:+ +:+ #
# By: ciglesia <[email protected]> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2024/07/14 12:27:42 by ciglesia #+# #+# #
# Updated: 2024/07/16 01:40:16 by ciglesia ### ########.fr #
# #
# **************************************************************************** #
BIN = kernel.bin
ISO = kernel.iso
#****************** INC *******************#
INC = ./include/
INCLUDE = -I $(INC)
#****************** SRC *******************#
DIRSRC = ./kernel/
SRC = kernel.c terminal.c gdt.c printk.c
GDT = load_gdt.s
DIRASM = ./boot/
ASM = boot.s
DIRLNK = ./linker/
LNK = $(DIRLNK)linker.ld
DIRISO = ./iso/
GRUB_CFG = ./grub/grub.cfg
#****************** OBJ *******************#
DIROBJ = ./obj/
#============================== END OF CONFIG ===============================#
OAUX = $(SRC:%=$(DIROBJ)%)
DEPS = $(OBJS:.o=.d)
OBJS = $(OAUX:.c=.o)
OASM = $(DIROBJ)$(ASM:.s=.o)
OGDT = $(DIROBJ)$(GDT:.s=.o)
.ONESHELL:
$(shell mkdir -p $(DIROBJ))
ifndef VERBOSE
.SILENT:
endif
#****************** RULES *******************#
CFLAGS = -std=gnu99 -ffreestanding -O2 -Wall -Wextra
LFLAGS = -ffreestanding -O2 -nostdlib -lgcc
ENV = /usr/bin/env
AC = $(ENV) i386-elf-as
CC = $(ENV) i386-elf-gcc
LC = $(CC)
CP = $(ENV) cp
RM = $(ENV) rm -rf
MKDIR = $(ENV) mkdir -p
PRINTF = $(ENV) printf
GREEN = "\e[92m"
E0M = "\e[0m"
#****************** COMPILER CHECKS *******************#
define n
endef
CC_CHECK := $(shell which $(CC) 2>&1)
ifeq (,$(findstring i386-elf,$(CC_CHECK)))
$(error $nThis kernel needs to be compiled with an ix86-elf compiler!\
$nPlease use "./build.sh" to make the project in a Docker container.$n)
endif
#****************** TARGETS *******************#
%.o : ../$(DIRSRC)/%.c
@$(PRINTF) $(GREEN)"Generating kernel objects... %-33.33s\r"$(E0M) $@
$(CC) $(CFLAGS) $(INCLUDE) -MMD -c $< -o $@
#******************* ISO ********************#
define create_iso
$(MKDIR) $(DIRISO)boot/grub
$(CP) $(BIN) $(DIRISO)boot/kernel.bin
$(CP) $(GRUB_CFG) $(DIRISO)boot/grub/grub.cfg
grub-mkrescue -o $(ISO) $(DIRISO)
@$(PRINTF) $(GREEN)"ISO created... %-33.33s\n"$(E0M) $(ISO)
endef
#****************** RULES *******************#
$(BIN) : $(OBJS)
@$(PRINTF) $(GREEN)"\nCompiling kernel... %-33.33s\n"$(E0M) $@
$(AC) $(DIRASM)$(ASM) -o $(OASM)
$(AC) $(DIRSRC)$(GDT) -o $(OGDT)
$(LC) -T $(LNK) -o $(BIN) $(OASM) $(OGDT) $(OBJS) $(LFLAGS)
$(call create_iso)
all : $(BIN)
clean :
@$(PRINTF) $(GREEN)"Cleaning kernel objects... %-33.33s\n"$(E0M) $(DIROBJ)
$(RM) $(DIROBJ)
fclean : clean
@$(PRINTF) $(GREEN)"Cleaning kernel binary... %-33.33s\n"$(E0M) $(BIN)
$(RM) $(BIN)
$(RM) $(ISO)
$(RM) $(DIRISO)
re : fclean mkdepo all
mkdepo :
@$(MKDIR) $(DIROBJ)
.PHONY : all clean fclean re