使用Makefile模式

时间:2012-10-25 12:00:13

标签: makefile

我正在尝试编写一个相对简单的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

1 个答案:

答案 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的方法,但这是一个更加丑陋的黑客攻击。