17

コード:

LIST=0 1 2 3 4 5
PREFIX=rambo

# some looping logic to interate over LIST

期待される結果:

rambo0:
    sh rambo_script0.sh

rambo1:
    sh rambo_script1.sh

私のリストには6つの要素があるため、6つのターゲットを生成する必要があります。将来、さらにターゲットを追加したい場合は、リストを変更するだけで、コードの他の部分には触れないようにしたいと思います。

ループロジックはどのように作成する必要がありますか?

4

3 に答える 3

31

GNU makeを使用している場合は、実行時に任意のターゲットを生成できます。

LIST = 0 1 2 3 4 5
define make-rambo-target
  rambo$1:
         sh rambo_script$1.sh
  all:: rambo$1
endef

$(foreach element,$(LIST),$(eval $(call make-rambo-target,$(element))))
于 2012-04-16T17:54:25.233 に答える
20

テキスト変換関数を使用します。を使用patsubstすると、非常に一般的な変換を行うことができます。ファイル名を作成するために、addsuffixそしてaddprefix両方とも便利です。

ルールには、パターンルールを使用します。

全体的な結果は次のようになります。

LIST = 0 1 3 4 5
targets = $(addprefix rambo, $(LIST))

all: $(targets)

$(targets): rambo%: rambo%.sh
    sh $<
于 2012-04-16T10:51:41.560 に答える
0

@Idelicの答えに対する私の2セント、いくつかのMakeを使用する必要がある場合は、egを使用 し$cmdてそれらをエスケープする必要があります$$

LIST = 0 1 2 3 4 5
define make-rambo-target
$(info create target: $(addprefix rambo_script, $(addsuffix .sh, $1)).)
rambo$1: $$(addprefix rambo_script, $$(addsuffix .sh, $1))
    sh $$<
endef

all: $(addprefix rambo, $(LIST))

$(foreach element, $(LIST), $(eval $(call make-rambo-target,$(element))))

出力:

$ make
create target: rambo_script0.sh.
create target: rambo_script1.sh.
create target: rambo_script2.sh.
create target: rambo_script3.sh.
create target: rambo_script4.sh.
create target: rambo_script5.sh.
sh rambo_script0.sh
sh rambo_script1.sh
sh rambo_script2.sh
sh rambo_script3.sh
sh rambo_script4.sh
sh rambo_script5.sh

注:ここでは、Makeasによって「見られる」ルールがあります

rambo0: $(addprefix rambo_script, $(addsuffix .sh, 0))
    sh $<

しかし、ここでは、エスケープせずに書くことができたはずです。

rambo$1: $(addprefix rambo_script, $(addsuffix .sh, $1))
    sh $$<

したがって、ルールは次のように「見られます」。

rambo0 : rambo_script0.sh
    sh $<

Makeがそれを解析するとき。

于 2020-03-25T11:14:33.250 に答える