2014-10-06 19 views
1

當前的Makefile有這樣的事情:如何強制運行命令所有的時間

target1 : lib1.a lib2.a 

target2 : lib1.a lib3.a 

target3 : lib3.a 

lib1.a: 
    $(MAKE) -C sub_dir all 

我想改變這個Makefile,這樣無論目標取決於lib1.a,它始終運行命令「 $(MAKE) -C sub_dir all「,總是。在上面的例子中,另一個詞,target1和target2將始終運行「$(MAKE) -C sub_dir all」。有什麼辦法可以做到嗎?

我知道下面不工作:

target1 : lib2.a 
    $(MAKE) -C sub_dir all 

target2 : lib3.a 
    $(MAKE) -C sub_dir all 

target3 : lib3.a 

因爲如果lib2.a沒有更新,則該命令不運行。我有一個限制,我只控制lib1.a,我無法改變lib2.a的構建方式。

任何幫助表示讚賞!

[UPDATE]我結束了以下解決方案:

target1 : lib1.a lib2.a 

target2 : lib1.a lib3.a 

target3 : lib3.a 

lib1.a: relay 

.PHONY: relay 
relay: 
    $(MAKE) -C sub_dir all 

Etan,你指出了GNU幫助說,力不作爲.PHONY高效,但是從你的解釋,似乎對我來說FORCE更好。我誤解了嗎?你能評論我的解決方案嗎?

+1

您可以添加'.PHONY:lib1.a',但這會導致所有目標始終重新鏈接。 – MadScientist 2014-10-06 22:58:34

+0

使目標依賴於某些東西(sub_dir?),而這又取決於lib1.a – 2014-10-06 23:10:35

回答

5

我認爲Force Target是你在這裏尋找。

lib1.a: FORCE 
     $(MAKE) -C sub_dir all 

FORCE: ; 

相比於一個.PHONY規則(由@MadScientist here的建議),這將不會在和 - 的 - 本身迫使所有的依賴lib1.a的目標,以重建所有的時間。它只會這樣做,如果lib1.a實際更改。

更好的解決方案雖然可能擺脫了完全子做,實際上有lib1.a可用於此的makefile依賴關係信息(無論是直接或通過在sub_dir生成文件在內),因爲這避免了這個完整的「強制此配方,因爲我不能告訴你如何判斷目標是否需要更新「問題。