Makefile浅尝
生活随笔
收集整理的這篇文章主要介紹了
Makefile浅尝
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【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 everythingeverything + 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=notruncsudo 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 = nasm2 ASMDIR = boot/include/34 BOOT_T = boot/boot.bin56 IMAGE_T = a.img78 LOADER_T = boot/loader.bin910 .PHONY: image clean build_img1112 image : ${BOOT_T} ${LOADER_T} build_img1314 clean :15 rm -f $(LOADER_T) ${BOOT_T}1617 # loader : ${LOADER_18 # boot : $(BOOT_T)1920 build_img:21 dd if=boot/boot.bin of=a.img bs=512 count=1 conv=notrunc22 sudo mount -o loop a.img /mnt/floppy/23 sudo cp -f boot/loader.bin /mnt/floppy/24 sudo umount /mnt/floppy/2526 boot/boot.bin : boot/boot.asm ${ASMDIR}load.inc ${ASMDIR}fat12hdr.inc27 $(ASM) -I ${ASMDIR} -o $@ $<28 boot/loader.bin: boot/loader.asm ${ASMDIR}fat12hdr.inc ${ASMDIR}load.inc ${ASMDIR}pm.inc29 $(ASM) -I${ASMDIR} -o $@ $<
2.4)荔枝四,編譯boot+loader文件,并將loader和os kernel 拷貝到系統軟盤
ASM = nasmASMDIR = boot/include/GCC = gccLD = ldBOOT_T = boot/boot.binIMAGE_T = a.imgLOADER_T = boot/loader.binKERNEL_T = kernel/kernel.o kernel/start.oLIB_T = lib/kliba.o lib/string.oFINAL_T = kernel/kernel.bin.PHONY: image clean build_imgimage : ${BOOT_T} ${LOADER_T} ${KERNEL_T} ${LIB_T} ${FINAL_T} build_imgclean :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=notruncsudo 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}
Alert):本Makefile文件很有代表性,參見https://github.com/pacosonTang/Orange-s-OS/blob/master/Makefile
總結
以上是生活随笔為你收集整理的Makefile浅尝的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想电脑迈克菲(联想电脑迈克菲过期了卸载
- 下一篇: 怎么设置网页字体大小(网页怎样设置字体大