2020301918-os/Makefile
ridethepig 5b04836546 task3
2022-10-02 21:35:23 +08:00

143 lines
4.1 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#
# make的主文件
# 这个可是个大文件可能乍一看人吓傻了没事对于makefile可以先不去理会。
# 只需要make,make run/monitor/gdb/clean即可。
# 如果要研究细节别光读代码建议用make -n先去理解每条命令在干啥这是xv6里写的非常漂亮的地方。
# 我们miniOS也仅仅做了部分的移植它的功能比你想的强大。
# 当你的源代码/头文件/kernel的编译命令发生变动时都会及时重编译。
# 需要添加新的文件只需要在kern/Makefrag中修改KERN_SRCFILES即可
#
# 文件夹
# OBJ用于存放编译出来的可重定位文件
OBJDIR := obj
# INC用于存放各种头文件(*.h)
INCDIR := inc
# 编译以及日常工具
CC := gcc
# 汇编器
AS := nasm
# 静态库编辑器
AR := ar
# 链接器
LD := ld
# 复制文件
OBJCOPY := objcopy
# 反编译
OBJDUMP := objdump
# 查询可重定位文件符号表
NM := nm
# 预定义,-Dwdnmd相当于在C程序中`#ifdef wdnmd`为真
DEFS :=
# gcc的相关命令参数
# $(DEFS) 定义一些可能的参数
# -O0 0优化保证程序按照代码语义走而不被优化方便调试
# -fno-builtin 静止使用gcc内置函数具体查手册
CFLAGS := $(CFLAGS) $(DEFS) -O0 -fno-builtin
# -I 编译时去指定文件夹查找头文件
# -MD 一个黑科技暂时可以不需要了解总之是在头文件依赖变动的时候能够及时更新target
CFLAGS += -I $(INCDIR) -MD
# -fno-stack-protector 禁止栈保护(金丝雀保护机制,内核代码扛不住)
CFLAGS += -fno-stack-protector
# -std=gnu99 规定编译的语言规范为gnu99
CFLAGS += -std=gnu99
# -static 编译静态程序
# -m32 编译32位程序
CFLAGS += -static -m32
# -g 打开gdb调试信息能够允许gdb的时候调试
CFLAGS += -g
# 一车的warning在编译的时候可能会很有用
CFLAGS += -Wall -Wno-format -Wno-unused -Werror
# ld链接器的相关命令参数
# -m elf_i386 链接的格式为i386
LDFLAGS := -m elf_i386
# 记录每个OBJDIR里存放的每个子文件夹
# 对于这个系统来说,最后的值为./obj/kern和./obj/boot
OBJDIRS :=
# 保证all是第一个target这样make的时候会先执行all
# all的依赖会在kern/Makefrag中填充
all:
# xv6黑科技获取编译命令如果命令较新则会重新编译所有文件
.PRECIOUS: $(OBJDIR)/.vars.%
$(OBJDIR)/.vars.%: FORCE
@echo "$($*)" | cmp -s $@ || echo "$($*)" > $@
.PHONY: FORCE
# 导入两个文件两个文件分别编写方便管理也让主makefile更加清晰
include boot/Makefrag
include kern/Makefrag
# FAT12镜像文件
IMAGE = $(OBJDIR)/kern/a.img
# 最后将boot.bin, loader.bin, kernel.bin组装成a.img
$(IMAGE): $(OBJDIR)/boot/boot.bin $(OBJDIR)/boot/loader.bin $(OBJDIR)/kern/kernel.bin
@dd if=/dev/zero of=$@ bs=512 count=2880
@mkfs.vfat $@
@dd if=$(OBJDIR)/boot/boot.bin of=$@ bs=512 count=1 conv=notrunc
@sudo mount -o loop $@ /mnt
@sudo cp $(OBJDIR)/boot/loader.bin /mnt -v
@sudo cp $(OBJDIR)/kern/kernel.bin /mnt -v
@sudo umount /mnt
all: $(IMAGE)
clean:
@rm -rf $(OBJDIR)
run: $(IMAGE)
@qemu-system-i386 \
-boot order=a \
-drive file=$(IMAGE),format=raw \
gdb: $(IMAGE)
@qemu-system-i386 \
-boot order=a \
-drive file=$(IMAGE),format=raw \
-s -S \
gdb-no-graphic: $(IMAGE)
@qemu-system-i386 \
-nographic \
-boot order=a \
-drive file=$(IMAGE),format=raw \
-s -S \
# 调试的内核代码elf
KERNBIN := $(OBJDIR)/kern/kernel.bin
monitor: $(KERNBIN)
@gdb -tui \
-ex 'set confirm off' \
-ex 'target remote localhost:1234' \
-ex 'file $(KERNBIN)'
debug: $(KERNBIN)
@qemu-system-i386 \
-boot order=a \
-drive file=$(IMAGE),format=raw \
-s -S &
@gdb -tui \
-ex 'set confirm off' \
-ex 'target remote localhost:1234' \
-ex 'file $(KERNBIN)'
# 测试%s
tests:
@make DEFS=-DTESTS --no-print-directory
# xv6黑科技获取头文件依赖如果头文件更新则会重新编译所有文件
$(OBJDIR)/.deps: $(foreach dir, $(OBJDIRS), $(wildcard $(OBJDIR)/$(dir)/*.d))
@mkdir -p $(@D)
@perl mergedep.pl $@ $^
-include $(OBJDIR)/.deps
.PHONY: all clean run gdb gdb-no-graphic monitor debug