Make
序列化 GNU make 中的所有規則:最佳實踐?
我有一個makefile,想確保所有的規則都是按順序執行的,也就是說,沒有並行執行。
我相信我有三種方法可以實現這一目標:
- 有
.NOTPARALLEL
目標,- 通過呼叫
make
usingmake -j 1
,- 通過直接在 makefile 中設置標誌,例如,
MAKEFLAGS := -j 1
這三者之間是否存在“最佳實踐”,哪一個更強大?
例如,這樣做是不是有點矯枉過正?
MAKEFLAGS := --jobs=1 .NOTPARALLEL: all:foo bar .NOTPARALLEL: foo:bar .NOTPARALLEL: bar: @echo "test"
?
是的,這太過分了。
就三個選項而言:
- 您永遠不應該設置
MAKEFLAGS
,原因有兩個:它會導致命令行上傳遞的任何標誌出現問題,並且MAKEFLAGS
不能以可以在外部進行穩健修改的方式工作。要查看這兩個問題的實際效果,請將@echo $(MAKEFLAGS)
規則添加到您的bar
配方中,然後執行make -n bar
.make -j 1
具有您所追求的效果,但是當您想暫時串列執行所有內容時,它是最合適的。如果您想限制使用的資源,或者您正在調試並行執行問題,這很有用。這也是預設設置,至少在 GNU Make 中是這樣:預設情況下,Make 一次只執行一個任務。.NOTPARALLEL:
只需要指定一次,也有你想要的效果,並且當序列化要求是 Makefile 的一個屬性時是合適的,即所有執行都應該是串列的,沒有可能的外部影響。但是,如果您的建構將被大量使用,我認為最好花時間弄清楚為什麼並行執行規則會導致問題,並添加適當的依賴項。GNU Make 支持order-only 先決條件,可用於強制排序而不強制“newness”依賴;在這種情況下,這些通常很有幫助。請參閱您在 SO 上找到的問題的答案。