《讓makefile變得簡單》系列--第二章--讓我們來寫一個makefile

一個完整的makefile包含了什麼

  1. 顯示規則
  2. 隱式規則
  3. 變量
  4. 指令或者命令
  5. 註釋

分行

這裏描述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設置給它。該方法不推薦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章