Makefile文件的使用
先看下面的Makefile代碼:
| # Makefile for boot # Programs, flags, etc. ASM??????? = nasm ASMFLAGS??? = -I include/ # This Program TARGET??????? = boot.bin loader.bin # All Phony Targets .PHONY : everything clean all # Default starting position everything : $(TARGET) clean : ????rm -f $(TARGET) all : clean everything boot.bin : boot.asm include/load.inc include/fat12hdr.inc ????$(ASM) $(ASMFLAGS) -o $@ $< loader.bin : loader.asm include/load.inc include/fat12hdr.inc include/pm.inc ????$(ASM) $(ASMFLAGS) -o $@ $< |
?
在上述代碼中,以字符#開頭的行是注釋,=是用來定義變量的,這里ASM和ASMFLAGS就是2個變量,要注意的是:使用這些變量的時候要使用如下格式:
$(ASM)和$(ASMFLAGS),
其分別代表 nasm 和 -I include/ ,而不是直接使用他們的原型。
MakeFile語法:
target?? ?:?? ?prerequisites
?? ??? ??? ??? ?command
上述形式的格式代表兩層含義:
1.?? ?要想得到target,需要執行命令command。
2.?? ?target依賴prerequisites,當prerequisites中至少有一個文件比target文件新時,command才被執行。
現在我們根據上述語法來翻譯上述代碼中的最后2行:
loader.bin : loader.asm include/load.inc include/fat12hdr.inc include/pm.inc
?? ?$(ASM) $(ASMFLAGS) -o $@ $<
1.?? ?要想得到loader.bin,需要執行“$(ASM) $(ASMFLAGS) -o $@ $<”。
2.?? ?loader.bin依賴下述文件:
?? ??? ?loader.asm
?? ??? ?include/load.inc
?? ??? ?include/pm.inc
?? ??? ?include/fat12hdr.inc
?? ?當它們中至少有一個比loader.bin新時,command命令被執行。
那么“$(ASM) $(ASMFLAGS) -o $@ $<“?? ?又是什么呢?其中,
$@ 代表 target;
$< 代表prerequisites的第一個名字;
聯系我們之前說的$(ASM)和 $(ASMFLAGS)的含義,我們知道:
$(ASM) $(ASMFLAGS) -o $@ $<
等價于:
nasm -I include/ -o loader.bin loader.asm
在上述Makefile文件中,我們注意到:不但boot.bin和loader.bin兩個文件后面有冒號,everything/clean/all后面也有冒號,可是他們3個并不是3個文件,僅僅是動作名稱而已。如果運行“make clean“,將會執行“rm -f $(TARGET)”,即rm -f boot.bin loader.bin
all后面緊跟的是clean和everything,這表示,如果執行“make all”,clean和everythiny所表示的動作都將分別被執行。
至此,我們已經分析完上述Makefile文件的全部代碼!哦,對了,還有.PHONY沒有分析,其實.PHONY關鍵字表示它后面的名字并不是文件,而僅僅是一種行為的標號。
當我們直接輸入make命令是,make程序會從第一個名字所代表的動作開始執行。在本例中,第一個標號是everything,所以make 和 make everything是一樣的。
總結
以上是生活随笔為你收集整理的Makefile文件的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: boot.asm文件注释
- 下一篇: Int 10 中断功能 详解