一個完整的makefile包含了什麼
- 顯示規則
- 隱式規則
- 變量
- 指令或者命令
- 註釋
分行
這裏描述2個概念:邏輯行、物理行
邏輯行:比如你在編程時,一行賦值語句,一行if判斷語句都是邏輯行,它可以很長,佔用多個物理行,也可以很短,不足一個物理行。
物理行:編輯器上你看到的一行就是物理行。
在makefile文件的語法規則中,如果邏輯行過長,影響閱讀。可以使用‘\’分行,把一個邏輯行拆成多個物理行,比如第一章那個簡單的makefile例子中有如下
edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
makefile文件的命名規則
默認地,make程序會在執行命令的當前路徑下嘗試搜索GNUmakefile、makefile和Makefile。如果你是一個不喜歡被定製的人,那麼可以隨便命名自己的makefile。但是,如果你自定義了makefile文件的名稱,那麼在使用make命令時,需要指定你的makefile文件名,語法如下:
$make -f yourMakefile
or
$make --file yourmakefile
or
$make --file=yourmakefile
包含其他的makefile
以本人經歷過的一個項目爲例。該項目大約有300+個源文件,歸類爲8個不同的模塊,模塊之間的直接調用非常地少。所以,每個模塊獨立成一個文件夾,裏面放着屬於該模塊地源文件。每個模塊地編譯條件不是完全一樣地,所以每個模塊都有自己的makefile,所以這些makefile包含在的main文件下的makefile。
語法一:
include filenames ...
所以你有2種方式寫包含makefile
include mkf1 mkf2 ...
or
include mkf1
include mkf2
如果你的makefile文件數比較少且不會增刪,用變量替換羅列的makefile會比較方便。如果遇到makefile文件很多,還時不時地增刪,那麼使用通配符也是很方便的。
bar = a.mk b.mk c.mk
include $(bar)
or
include *.mk
語法一中,如果包含的makefile不存在,報告警告,如果因爲包含的文件出現了錯誤,會影響makefile的編譯。所以還存在一種忽略經過和錯誤的include語法
語法二
-include a.mk b.mk c.mk
語法一和二的差別僅僅在警告和錯誤的處理方式不一樣。語法二忽略警告和錯誤,不影響編譯。
環境變量MAKEFILES
makefile的命名規則已經講過,要麼使用默認的名稱,要麼在使用make時爲它指定文件。但是還有一種方法,那就是設定環境變量MAKEFILES,把需要編譯的makefile設置給它。該方法不推薦。