2011-10-31 53 views
0

我想寫一個像下面這樣的Makefile(gnu make),即對於存儲在變量中的給定值列表,我想運行一個命令。是否有可能或者我必須寫一個醜陋的循環?使用變量作爲輸入的Makefile規則

醜陋的規則起作用,但聰明不起作用。

SERVERS:=localhost 
COMMAND:=uptime 
OUTPUTS:=$(patsubst %, %.output ,$(SERVERS)) 

.PHONY: smart ugly 

smart: $(OUTPUTS) 

%.output: % 
     ssh -n $^ $(COMMAND) > [email protected] || $(RM) [email protected] 

ugly: 
     for s in $(SERVERS); do \ 
       ssh -n $$s $(COMMAND) > $$s.output || $(RM) $$s.output; \ 
     done 

回答

1

智能規則查找不存在的先決條件文件%(localhost在您的示例中)。該規則相應地被跳過。

所以,使用:

%.output: 

,而不是它應該工作。

此外,您可能需要查看特殊的.DELETEONERROR目標,而不是執行|| rm [email protected]。在你的符號中,一個失敗的SSH依然退出,退出代碼爲0(來自rm),整個make過程將以成功結束或者(當%.output是一個依賴項時)退出失敗之後愉快地繼續。