2016-01-11 95 views
3

兩個目標是通過一個規則是這樣滿足:GNU Make中的互斥量?

foo.o foo.h : 
    build_foo # this makes both foo.o and foo.h 

後來,一些目標需要一個,則需要兩個:

bar : foo.o 
    build_bar 

baz : foo.h 
    build_baz 

qux : bar baz 
    build qux 

如何防止配方的時候被調用make運行兩次與-jN

+1

另外,在GNU Make手冊中有一個關於這個的章節:https://www.gnu.org/software/automake/manual/html_node/Multiple-Outputs.html – nos

回答

1

我可以避免模式規則。在你的情況下,你會發現在配方運行後,foo.ofoo.h中的一個比另一個更新(對其使用$ ls --full-time)。

讓我們假設你的配方創建foo.h,然後繼續創建foo.o。這表明:

foo.o: foo.h ; # Empty recipe 

foo.h: prereq1 prereq2 ... 
    build_foo 

所以,現在如果foo.o是另一個規則prequisite,make將建設foo.h第一,創造foo.o的副作用。然後它會運行foo.o的配方。任務完成。

如果你感到不安, 您可以添加一個簡單的斷言foo.o確實出現不到foo.h

foo.o: foo.h 
    test [email protected] -nt $< 

欲瞭解更多有關這個話題,檢查出的automake(未作)一章題爲Handling Tools that Produce Many Outputs

1

你這樣做是通過教導讓這個食譜同時建立兩個目標

你的目標:

foo.o foo.h : 
    build_foo # this makes both foo.o and foo.h 

是使同這些目標看到:

foo.o : 
    build_foo # this makes both foo.o and foo.h 

foo.h : 
    build_foo # this makes both foo.o and foo.h 

這就是問題所在。

您需要的是一個指定兩個目標文件的模式規則。

%.o %.h : 
    build_foo # this makes both foo.o and foo.h 

這對於這個(但你真的想給它理智的先決條件)的作品,因爲如何GNU化妝處理pattern rules當他們指定多個目標:

模式規則可能有不止一個目標。與一般規則不同,這不具有許多具有相同先決條件和配方的不同規則。如果模式規則具有多個目標,則make知道規則的配方負責製作所有目標。該配方僅執行一次以製作所有目標。當搜索模式規則以匹配目標時,除了與需要規則的目標相匹配的規則以外的規則的目標模式是偶然的:make僅擔心爲目前存在問題的文件提供配方和先決條件。但是,在運行此文件的配方時,其他目標被標記爲已自行更新。