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