1

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

1 回答 1

2

不幸的是,我们在 Make 中没有一个干净的方法来做到这一点。这个任务结合了一些 Make 做得不好的事情。

Make 不能很好地处理通配符(或者根本不能处理正则表达式),所以像这样的结构是./%/combine_m%.root : ./%/comb.root行不通的。我认为我们能得到的最接近的是罐头食谱

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,但它是一个更丑陋的 hack。

于 2012-10-25T15:09:31.943 回答