Make

序列化 GNU make 中的所有規則:最佳實踐?

  • May 7, 2022

我有一個makefile,想確保所有的規則都是按順序執行的,也就是說,沒有並行執行

我相信我有三種方法可以實現這一目標:

  • .NOTPARALLEL目標,
  • 通過呼叫makeusing make -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 上找到的問題的答案。

引用自:https://unix.stackexchange.com/questions/701717