讓你的makefile更專業。
在上乙個makefile所在目錄下通過touch命令建立乙個clean檔案,執行make clean,將發現make總是提示clean檔案是最新的,而不是按我們期望的那樣對專案檔案進行清楚操作。make這樣的行為,是因為它將clean當做檔案來處理,在當前目錄下找到了clean檔案,而且clean目標沒有任何先決條件,所以當我們要求make構建clean目標時它會認為clean檔案是最新的,從而拒絕我們真正的檔案清除操作。出現這種情形,是因為我們對clean目標的定義與make所理解的有出入。目錄檔名與makefile的目標名重名在現實專案中是難免的,假目標(phony target)概念的提出正是為了解決這種問題的。
假目標採用 .phony關鍵字來定義,注意必須是大寫字母。運用假目標之後,更改makefile並執行如下:
採用.phony關鍵字宣告乙個目標之後,make並不會將其當做乙個檔案來處理。可以想象,由於假目標並不與檔案關聯,所以每次構建假目標時它所在規則中的命令一定會被執行。拿這裡的clean目標做比方,即使多次執行make clean,make每次都會執行檔案清楚操作。
運用變數提高可維護性:
編寫專業的makefile離不開變數,通過使用變數可以使得makefile更具可維護性。
運用變數改寫第乙個makefiel。
1定義變數時其值可以為空,即無右值。引用變數需要採用 $(變數名)或 $ 的形式。.phony: clean
23 cc = gcc
4 rm = rm
56 exe =******
7 objs =main.o foo.o89
$(exe): $(obj)
10 $(cc) -o $(exe) $(objs)
11main.o:main.c
12 $(cc) -o main.o -c main.c
13foo.o:foo.c
14 $(cc) -o foo.o -c foo.c
15clean:
16 $(rm) -rf $(exe) $(objs)
引入變數之後,如果需要更改編譯器,只需要更改賦值變數的地方,其實相當於c語言巨集定義的作用,便於更改移植。
上面的makefile,存在目標名和先決條件名在規則中重複出現,如果目標名或先決條件發生了改變,那麼得在相應的命令中跟著更改這個很麻煩,為了省去這種麻煩,我們借助於如下一些自動變數:
除了這三個自動變數外,在makefile中還可以使用其他的自動變數,後面需要使用到的時候再提及。目前******專案用這三個變數就足夠了。
用上面的變數測試上面的makefile,再正式介紹之前,得先介紹另外乙個知識點。
在makefile中,dollar符(這個字元
最後一行是乙個只有目標的規則,如果除去它會有什麼問題呢?讀者可以自己試試。
注釋(makefile中用#表示注釋,需要注釋多行,在注釋行的末尾加上反斜槓"\",下一行也會被注釋)最後一行之後報錯如上圖。顯示沒有規則建立上述目標。因為all的先決條件決定了構建all目標之前必須先構建first ,而first如果不存在,報錯也是應該的。
採用自動變數之後執行結果的makefile如下所示:
Makefile學習之路 3
特殊變數 在makefile中,有兩個變數特殊變數會經常用到 make和makecmdgoals。make變數表示的是當前處理makefile的命令名是什麼。當需要在makefile中執行另乙個makefile時,需要用到這個變數。makecmdgoals變數表示的是當前構建的目標名。從測試結果來看...
Makefile學習之路之(一)
makefile 文字編輯三個要素 格式為 目標 依賴 tab命令 目標 所謂目標為為主目標鋪墊分支 類似於乙個變數的名稱,它對應執行命令 依賴 基礎檔案 編譯完成的檔案以及目標 命令基於的檔案 命令 為目標執行的命令。執行何種命令 phony 指定偽目標 偽目標會每次都被執行不進行檢查該目標是否為...
Python學習之路(2)
從list或tuple中取部分元素。list 1,2,3,4 list 0 3 1,2,3 list 2 1 1表示最後乙個,3,4 list 1 2 index 1開始,每兩個取乙個 2,4 list 複製list,1,2,3,4 針對tuple,切片同樣適用可迭代,迭代器,集合型別資料可迭代但不...