4.編寫規則
本系列文章均翻譯自make官方文件:make Manual,github同步專案:question
Phony Targets
一個偽目標不是一個真正的檔名,只是一個當你明確的執行make請求時會被執行的recipe名字。有兩個原因使用偽目標:
- 避免同名檔案衝突
- 提升效能
解決的問題:
clean:
rm *.o temp
這種寫法在沒有檔名衝突的時候可以通過make clean
正常執行。但是如果在這個目錄下有一個同名的檔案clean
,clean
總是會被考慮是最新的檔案,它的recipe不會執行。
新增一個偽目標即可解決這個問題:
.PHONY: clean
clean:
rm *.o temp
與make的遞迴呼叫結合使用:
SUBDIRS = foo bar baz
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
這種寫法的問題:任何在sub-make中的錯誤都會被忽視;不能並行構建目標。
改進後的寫法:
SUBDIRS = foo bar baz
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
foo: baz
最後一句宣告瞭baz完成之後才能構建foo。
對於偽目標將跳過隱含規則的搜尋。
偽目標不應該成為一個真實的目標檔案的prerequisites,負責每次make更新檔案都會執行偽目標的recipe。
偽目標也可以有prerequisites:
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
一個偽目標的prerequisites是另一個偽目標時,表現為另一個的子程式:
.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj :
rm *.o
cleandiff :
rm *.diff
執行順序:rm *.o
-> rm *.diff
-> rm program
相關文章
- Protobuf編碼規則
- iptables防火牆簡介,原理,規則編寫,常見案例防火牆
- HAP_編碼規則
- tree-sitter編寫parser,用external scanner實現eof規則
- 尋找適合編寫靜態分析規則的語言
- eKuiper Newsletter 2022-05|protobuf 編解碼支援、視覺化拖拽編寫規則UI視覺化
- 【教程搬運】分析並編寫suricata規則(內含兩個示例)
- 十分鐘瞭解eslint配置 && 編寫自定義eslint規則EsLint
- [Docker 系列]docker 學習十,Compose 編寫規則及wp 實戰Docker
- 如何編寫一個簡單但強大的規則引擎? – maxant
- HTML編寫規範HTML
- LINUX命令列書寫規則Linux命令列
- Makefile-3-書寫規則
- 主資料之編碼規則
- UTF-8編碼規則(轉)
- 體面編碼之命名規則
- nginx偽靜態規則重寫Nginx
- Nginx URL重寫規則配置詳解Nginx
- 缺陷報告編寫規範
- 6. PLSQL 編寫規範SQL
- 5. SQL 編寫規範SQL
- 高效編寫Dockerfile的幾條準則Docker
- 計算機編碼規則之:Base64編碼計算機
- SQLServer的排序規則(字符集編碼)SQLServer排序
- 程式碼規範之前端編寫碼規範前端
- Oculus Quest 2如何改寫遊戲規則?遊戲
- 編寫shell指令碼的規範指令碼
- 4. 環境引數規範
- 4. ARM彙編定址模式-2模式
- python編碼規範以及推導式的編寫Python
- 基於 XAF Blazor 的規則引擎編輯器Blazor
- java安全編碼指南之:Thread API呼叫規則JavathreadAPI
- nginx配置location總結及rewrite規則寫法Nginx
- 規則
- java安全編碼指南之:執行緒安全規則Java執行緒
- 撰寫論文的十個簡單規則 | PLOS
- 正則匹配規則2
- url規則