Makefile 語法以及關鍵字說明

相關資料文檔

GNU_makefile中文手冊
GNU make-英文

關鍵字

include、sinclude

在 Makefile 使用 include 關鍵字可以把別的 Makefile 包含進來,這很像 C 語言的#include,被包含的文件會原模原樣的放在當前文件的包含位置。

include 的語法是:

include <filename>  

filename 可以是當前操作系統 Shell 的文件模式 (可以保含路徑和通配符) 在 include前面可以有一些空字符,但是絕不能是[Tab]鍵開始。include 和<filename>可以用一個或多個空格隔開。
舉個例子,你有這樣幾個 Makefile:a.mk、b.mk、c.mk,還有一個文件叫foo.make,以及一個變量$(bar),其包含了 e.mk 和f.mk,那麼,下面的語句:

include foo.make *.mk $(bar)  
等價於:
include foo.make a.mk b.mk c.mk e.mk f.mk 

sinclude與include作用是一樣的,爲兼容而存在.

export

設置make生命週期內的環境變量(方便全局使用);設置後,其他路徑的makefile(make -C 指定的路徑makefile)即可以使用相關的變量.

export	TOPDIR SRCTREE OBJTREE

MAKELEVEL

當前的嵌套層數.

MAKE

預設的 make 這個命令的名稱(或者路徑)

文件名操作函數

取目錄函數dir

$(dir <names…> )

名稱:取目錄函數——dir。
功能:從文件名序列中取出目錄部分。目錄部分是指最後一個反斜槓(“/”)之前的部分。如果沒有反斜槓,那麼返回“./”。返回:返回文件名序列的目錄部分。示例: $(dir src/foo.c hacks)返回值是“src/ ./”。

取文件名稱函數notdir

名稱:取文件函數——notdir。包括後綴,去除文件夾路徑;
功能:從文件名序列中取出非目錄部分。非目錄部分是指最後一個反斜槓(“/”
)之後的部分。
返回:返回文件名序列的非目錄部分。
示例: $(notdir src/foo.c hacks)返回值是“foo.c hacks”。

取後綴函數suffix

(suffix<names...>)suffix<names><names>(suffix <names...> ) 名稱:取後綴函數——suffix。 功能:從文件名序列<names>中取出各個文件名的後綴。 返回:返回文件名序列<names>的後綴序列,如果文件沒有後綴,則返回空字串。 示例:(suffix src/foo.c src-1.0/bar.c hacks)返回值是“.c .c”。

取前綴函數basename

$(basename <names…> )

名稱:取前綴函數——basename。包括路徑;
功能:從文件名序列中取出各個文件名的前綴部分。
返回:返回文件名序列的前綴序列,如果文件沒有前綴,則返回空字串。
示例:$(basename src/foo.c src-1.0/bar.c hacks)返回值是“src/foo src-1.0/bar h
acks”。

加後綴函數——addsuffix

$(addsuffix ,<names…> )

名稱:加後綴函數——addsuffix。
功能:把後綴加到中的每個單詞後面。
返回:返回加過後綴的文件名序列。
示例:$(addsuffix .c,foo bar)返回值是“foo.c bar.c”。

加前綴函數——addprefix

$(addprefix ,<names…> )

名稱:加前綴函數——addprefix。
功能:把前綴加到中的每個單詞後面。
返回:返回加過前綴的文件名序列。
示例:$(addprefix src/,foo bar)返回值是“src/foo src/bar”。

連接函數——join

名稱:連接函數——join。
功能:把中的單詞對應地加到的單詞後面。如果的單詞個數要比的多,那麼,中的多出來的單詞將保持原樣。如果的單詞個數要比多,那麼,多出來的單詞將被複制到中。對應位置的疊加,多餘的原樣輸出;
返回:返回連接過後的字符串。
示例:$(join aaa bbb , 111 222 333)返回值是“aaa111 bbb222 333”。

字符串處理函數

subst

Makefile中的字符串處理函數:
用法是$(subst FROM,TO,TEXT),即將TEXT中的東西從FROM變爲TO
示例:
$(subst a,the,There is a big tree),
把“There is a big tree”中的“a”替換成“the”,返回結果是“There is the big tree”。

特殊字符

$@

表示規則中的目標文件集。在模式規則中,如果有多個目標,那麼, $@ 就是匹配於目標中模式定義的集合。

$%

僅當目標是函數庫文件時,表示規則中的目標成員名。例如,如果一個目標是 foo.a(bar.o),那麼, $% 就是 bar.o , $@ 就是 foo.a 。如果目標不是函數庫文件(Unix 下是 .a , Windows下是 .lib ),那麼,其值爲空

$<

依賴目標中的第一個目標名字。如果依賴目標是以模式(即 % )定義的,那麼 $< 將是符合模式的一系列的文件集。注意,其是一個一個取出來的

$?

所有比目標新的依賴目標的集合。以空格分隔。

$^

所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重複的,那個這個變量會去除重複的依賴目標,只保留一份。

$+

這個變量很像 $^ ,也是所有依賴目標的集合。只是它不去除重複的依賴目標。

$*

這個變量表示目標模式中 % 及其之前的部分。如果目標是 dir/a.foo.b ,並且目標的模式是 a.%.b ,那麼, $* 的值就是 dir/a.foo 。這個變量對於構造有關聯的文件名是比較有用。如果目標中沒有模式的定義,那麼 $* 也就不能被推導出,但是,如果目標文件的後綴是 make 所識別的,那麼 $* 就是除了後綴的那一部分。例如:如果目標是 foo.c ,因爲 .c 是 make 所能識別的後綴名,所以, $* 的值就是 foo 。這個特性是 GNU make 的,很有可能不兼容於其它版本的make,所以,你應該儘量避免使用 $* ,除非是在隱含規則或是靜態模式中。如果目標中的後綴是make 所不能識別的,那麼 $* 就是空值。

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