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、これはさらに厄介なハックです。

于 2012-10-25T15:09:31.943 に答える