我想编写一个Makefile(gnu make),如下所示,即对于存储在变量中的给定值列表,我想运行一个命令。是否有可能或者我必须写一个丑陋的for循环?
丑陋的规则有效但聪明却没有。
SERVERS:=localhost
COMMAND:=uptime
OUTPUTS:=$(patsubst %, %.output ,$(SERVERS))
.PHONY: smart ugly
smart: $(OUTPUTS)
%.output: %
ssh -n $^ $(COMMAND) > $@ || $(RM) $@
ugly:
for s in $(SERVERS); do \
ssh -n $$s $(COMMAND) > $$s.output || $(RM) $$s.output; \
done
答案 0 :(得分:1)
智能规则会查找必备文件%(示例中为localhost),该文件不存在。相应地跳过该规则。
所以,请使用:
%.output:
相反,它应该工作。
此外,您可能需要查看特殊的.DELETEONERROR目标,而不是|| rm $@
。在您的表示法中,失败的SSH仍然以退出代码0(来自rm)退出,并且整个make过程将成功退出或(当%.output是依赖项时)在失败后继续愉快地继续。