@@ -6,45 +6,41 @@ MAKEFLAGS += -rR
6
6
# Change as needed.
7
7
override OUTPUT := kernel
8
8
9
- # Convenience macro to reliably declare user overridable variables.
10
- override USER_VARIABLE = $(if $(filter $(origin $(1 ) ) ,default undefined) ,$(eval override $(1 ) := $(2 ) ) )
11
-
12
9
# User controllable C compiler command.
13
- $(call USER_VARIABLE,KCC,cc)
10
+ CC := cc
14
11
15
- # User controllable linker command.
16
- $(call USER_VARIABLE,KLD,ld)
12
+ # User controllable archiver command.
13
+ AR := ar
17
14
18
15
# User controllable C flags.
19
- $(call USER_VARIABLE,KCFLAGS, -g -O2 -pipe)
16
+ CFLAGS := -g -O2 -pipe
20
17
21
18
# User controllable C preprocessor flags. We set none by default.
22
- $(call USER_VARIABLE,KCPPFLAGS,)
19
+ CPPFLAGS :=
23
20
24
21
# User controllable nasm flags.
25
- $(call USER_VARIABLE,KNASMFLAGS, -F dwarf -g)
22
+ NASMFLAGS := -F dwarf -g
26
23
27
24
# User controllable linker flags. We set none by default.
28
- $(call USER_VARIABLE,KLDFLAGS,)
25
+ LDFLAGS :=
29
26
30
- # Check if KCC is Clang.
31
- override KCC_IS_CLANG := $(shell ! $(KCC ) --version 2>/dev/null | grep 'clang' >/dev/null 2>&1; echo $$? )
27
+ # Check if CC is Clang.
28
+ override CC_IS_CLANG := $(shell ! $(CC ) --version 2>/dev/null | grep 'clang' >/dev/null 2>&1; echo $$? )
32
29
33
30
# If the C compiler is Clang, set the target as needed.
34
- ifeq ($(KCC_IS_CLANG ) ,1)
35
- override KCC += \
31
+ ifeq ($(CC_IS_CLANG ) ,1)
32
+ override CC += \
36
33
-target x86_64-unknown-none
37
34
endif
38
35
39
36
# Internal C flags that should not be changed by the user.
40
- override KCFLAGS += \
37
+ override CFLAGS += \
41
38
-Wall \
42
39
-Wextra \
43
40
-std=gnu11 \
44
41
-ffreestanding \
45
42
-fno-stack-protector \
46
43
-fno-stack-check \
47
- -fno-lto \
48
44
-fno-PIC \
49
45
-ffunction-sections \
50
46
-fdata-sections \
@@ -58,70 +54,74 @@ override KCFLAGS += \
58
54
-mcmodel=kernel
59
55
60
56
# Internal C preprocessor flags that should not be changed by the user.
61
- override KCPPFLAGS := \
57
+ override CPPFLAGS := \
62
58
-I src \
63
59
-I src/lib \
64
- $(KCPPFLAGS ) \
60
+ $(CPPFLAGS ) \
61
+ -DLIMINE_API_REVISION=3 \
65
62
-MMD \
66
63
-MP
67
64
68
65
# Internal nasm flags that should not be changed by the user.
69
- override KNASMFLAGS += \
66
+ override NASMFLAGS += \
70
67
-Wall \
71
68
-f elf64
72
69
73
70
# Internal linker flags that should not be changed by the user.
74
- override KLDFLAGS += \
75
- -m elf_x86_64 \
71
+ override LDFLAGS += \
72
+ -Wl,-m,elf_x86_64 \
73
+ -Wl,--build-id=none \
76
74
-nostdlib \
77
75
-static \
78
76
-z max-page-size=0x1000 \
79
- -gc-sections \
77
+ -Wl,-- gc-sections \
80
78
-T linker.ld
81
79
82
80
# Use "find" to glob all *.c, *.S, and *.asm files in the tree and obtain the
83
81
# object and header dependency file names.
84
- override CFILES := $(shell cd src && find -L * -type f -name '* .c' | LC_ALL=C sort)
85
- override ASFILES := $(shell cd src && find -L * -type f -name '* .S' | LC_ALL=C sort)
86
- override NASMFILES := $(shell cd src && find -L * -type f -name '* .asm' | LC_ALL=C sort)
82
+ override SRCFILES := $(shell cd src && find -L * -type f | LC_ALL=C sort)
83
+ override CFILES := $(filter % .c,$(SRCFILES ) )
84
+ override ASFILES := $(filter % .S,$(SRCFILES ) )
85
+ override NASMFILES := $(filter % .asm,$(SRCFILES ) )
87
86
override OBJ := $(addprefix obj/,$(CFILES:.c=.c.o ) $(ASFILES:.S=.S.o ) $(NASMFILES:.asm=.asm.o ) )
88
87
override HEADER_DEPS := $(addprefix obj/,$(CFILES:.c=.c.d ) $(ASFILES:.S=.S.d ) )
89
88
90
- # Default target.
89
+ # Default target. This must come first, before header dependencies.
91
90
.PHONY : all
92
91
all : bin/$(OUTPUT )
93
92
93
+ # Include header dependencies.
94
+ -include $(HEADER_DEPS )
95
+
94
96
src/limine.h :
95
97
curl -Lo $@ https://github.com/limine-bootloader/limine/raw/trunk/limine.h || cp ../build/limine/limine.h src/limine.h || echo " ERROR"
96
98
97
99
# Link rules for the final executable.
98
100
bin/$(OUTPUT ) : GNUmakefile linker.ld $(OBJ )
99
101
mkdir -p " $$ (dirname $@ )"
100
- $(KLD ) $(OBJ ) $(KLDFLAGS ) -o $@
101
-
102
- # Include header dependencies.
103
- -include $(HEADER_DEPS )
102
+ $(CC ) $(CFLAGS ) $(LDFLAGS ) $(OBJ ) -o $@
104
103
105
104
# Compilation rules for *.c files.
106
105
obj/% .c.o : src/% .c GNUmakefile src/limine.h
107
106
mkdir -p " $$ (dirname $@ )"
108
- $(KCC ) $(KCFLAGS ) $(KCPPFLAGS ) -c $< -o $@
107
+ $(CC ) $(CFLAGS ) $(CPPFLAGS ) -c $< -o $@
109
108
110
109
# Compilation rules for *.S files.
111
110
obj/% .S.o : src/% .S GNUmakefile src/limine.h
112
111
mkdir -p " $$ (dirname $@ )"
113
- $(KCC ) $(KCFLAGS ) $(KCPPFLAGS ) -c $< -o $@
112
+ $(CC ) $(CFLAGS ) $(CPPFLAGS ) -c $< -o $@
114
113
115
114
# Compilation rules for *.asm (nasm) files.
116
115
obj/% .asm.o : src/% .asm GNUmakefile
117
116
mkdir -p " $$ (dirname $@ )"
118
- nasm $(KNASMFLAGS ) $< -o $@
117
+ nasm $(NASMFLAGS ) $< -o $@
119
118
120
119
# Remove object files and the final executable.
121
120
.PHONY : clean
122
121
clean :
123
122
rm -rf bin obj
124
123
124
+ # Remove everything built and generated including downloaded dependencies.
125
125
.PHONY : distclean
126
126
distclean : clean
127
127
rm -f src/limine.h
0 commit comments