-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMakefile
153 lines (130 loc) · 3.79 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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
rglob = $(wildcard \
$(1)/$(2) \
$(1)/*/$(2) \
$(1)/*/*/$(2) \
$(1)/*/*/*/$(2) \
$(1)/*/*/*/*/$(2) \
)
os_name := FerOS
iso := $(os_name).iso
grubcfg := isodir/boot/grub/grub.cfg
iso_kernel := isodir/boot/$(os_name).elf
kernel_elf := build/$(os_name).elf
kernel_sym := build/$(os_name).sym
kernel_dbg := build/$(os_name).dbg.elf
cfiles := $(call rglob,src,*.c)
sfiles := $(call rglob,src,*.s)
Sfiles := $(call rglob,src,*.S)
ofiles := $(patsubst src/%.c,build/%.c.o,$(cfiles))
ofiles += $(patsubst src/%.s,build/%.s.o,$(sfiles))
ofiles += $(patsubst src/%.S,build/%.S.o,$(Sfiles))
gdb := i686-elf-gdb
gcc := i686-elf-gcc
as := i686-elf-as
ld := i686-elf-ld
objcopy := i686-elf-objcopy
objdump := i686-elf-objdump -M intel
qemu-system := qemu-system-i386 $(strip \
-enable-kvm \
-m 1G \
-name $(os_name) \
-serial file:logs/serial.log \
-serial stdio \
-d guest_errors \
)
# ^ Redirect Guest COM1 to log file, and guest COM2 to stdio
gdbflags := $(strip \
-q -tui \
-ex "set disassembly-flavor intel" \
-ex "file $(kernel_elf)" \
-ex "symbol-file $(kernel_sym)" \
-ex "target remote :1234" \
)
gccflags := $(strip \
-std=gnu11 -Wall -Wextra -Werror -Wshadow -Iinclude \
-ffreestanding -O3 -nostdlib -g -ggdb \
-fno-builtin -nostartfiles -nodefaultlibs -fno-exceptions \
-fno-stack-protector -static -fno-pic \
-fms-extensions \
-masm=intel \
-mno-red-zone \
-mfxsr -mmmx -msse -msse2 -mfpmath=sse \
-Wl,-melf_i386 -Wl,--fatal-warnings \
-DIS_QEMU_GUEST \
)
gcc_c_only_flags := -include __prelude.h
asflags := $(strip \
-g --gstabs+ -L --fatal-warnings -Iinclude \
-msyntax=intel -mmnemonic=intel -mnaked-reg \
)
# Store it into a variable to "escape" the comma at the end for use in patsubst
wa_prefix := -Wa,
gcc_asflags := $(patsubst %,$(wa_prefix)%,$(asflags))
ldlibs := -lgcc
.PHONY: all
all: $(iso)
$(kernel_dbg): src/elf.ld $(ofiles)
@mkdir -p $(@D)
@echo Link $@ using $<
@$(gcc) $(gccflags) -T $< -o $@ $(ofiles) $(ldlibs)
#$(objdump) --disassemble-all --prefix-addresses $@ > [email protected]
$(kernel_sym): $(kernel_dbg)
@mkdir -p $(@D)
@echo Extract debug symbols from $< into $@
@$(objcopy) --only-keep-debug $< $@
$(kernel_elf): $(kernel_dbg) $(kernel_sym)
@mkdir -p $(@D)
@echo Strip $(kernel_dbg) into $@
@$(objcopy) --strip-all $< $@
@echo Assert that $@ is multiboot-compliant
@grub-file --is-x86-multiboot $@
@du -sh $@
#$(objdump) --disassemble-all --prefix-addresses $@ > [email protected]
$(grubcfg):
@mkdir -p $(@D)
@echo Generate $@
@echo "menuentry \"$(os_name)\" {" > $@
@echo " multiboot /boot/$(notdir $(kernel_elf))" >> $@
@echo "}" >> $@
$(iso_kernel): $(kernel_elf)
@mkdir -p $(@D)
cp $< $@
# NOTE: We can't do `ln -sf` instead of `cp` because the file wouldn't get
# picked up.
$(iso): $(iso_kernel) $(kernel_sym) $(grubcfg)
@mkdir -p $(@D)
grub-mkrescue /usr/lib/grub/i386-pc -o $@ isodir/
build/%.s.o: src/%.s
@mkdir -p $(@D)
@echo Assemble $^ "(skipping pre-processing)"
@$(as) $(asflags) $< -o $@
#$(objdump) --disassemble-all --prefix-addresses $@ > [email protected]
build/%.S.o: src/%.S
@mkdir -p $(@D)
@echo Assemble $^
@$(gcc) $(gccflags) $(gcc_asflags) -c $< -o $@
#$(objdump) --disassemble-all --prefix-addresses $@ > [email protected]
build/%.c.o: src/%.c
@mkdir -p $(@D)
@echo Compile $^
@$(gcc) $(gccflags) $(gcc_c_only_flags) -c $< -o $@
#$(gcc) $(gccflags) $(gcc_c_only_flags) -S $< -o [email protected]
#$(objdump) --disassemble-all --prefix-addresses $@ > [email protected]
.PHONY: clean re mrproper
clean:
rm -rf build isodir
re: clean all
mrproper: clean all
.PHONY: run run-release dbg run-dbg run-bin
run-release: $(iso)
@mkdir -p logs
$(qemu-system) -cdrom $(iso)
run: $(iso)
@mkdir -p logs
$(qemu-system) -gdb tcp::1234 -cdrom $(iso)
dbg: all
$(gdb) $(gdbflags)
run-dbg: $(iso)
@mkdir -p logs
$(qemu-system) -S -gdb tcp::1234 -cdrom $(iso) &
$(gdb) $(gdbflags) -ex "continue"