subst
を使用してリストになるように置き換えます。
word-dot = $(word $2,$(subst ., ,$1))
test.%:
export var1=$(call word-dot,$*,1) && export var2=$(call word-dot,$*,2) && export var3=$(call word-dot,$*,3)
出力:次に、特定の要素にアクセスするためにword
を使用し、あなたが知っている場合には、事前に、脇として
$ make test.foo.bar.baz
export var1=foo && export var2=bar && export var3=baz
(それは実際に私の答えのほとんどを取るだろうが)どのようなオプションは、あなたはいくつかの強力なメタプログラミングに行くことができます。あなたには、いくつかのAPPS
ためtest-{app}
ターゲットを生成したいと言う:
tmpl-for = $(foreach x,$2,$(call $1,$x))
rule-for = $(foreach x,$2,$(eval $(call $1,$x)))
APPS := foo bar baz
tmpl-test = test-$1
define test-vars-rule
$(call tmpl-test,$1): APP := $1
.PHONY: $(call tmpl-test,$1)
endef
$(call rule-for,test-vars-rule,$(APPS))
$(call tmpl-for,tmpl-test,$(APPS)):
@echo Testing app: $(APP)
最初の2行はリストの各要素のための「テンプレート」(tmpl-for
)を呼び出したり、ルールを生成します「ライブラリ」機能(rule-for
)ですあなたは第二引数として提供します。私はtmpl-test
を作成し、それはアプリ名をとり、test-{app}
となります。私は、アプリケーション名をとり、適切なtest-{app}
ターゲットのターゲット固有のAPP
変数を設定するルールテンプレートを定義します(これはまた偽りです)。次に、rule-for
を使用して、APP
を設定するためのすべてのルールを作成します。最後に、ターゲットの実際のボディを書いて、tmpl-for
を使ってすべてのターゲットのリストを取得します。
$ make test-foo
Testing app: foo
$ make test-bar
Testing app: bar
$ make test-baz
Testing app: baz
$ make test-blah
make: *** No rule to make target 'test-blah'. Stop.
テンプレートの機能を適切に抽象化すれば、柔軟で簡単に保守可能なビルドシステムを作成できます。
[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のように聞こえるが、なぜこれを正確に行う必要があるのだろうか? – user657267
@ user657267質問を編集しました – Karl
'make app = app1 action = test build = 4.2.1'という非常に複雑な方法のようです。 – user657267