-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
143 lines (112 loc) · 4.34 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
BOOT := bin.boot
KERNEL := bin.kernel
GAME := bin.game
IMAGE := disk.bin
CC := gcc
LD := ld
OBJCOPY := objcopy
DD := dd
QEMU := qemu-system-i386
GDB := gdb
CFLAGS := -Wall -Werror -Wfatal-errors #开启所有警告, 视警告为错误, 第一个错误结束编译
CFLAGS += -Wno-unused-function
CFLAGS += -fno-stack-protector
CFLAGS += -MD #生成依赖文件
CFLAGS += -std=gnu11 -m32 -c #编译标准, 目标架构, 只编译
CFLAGS += -I. #头文件搜索目录
CFLAGS += -O0 #不开优化, 方便调试
CFLAGS += -fno-builtin #禁止内置函数
CFLAGS += -ggdb3 #GDB调试信息
QEMU_OPTIONS := -serial stdio #以标准输入输为串口(COM1)
#QEMU_OPTIONS += -d int #输出中断信息
QEMU_OPTIONS += -monitor telnet:127.0.0.1:1111,server,nowait #telnet monitor
QEMU_DEBUG_OPTIONS := -S #启动不执行
QEMU_DEBUG_OPTIONS += -s #GDB调试服务器: 127.0.0.1:1234
GDB_OPTIONS := -ex "target remote 127.0.0.1:1234"
GDB_OPTIONS += -ex "symbol $(KERNEL)"
OBJ_DIR := obj
LIB_DIR := lib
BOOT_DIR := boot
KERNEL_DIR := kernel
GAME_DIR := game
OBJ_LIB_DIR := $(OBJ_DIR)/$(LIB_DIR)
OBJ_BOOT_DIR := $(OBJ_DIR)/$(BOOT_DIR)
OBJ_KERNEL_DIR := $(OBJ_DIR)/$(KERNEL_DIR)
OBJ_GAME_DIR := $(OBJ_DIR)/$(GAME_DIR)
LD_SCRIPT := $(shell find $(KERNEL_DIR) -name "*.ld")
LIB_C := $(wildcard $(LIB_DIR)/*.c)
LIB_O := $(LIB_C:%.c=$(OBJ_DIR)/%.o)
BOOT_S := $(wildcard $(BOOT_DIR)/*.S)
BOOT_C := $(wildcard $(BOOT_DIR)/*.c)
BOOT_O := $(BOOT_S:%.S=$(OBJ_DIR)/%.o)
BOOT_O += $(BOOT_C:%.c=$(OBJ_DIR)/%.o)
KERNEL_C := $(shell find $(KERNEL_DIR) -name "*.c")
KERNEL_S := $(shell find $(KERNEL_DIR) -name "*.S")
#KERNEL_S := $(wildcard $(KERNEL_DIR)/*.S)
KERNEL_O := $(KERNEL_C:%.c=$(OBJ_DIR)/%.o)
KERNEL_O += $(KERNEL_S:%.S=$(OBJ_DIR)/%.o)
GAME_C := $(shell find $(GAME_DIR) -name "*.c")
GAME_S := $(shell find $(GAME_DIR) -name "*.S")
KERNEL_S := $(wildcard $(KERNEL_DIR)/*.S)
GAME_O := $(GAME_C:%.c=$(OBJ_DIR)/%.o)
GAME_O += $(GAME_S:%.S=$(OBJ_DIR)/%.o)
$(IMAGE): $(BOOT) $(KERNEL) $(GAME)
@$(DD) if=/dev/zero of=$(IMAGE) count=10000 > /dev/null # 准备磁盘文件
@$(DD) if=$(BOOT) of=$(IMAGE) conv=notrunc > /dev/null # 填充 boot loader
@$(DD) if=$(KERNEL) of=$(IMAGE) seek=1 conv=notrunc > /dev/null # 填充 kernel, 跨过 mbr
#gdb ./format $(GAME) peom1.dat
./format $(GAME) poem1.txt poem2.txt
@$(DD) if=data.disk of=$(IMAGE) seek=201 conv=notrunc > /dev/null # 填充 kernel, 跨过 mbr
# @$(DD) if=$(GAME) of=$(IMAGE) seek=201 conv=notrunc > /dev/null # 填充 kernel, 跨过 mbr
$(BOOT): $(BOOT_O)
$(LD) -e start -Ttext=0x7C00 -m elf_i386 -nostdlib -o $@.out $^
$(OBJCOPY) --strip-all --only-section=.text --output-target=binary $@.out $@
@rm $@.out
boot/genboot.pl $@
$(OBJ_BOOT_DIR)/%.o: $(BOOT_DIR)/%.S
@mkdir -p $(OBJ_BOOT_DIR)
$(CC) $(CFLAGS) -Os $< -o $@
$(OBJ_BOOT_DIR)/%.o: $(BOOT_DIR)/%.c
@mkdir -p $(OBJ_BOOT_DIR)
$(CC) $(CFLAGS) -Os $< -o $@
$(KERNEL): $(LD_SCRIPT)
$(KERNEL): $(KERNEL_O) $(LIB_O)
$(LD) -m elf_i386 -T $(LD_SCRIPT) -nostdlib -o $@ $^ $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
$(GAME): $(GAME_O) $(LIB_O)
#echo $(GAME_O)
#ehco "*************"
$(LD) -m elf_i386 -e fs_test -nostdlib -o $@ $^ $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
$(OBJ_LIB_DIR)/%.o : $(LIB_DIR)/%.c
@mkdir -p $(OBJ_LIB_DIR)
$(CC) $(CFLAGS) $< -o $@
$(OBJ_KERNEL_DIR)/%.o: $(KERNEL_DIR)/%.[cS]
mkdir -p $(OBJ_DIR)/$(dir $<)
$(CC) $(CFLAGS) $< -o $@
$(OBJ_GAME_DIR)/%.o: $(GAME_DIR)/%.[cS]
mkdir -p $(OBJ_DIR)/$(dir $<)
$(CC) $(CFLAGS) $< -o $@
FORMAT=format.c
format: $(FORMAT)
g++ -g -o format $(FORMAT)
DEPS := $(shell find -name "*.d")
-include $(DEPS)
.PHONY: qemu debug gdb clean submit
qemu: $(IMAGE)
$(QEMU) $(QEMU_OPTIONS) $(IMAGE)
qnx: $(IMAGE)
$(QEMU) $(IMAGE) -nographic -serial stdio
# Faster, but not suitable for debugging
qemu-kvm: $(IMAGE)
$(QEMU) $(QEMU_OPTIONS) --enable-kvm $(IMAGE)
debug: $(IMAGE)
$(QEMU) $(QEMU_DEBUG_OPTIONS) $(QEMU_OPTIONS) $(IMAGE)
gdb:
$(GDB) $(GDB_OPTIONS)
clean:
@rm -rf $(OBJ_DIR) 2> /dev/null
@rm -rf $(BOOT) 2> /dev/null
@rm -rf $(KERNEL) 2> /dev/null
@rm -rf $(GAME) 2> /dev/null
@rm -rf $(IMAGE) 2> /dev/null
submit: clean
cd .. && tar cvj $(shell pwd | grep -o '[^/]*$$') > 141242026.tar.bz2