【0】README
- makefile定义: 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要一先编译,哪些文件需要后编译,哪些文件需要重新编译;
【1】看个荔枝
荔枝解析-Analysis:
loader.bin : loader.asm include/load.inc include/fat12hdr.inc include/pm.inc
$(ASM) $(ASMFLAGS) -o $@ $<
A1)比如以上这个makefile的最后两行,翻译出来就是:
- 1)要想得到loader.bin ,需要执行 $(ASM) $(ASMFLAGS) -o $@ $< ;
- 2) loader.bin 依赖于 以下文件:loader.asm、 include/load.inc 、include/fat12hdr.inc 、include/pm.inc ;
- 3)当以上依赖文件 有一个比 loader.bin 新时,command 才被执行;
A2)那么 $(ASM) $(ASMFLAGS) -o $@ $< 又表示什么呢?
$@ 代表 target == loader.bin; $< 代表 prerequisites 的第一个名字 == loader.asm; 所以,这行就等价于 nasm -o loader.bin loader.asm ;
A3)后面有冒号的还有:
# All Phony Targets .PHONY : everything clean all # Default starting position everything : $(TARGET) clean : rm -f $(TARGET) all : clean everything
everything + clean + all 叫做动作名称而已;
如果运行 make clean, 将会执行 rm -f ${TARGET} == rm -f boot.bin loader.bin
- A4)make everything == make
因为 直接输入 make的话,这是 make程序 会从第一个名字所代表的动作开始执行, 而第一个动作名称是everything;
- A5) make 指令, 默认的makefile文件是 Makefile,而如果要指定特定的makefile, 加上-f 参数;如make all -f Makefile.boot ;
- A6) 对头文件目录的指定 -I include ;
- A7)当要确定文件的依赖关系时,利用 GCC 提供的参数 -M 可以自动生成依赖关系, 然后将依赖关系copy 到 makefile中就可以了;
- A8)查找依赖关系 gcc 和 nasm 都是用 参数 -M;
【2】我的 Makefile
- 2.1)荔枝一,我们只编译boot 文件
2.2)荔枝二,编译boot+loader文件,并将loader拷贝到系统软盘
ASM = nasm BOOT_T = boot.bin IMAGE_T = a.img LOADER_T = loader.bin .PHONY: image clean build_img image : ${BOOT_T} ${LOADER_T} build_img clean : rm -f $(LOADER_T) ${BOOT_T} # loader : ${LOADER_ # boot : $(BOOT_T) build_img: dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc sudo mount -o loop a.img /mnt/floppy/ sudo cp -f loader.bin /mnt/floppy/ sudo umount /mnt/floppy/ boot.bin : boot.asm $(ASM) -o $@ $< loader.bin: loader.asm $(ASM) -o $@ $<
2.3)荔枝三,编译boot+loader文件,并将loader拷贝到系统软盘 (注意,这里加入了文件依赖)
ASM = nasm 2 ASMDIR = boot/include/ 3 4 BOOT_T = boot/boot.bin 5 6 IMAGE_T = a.img 7 8 LOADER_T = boot/loader.bin 9 10 .PHONY: image clean build_img 11 12 image : ${BOOT_T} ${LOADER_T} build_img 13 14 clean : 15 rm -f $(LOADER_T) ${BOOT_T} 16 17 # loader : ${LOADER_ 18 # boot : $(BOOT_T) 19 20 build_img: 21 dd if=boot/boot.bin of=a.img bs=512 count=1 conv=notrunc 22 sudo mount -o loop a.img /mnt/floppy/ 23 sudo cp -f boot/loader.bin /mnt/floppy/ 24 sudo umount /mnt/floppy/ 25 26 boot/boot.bin : boot/boot.asm ${ASMDIR}load.inc ${ASMDIR}fat12hdr.inc 27 $(ASM) -I ${ASMDIR} -o $@ $< 28 boot/loader.bin: boot/loader.asm ${ASMDIR}fat12hdr.inc ${ASMDIR}load.inc ${ASMDIR}pm.inc 29 $(ASM) -I${ASMDIR} -o $@ $<
2.4)荔枝四,编译boot+loader文件,并将loader和os kernel 拷贝到系统软盘
Alert):本Makefile文件很有代表性,参见https://github.com/pacosonTang/Orange-s-OS/blob/master/Makefile
ASM = nasm ASMDIR = boot/include/ GCC = gcc LD = ld BOOT_T = boot/boot.bin IMAGE_T = a.img LOADER_T = boot/loader.bin KERNEL_T = kernel/kernel.o kernel/start.o LIB_T = lib/kliba.o lib/string.o FINAL_T = kernel/kernel.bin .PHONY: image clean build_img image : ${BOOT_T} ${LOADER_T} ${KERNEL_T} ${LIB_T} ${FINAL_T} build_img clean : rm -f $(LOADER_T) ${BOOT_T} ${KERNEL_T} ${LIB_T} ${FINAL_T} # loader : ${LOADER_ # boot : $(BOOT_T) build_img: dd if=boot/boot.bin of=a.img bs=512 count=1 conv=notrunc sudo mount -o loop a.img /mnt/floppy/ sudo cp -f boot/loader.bin /mnt/floppy/ sudo cp -f kernel/kernel.bin /mnt/floppy/ sudo umount /mnt/floppy/ boot/boot.bin : boot/boot.asm ${ASMDIR}load.inc ${ASMDIR}fat12hdr.inc $(ASM) -I ${ASMDIR} -o $@ $< boot/loader.bin: boot/loader.asm ${ASMDIR}fat12hdr.inc ${ASMDIR}load.inc ${ASMDIR}pm.inc $(ASM) -I ${ASMDIR} -o $@ $< kernel/kernel.o: kernel/kernel.asm $(ASM) -f elf -o $@ $< kernel/start.o: kernel/start.c include/type.h include/const.h include/protect.h $(GCC) -I include/ -c -fno-builtin -o $@ $< lib/kliba.o: lib/kliba.asm $(ASM) -f elf -o $@ $< lib/string.o: lib/string.asm $(ASM) -f elf -o $@ $< kernel/kernel.bin: ${KERNEL_T} ${LD} -s -Ttext 0x30400 -o $@ ${KERNEL_T} ${LIB_T}
版权声明:本文为博主原创文章,未经博主允许不得转载。