2016-08-23 7 views
0

にドットで文字列を分割することができます今、私は中にいることを得ることができる方法test.var1.var2.var3のような1つの以上のレベルをしたい私はこのはどのように私はメイクファイル

test.% 
    export var1=$(basename $*) && export var2=$(subst .,,$(suffix $*)) 

のような目標を作る持っていると私はtest.var1.var2

のように使用しますメイク

編集:私は、複数のアプリを展開するためのファイルを作成し使用していますし、私は多くの変数をしたいので、私はこれをしたい

理由があります。そのようにユーザの配置は

+0

[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のように聞こえるが、なぜこれを正確に行う必要があるのだろうか? – user657267

+0

@ user657267質問を編集しました – Karl

+1

'make app = app1 action = test build = 4.2.1'という非常に複雑な方法のようです。 – user657267

答えて

4

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. 

テンプレートの機能を適切に抽象化すれば、柔軟で簡単に保守可能なビルドシステムを作成できます。

+0

おかげで、これは私がlokkingしていたもの – Karl