2011-10-31 12 views
0

私は、変数に格納された値のリストに対して、次のようなMakefile(gnu make)を書いています。コマンドを実行したいと思います。それは可能ですか、私は醜いforループを書く必要がありますか?変数を入力として使用する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: 

代わりに、それが動作するはずです。

また、|| rm [email protected]ではなく、特殊な.DELETEERRORターゲットを見ている可能性があります。あなたの表記法では、失敗したSSHは終了コード0(rmから)で終了し、成功するとmakeプロセス全体が終了するか、(%.outputが依存している場合)失敗後もうまくいっています。