2
我有一個簡單的例子生成文件,顯示我的問題:在構建具有共同依賴關係的目標時,GNU是否會受到競爭條件的影響?
.PHONY: a.out b.out
all: a.out b.out
common:
echo building common
sleep 1
touch common
a.out: common
echo building a.out
b.out: common
echo building b.out
的a.out & B.OUT取決於普遍,所以可以有一個競爭條件(常見的是產生兩次)做了並行構建時。
我做了-j4並沒有經歷過兩次生成的常見事件。我甚至在共同的一代中發表了一個睡眠聲明,以使事情更具確定性。
因此,可以肯定地說,在構建通用依賴關係時,GNU會正確同步嗎?
好。感謝您的確認。 「可能很難完全正確地聲明依賴關係圖」我認爲你的意思是遞歸makefile(yuck)。我有一些,所以我仍然可能需要處理問題。但我過去已經處理過了:做一個2階段製作:(階段0:通用依賴製作階段1)有沒有更好的方法? –
沒有細節,不可能說是否有更好的方法。有許多先進的make功能,比如僅依賴訂單的依賴項,根據您的情況,這可能會幫助您,也可能不會幫助您。另外,儘管遞歸makefile是一個複雜的事情,但它們並不是唯一的一個:具有多個輸出文件的配方(特別是輸出文件名不相關時)是棘手的,還有其他複雜的依賴關係難以建模。 – MadScientist
請注意,GNU make does not處理在您的示例中common的配方在填充內容之前創建一個名爲common的文件的情況。如果將命令的輸出重定向到文件,可能會發生這種情況,因爲會立即創建空文件。我發現這很困難:( – Collin