我正在尝试编写一个相对简单的Makefile,但我不确定如何使用模式最好地压缩规则。我尝试使用%
,但遇到了困难。以下是扩展形式的Makefile:
all : ./115/combine_m115.root ./116/combine_m116.root ... ./180/combine_m180.root
./115/combine_m115.root : ./115/comb.root
bash make_ASCLS.sh -l 115 comb.root
./116/combine_m116.root : ./116/comb.root
bash make_ASCLS.sh -l 116 comb.root
...
./180/combine_m180.root : ./180/comb.root
bash make_ASCLS.sh -l 180 comb.root
答案 0 :(得分:2)
不幸的是,我们在Make中没有一个干净的方法。这项任务结合了一些事情,Make做得不好。
Make无法很好地处理通配符(或者正则表达式),因此像./%/combine_m%.root : ./%/comb.root
这样的结构将无效。我认为我们能得到的最接近的是canned recipe:
define apply_script
./$(1)/combine_m$(1).root : ./$(1)/comb.root
bash make_ASCLS.sh -l $(1) comb.root
endef
$(eval $(call apply_script,115))
$(eval $(call apply_script,116))
...
$(eval $(call apply_script,180))
我们可以将事情压缩得更像这样:
NUMBERS := 115 116 # ...180
TARGS := $(foreach n, $(NUMBERS), ./$(n)/combine_m$(n).root)
all : $(TARGS)
...
$(foreach n, $(NUMBERS), $(eval $(call apply_script,$(n))))
还有一种生成NUMBERS
的方法,但这是一个更加丑陋的黑客攻击。