2013-07-10 19 views
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會正確同步嗎?

回答

3

是的,GNU make的並行化支持可以正確處理它(如果沒有的話,它不會很有用!)一般來說,如果你的makefile環境完全正確地聲明瞭你的依賴關係圖,無論並行作業的數量如何,都可以正確構建它。

訣竅是,對於某些複雜環境,完全正確地聲明依賴關係圖很困難。但對於像上面這樣的簡單情況,沒有問題。

+0

好。感謝您的確認。 「可能很難完全正確地聲明依賴關係圖」我認爲你的意思是遞歸makefile(yuck)。我有一些,所以我仍然可能需要處理問題。但我過去已經處理過了:做一個2階段製作:(階段0:通用依賴製作階段1)有沒有更好的方法? –

+0

沒有細節,不可能說是否有更好的方法。有許多先進的make功能,比如僅依賴訂單的依賴項,根據您的情況,這可能會幫助您,也可能不會幫助您。另外,儘管遞歸makefile是一個複雜的事情,但它們並不是唯一的一個:具有多個輸出文件的配方(特別是輸出文件名不相關時)是棘手的,還有其他複雜的依賴關係難以建模。 – MadScientist

+0

請注意,GNU make does not處理在您的示例中common的配方在填充內容之前創建一個名爲common的文件的情況。如果將命令的輸出重定向到文件,可能會發生這種情況,因爲會立即創建空文件。我發現這很困難:( – Collin