summaryrefslogtreecommitdiff
path: root/Makefile
blob: 646f7818e94a7a696fe6f641fdf27a290ca3da36 (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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
SHELL:=/bin/bash

override CFLAGS += \
	-nostdlib \
	-nostdinc \
	-fno-builtin \
	-fno-stack-protector \
	-mno-red-zone \
	-nostartfiles \
	-nodefaultlibs \
	-Wall \
	-Wextra

override LDFLAGS += --no-warn-rwx-segment

ifneq "$(DEBUG)" "0"
	override CFLAGS += -g -fno-omit-frame-pointer -DDEBUG
	override LDFLAGS += -g
	override NASMFLAGS_KERNEL += -g
endif

STAGE3_C = \
	stage3/init.o \
	stage3/main.o \
	stage3/gfx.o \
	stage3/halt.o \
	stage3/interrupts.o \
	stage3/pic.o \
	stage3/clock.o \
	stage3/memory.o \
	stage3/heap.o \
	stage3/font.o \
	stage3/font_classic.o \
	stage3/ata.o \
	stage3/string.o \
	stage3/pci.o \
	stage3/fs.o \
	stage3/ps2.o \
	stage3/thread.o \
	stage3/shell.o \
	stage3/version.o \
	stage3/rng.o \
	stage3/cheese3d.o \
	stage3/cheese_demo.o \
	stage3/debug.o

STAGE3 = $(STAGE3_C) \
	stage3/isr.o \
	stage3/yield.o \
	stage3/watchdog.o

PAD_BOUNDARY = pad() { truncate -s $$(echo "($$(du -b $$1 | cut -f1)+$$2-1)/$$2*$$2" | bc) $$1; }; pad
DISAS = objdump -D -M intel -j .text stage3.elf

cuddles.img: stage1.bin stage23.bin fs.tar
	cat stage{1,23}.bin fs.tar > cuddles.img
	$(PAD_BOUNDARY) cuddles.img 1048576

stage1.bin: stage1/main.asm stage1/print.asm stage23.bin
	nasm $(NASMFLAGS_BOOT) -f bin stage1/main.asm -o stage1.bin \
		-dKSIZE=$$(du -cb stage23.bin | tail -n1 | cut -f1)

stage23.bin: stage2.bin stage3.elf
	cat stage2.bin stage3.elf > stage23.bin
	$(PAD_BOUNDARY) stage23.bin 512

stage2.bin: stage2/main.asm stage2/mmap.asm stage2/paging.asm stage2/vesa.asm stage1/print.asm
	nasm $(NASMFLAGS_BOOT) -f bin stage2/main.asm -o stage2.bin

stage3.elf: $(STAGE3) stage3.ld
	ld $(LDFLAGS) $(STAGE3) -T stage3.ld -o stage3.elf

fs/dbg/kernel.dis.asm: stage3.elf
	mkdir -p fs/dbg/
	$(DISAS) > fs/dbg/kernel.dis.asm

stage3/%.o: stage3/%.asm
	nasm $(NASMFLAGS_KERNEL) -f elf64 $< -o $@

stage3/interrupts.o: stage3/interrupts.c
	gcc $(CFLAGS) -MMD -mgeneral-regs-only -c $< -o $@
stage3/pic.o: stage3/pic.c
	gcc $(CFLAGS) -MMD -mgeneral-regs-only -c $< -o $@
stage3/init.o: stage3/init.c
	gcc $(CFLAGS) -MMD -mgeneral-regs-only -c $< -o $@

stage3/%.o: stage3/%.c
	gcc $(CFLAGS) -MMD -c $< -o $@

-include $(STAGE3_C:%.o=%.d)

GIT_VERSION := $(shell git describe --tags 2>/dev/null || git rev-parse --short HEAD)

.version-$(GIT_VERSION):
	rm -f .version-*
	touch $@

stage3/version.c: .version-$(GIT_VERSION)
	echo -e "#include \"def.h\"\nstr version = S(\"$(GIT_VERSION)\");" > $@

stage3/%.asm: stage3/%.lua
	lua  $< > $@

stage3/font.c: stage3/font_builtin.c

stage3/font_builtin.c: fs/fonts/ter-u16n.cuddlefont
	xxd -i $< > $@

fs.tar: $(shell find fs | sed 's/ /\\ /g') fs/dbg/kernel.dis.asm
	cd fs && tar --format=ustar -cf ../fs.tar *

.PHONY: run clean flash disas qemu bochs

bochs: cuddles.img
	rm -f cuddles.img.lock
	echo c | bochs -q

# to qemu slow: make QFLAGS="-icount shift=9,align=on,sleep=on" run
# try QFLAGS="-enable-kvm" for better performance
override QFLAGS += -drive format=raw,file=cuddles.img

qemu: cuddles.img
	qemu-system-x86_64 $(QFLAGS)

run: qemu

clean:
	rm -rf .version-* stage3/*.{o,d} *.bin *.img stage3/{isr.asm,version.c,font_builtin.c} fs.tar fs/dbg

flash: cuddles.img
	dd if=cuddles.img of=$(DEV)

disas: stage3.elf
	$(DISAS) --disassembler-color=on