2013-12-14 33 views
2

我想在退出時執行shell命令,而不管它構建的任何目標。似乎make沒有辦法直接做到這一點。然而,這裏的有使在啓動時執行shell命令,不管目標的一個例子:強制Makefile在構建任何目標之後執行腳本(即將退出之前)

Force Makefile to execute script before building targets

是否有任何類似的黑客已經做出退出前執行shell命令就這一次?我可以將命令放在每個目標的底部,但是a)它會被執行多次,並且b)這是醜陋難以管理的。

+0

你的用例是什麼? – JesperE

+1

我需要將退出make過程時釋放的共享資源標記爲已釋放(我通過使用我的問題中的鏈接中顯示的方法將makefile文件啓動時標記爲busy)。 – PonyEars

回答

4

由於亞諾什說,沒有內置make來工廠做到這一點。你可以使用他建議的包裝。你也是,如果你願意忍受一些「bleah」,使用遞歸將它推入你的makefile。它看起來像這樣,或許:

ifdef RECURSING 

    ... normal makefile goes here ... 

else 

.DEFAULT all: 
     @$(MAKE) RECURSING=true [email protected] ; r=$$? ; \ 
     <extra shell command here>; \ 
     exit $$r 

endif 
+0

謝謝,我最喜歡這種方法,因爲我可以簡單地輸入make而不必記住執行腳本。 – PonyEars

+0

一個問題:我注意到我被迫輸入'make all'而不是隻能輸入'make'。有沒有辦法來解決這個問題? – PonyEars

+0

當然,只需添加「全部」作爲真正的目標;我會編輯答案。 – MadScientist

3

我看到的唯一的解決方案是創建一個簡單的傳遞所有參數到make包裝腳本,然後運行你想要的自定義操作:

#!/bin/sh 
make $* && ./custom_script.sh 
+1

可能使用包裝器makefile而不是包裝器shell腳本。這就像MadScientist的答案,除了會有兩個makefile而不是一個。 –

+0

謝謝,這是我一直使用的破解,但缺點是,人們不得不記得調用包裝。 – PonyEars

2

你可以使用兩個makefile,其中一個調用另一個。例如

wrapper.mk:

foo bar: 
     make -f other.mk [email protected] 
     @echo finished 
.PHONY: foo bar 

other.mk:

foo bar: 
     @echo Building [email protected] 

然後運行 ​​「讓-f wrapper.mk富」,wrapper.mk運行other.mk建富。 .PHONY目標表示無論文件是否存在,每次都將目標傳遞給other.mk。

這需要列出wrapper.mk中的所有目標 - 可以通過使用默認規則或匹配任何規則的方法將其列出。

+0

我會補充說,shell腳本封裝解決方案更簡單,不太可能中斷。 –

相關問題