BUILD_O_DIR = ./build BUILD_BIN_DIR = $(BUILD_O_DIR)/bin ENTRY_POINT = 0xc0001500 DIS_IMG = ./hd30M.img AS = nasm CC = i386-elf-gcc LD = i386-elf-ld LIB = -I lib/ -I lib/kernel -I lib/user/ -I kernel/ -I device/ -I thread/ BOOTLIB = -I boot/include/ ASFLAGS = -f elf CFLAGS = -Wall $(LIB) -c -fno-builtin -W -Wstrict-prototypes -Wmissing-prototypes LDFLAGS = -Ttext $(ENTRY_POINT) -e main -Map $(BUILD_BIN_DIR)/kernel.map OBJS = $(BUILD_O_DIR)/main.o $(BUILD_O_DIR)/init.o $(BUILD_O_DIR)/interrupt.o \ $(BUILD_O_DIR)/timer.o $(BUILD_O_DIR)/kernel.o $(BUILD_O_DIR)/print.o \ $(BUILD_O_DIR)/debug.o $(BUILD_O_DIR)/string.o $(BUILD_O_DIR)/bitmap.o \ $(BUILD_O_DIR)/memory.o $(BUILD_O_DIR)/thread.o $(BUILD_O_DIR)/list.o $(BUILD_O_DIR)/switch.o ################################ C 代码编译 ################################ $(BUILD_O_DIR)/main.o: kernel/main.c lib/kernel/print.h lib/stdint.h kernel/init.h $(CC) $(CFLAGS) $< -o $@ $(BUILD_O_DIR)/init.o: kernel/init.c kernel/init.h lib/kernel/print.h lib/stdint.h kernel/interrupt.h device/timer.h $(CC) $(CFLAGS) $< -o $@ $(BUILD_O_DIR)/interrupt.o: kernel/interrupt.c lib/stdint.h kernel/interrupt.h kernel/global.h lib/kernel/print.h $(CC) $(CFLAGS) $< -o $@ $(BUILD_O_DIR)/timer.o: device/timer.c lib/stdint.h device/timer.h kernel/interrupt.h lib/kernel/io.h lib/kernel/print.h $(CC) $(CFLAGS) $< -o $@ $(BUILD_O_DIR)/debug.o: kernel/debug.c kernel/debug.h lib/kernel/print.h lib/stdint.h kernel/interrupt.h $(CC) $(CFLAGS) $< -o $@ $(BUILD_O_DIR)/string.o: lib/string.c lib/string.h lib/stdint.h $(CC) $(CFLAGS) $< -o $@ $(BUILD_O_DIR)/bitmap.o: lib/kernel/bitmap.c lib/kernel/bitmap.h lib/stdint.h lib/string.h $(CC) $(CFLAGS) $< -o $@ $(BUILD_O_DIR)/memory.o: kernel/memory.c kernel/memory.h lib/stdint.h lib/kernel/bitmap.h lib/string.h lib/kernel/print.h $(CC) $(CFLAGS) $< -o $@ $(BUILD_O_DIR)/thread.o: thread/thread.c thread/thread.h $(CC) $(CFLAGS) $< -o $@ $(BUILD_O_DIR)/list.o: lib/kernel/list.c lib/kernel/list.h lib/stdint.h kernel/interrupt.h $(CC) $(CFLAGS) $< -o $@ ################################ 汇编代码编译 ################################ $(BUILD_O_DIR)/kernel.o: kernel/kernel.S $(AS) $(ASFLAGS) $< -o $@ $(BUILD_O_DIR)/switch.o: thread/switch.S $(AS) $(ASFLAGS) $< -o $@ $(BUILD_O_DIR)/print.o: lib/kernel/print.S $(AS) $(ASFLAGS) $< -o $@ $(BUILD_BIN_DIR)/mbr.bin: boot/mbr.S $(AS) $(BOOTLIB) $< -o $@ $(BUILD_BIN_DIR)/loader.bin: boot/loader.S $(AS) $(BOOTLIB) $< -o $@ ################################ 链接所有目标文件 ################################ $(BUILD_BIN_DIR)/kernel.bin: $(OBJS) $(LD) $(LDFLAGS) $^ -o $@ .PHONY:clean mk_dir mbr loader K create_img hd run build all mk_dir: @if [ ! -d $(BUILD_O_DIR) ]; then mkdir $(BUILD_O_DIR); fi @if [ ! -d $(BUILD_BIN_DIR) ]; then mkdir $(BUILD_BIN_DIR); fi ################################ 创建 DIS_IMG ################################ create_img: @if [ ! -f $(DIS_IMG) ]; then bximage -q -func=create -hd=30M $(DIS_IMG); fi @echo "创建 $(DIS_IMG) 成功" hd: mbr loader K create_img dd if=$(BUILD_BIN_DIR)/mbr.bin of=$(DIS_IMG) bs=512 count=1 conv=notrunc dd if=$(BUILD_BIN_DIR)/loader.bin of=$(DIS_IMG) bs=512 count=4 seek=2 conv=notrunc dd if=$(BUILD_BIN_DIR)/kernel.bin of=$(DIS_IMG) bs=512 count=200 seek=9 conv=notrunc clean: mk_dir cd $(BUILD_O_DIR) && rm -rf ./* rm -rf $(BUILD_O_DIR) rm -rf $(DIS_IMG) rm -rf bochs_log.txt K: mk_dir $(BUILD_BIN_DIR)/kernel.bin mbr: mk_dir $(BUILD_BIN_DIR)/mbr.bin loader: mk_dir $(BUILD_BIN_DIR)/loader.bin run: hd bochs -f bochsrc -q build: mk_dir mbr loader K mk_dir @echo "编译完成" all: mk_dir create_img mbr loader K hd