《跟我一起写Makefile》读书笔记(3)
一個Makefile例子
五、書寫規(guī)則
一般來說,定義在 Makefile 中的目標(biāo)可能會有很多,但是第一條規(guī)則中的目標(biāo)將被確立為最終的目標(biāo)。
1、規(guī)則的語法
(1)如果命令太長,你可以使用反斜框(‘\’)作為換行符。make 對一行上有多少個字符沒有限制。
(2)一般來說,make 會以 UNIX 的標(biāo)準(zhǔn) Shell,也就是/bin/sh 來執(zhí)行命令。
2、在規(guī)則中使用通配符
(1)make支持三各通配符: “*”,“?”,“[...]”;
(2)objects = *.o?,這里objects的值就是“*.o”?,并不會展開。
如果想讓 objects 的值是所有[.o]的文件名的集合,那么需要寫成objects := $(wildcard *.o)?。
3、文件搜索
(1)在哪里尋找依賴的文件?
(2)Makefile 文件中的特殊變量“VPATH”就是完成這個功能的。
- 如果沒有指明這個變量,make 只會在當(dāng)前的目錄中去找尋依賴文件和目標(biāo)文件。
- 如果定義了這個變量,那么make就會在當(dāng)當(dāng)前目錄找不到的情況下,到所指定的目錄中去找尋文件。
- 如VPATH = src:../headers, 指定兩個目錄,“src”和“../headers”,make 會按照這個順序進(jìn)行搜索。目錄由“冒號”分隔。(當(dāng)然,當(dāng)前目錄永遠(yuǎn)是最高優(yōu)先搜索的地方)
- 如vpath %.h ../headers,該語句表示,要求 make 在“../headers”目錄下搜索所有以“.h”結(jié)尾的文件。(如果某文件在當(dāng)前目錄沒有找到的話)
4、多目標(biāo)
我們的可以使用一個自動化變量“$@”,這個變量表示著目前規(guī)則中所有的目標(biāo)的集合
如下面的例子:5、靜態(tài)模式
(1)語法 <targets ...>: <target-pattern>: <prereq-patterns ...><commands>
....
目標(biāo)集合:目標(biāo)集合的模式:依賴集合的模式
(2)如果<target-parrtern>定義成“%.o”
- 意思是我們的<target>集合中都是以“.o”結(jié)尾的;
- 意思是對<target-parrtern>所形成的目標(biāo)集進(jìn)行二次定義;
- 即,取<target-parrtern>模式中的“%”(也就是去掉了[.o]這個結(jié)尾),并為其加上[.c]這個結(jié)尾,形成的新集合。
例子1
例子2
六、書寫命令
1、顯示命令
(1)通常,make把它要執(zhí)行的命令行,在命令執(zhí)行前輸出到屏幕上。但如果我們用“@”字符在命令行前,那么這個命令將不被 make 顯示出來,但命令還是被運(yùn)行的。(這叫靜默執(zhí)行)
(2)如果 make 執(zhí)行時,帶入 make 參數(shù)“-n”或“--just-print”,那么其只是顯示命令,但不會執(zhí)行命令
- 這個功能很有利于我們調(diào)試我們的 Makefile,看看我們書寫的命令執(zhí)行起來是什么樣子的或是什么順序的。
2、命令錯處處理
(1)每當(dāng)命令運(yùn)行完后,make 會檢測每個命令的返回碼,如果命令返回成功,那么 make 會執(zhí)行下一條命令。- 如果一個規(guī)則中的某個命令出錯了(命令退出碼非零),那么 make 就會終止執(zhí)行當(dāng)前規(guī)則,這將有可能終止所有規(guī)則的執(zhí)行。
如:
clean:
-rm -f *.o
(3)給 make 加上“-i”或是“ --ignore-errors”參數(shù),那么,Makefile 中所有命令都會忽略錯誤?。
(4)make 的參數(shù)的是“-k”或是“--keep-going”,這個參數(shù)的意思是,如果某規(guī)則中的命令出錯了,那么就終止該規(guī)則的執(zhí)行,但繼續(xù)執(zhí)行其它規(guī)則。
3、嵌套執(zhí)行make
(1)總控 Makefile 的變量可以傳遞到下級的 Makefile 中(如果你顯示的聲明),但是不會覆蓋下層的 Makefile 中所定義的變量,除非指定了“-e”參數(shù)。
(2)一些細(xì)節(jié)
- 如果你要傳遞變量到下級 Makefile 中,那么你可以使用這樣的聲明:export <variable ...>;
- 如果你不想讓某些變量傳遞到下級 Makefile 中,那么你可以這樣聲明:unexport <variable ...>?;
- 如果你要傳遞所有的變量,那么,只要一個 export 就行了,后面什么也不用跟,表示傳遞所有的變量;
- 有兩個變量,一個是 SHELL,一個是 MAKEFLAGS,這兩個變量不管你是否 export,其總是要傳遞到下層 Makefile 中,特別是 MAKEFILES 變量,其中包含了 make的參數(shù)信息,如果我們執(zhí)行“總控 Makefile”時有 make 參數(shù)或是在上層 Makefile 中定義了這個變量,那么 MAKEFILES 變量將會是這些參數(shù),并會傳遞到下層 Makefile 中,這是一個系統(tǒng)級的環(huán)境變量。
4、定義命令包
七、使用變量
- 變量是大小寫敏感的, “foo”、 “Foo”和“FOO”是三個不同的變量名;
- 變量的命名字可以包含字符、數(shù)字,下劃線(可以是數(shù)字開頭);
- 在 Makefile 中的定義的變量,就像是 C/C++語言中的宏一樣,他代表了一個文本字串,在 Makefile 中執(zhí)行的時候其會自動原模原樣地展開在所使用的地方。其與 C/C++所不同的是(字符串常量不能修改?),你可以在 Makefile 中改變其值。
1、變量的基礎(chǔ)
類似shell中變量的定義和使用方法,需要用$來使用,強(qiáng)烈建議使用()或者{ }將變量包起來使用。
2、變量中的變量
在 Makefile 中有兩種方式來在用變量定義變量的值
(1)簡單的使用“=”號
- 在“=”左側(cè)是變量,右側(cè)是變量的值;
- 右側(cè)變量的值可以定義在文件的任何一處,也就是說,右側(cè)中的變量不一定非要是已定義好的值,也可以使用后面定義的值。
(2)使用“:=”操作符
- 前面的變量不能使用后面的變量,只能使用前面已定義好了的變量。
(3)使用“?=”操作符
- 如果前面已經(jīng)定義,則本句什么也不做,跳過
(4)使用“+=”操作符
- 接續(xù)賦值
總結(jié)
以上是生活随笔為你收集整理的《跟我一起写Makefile》读书笔记(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java学生管理系统设计与实现 (超详细
- 下一篇: 如何查看jdk版本