2016-12-20 4 views
1

私はこれを生成しようとしていますmakefileをします追加は値は、変数が動的に

MYFLAGS += -DMYVAR0=$(MYVAR0) 
MYFLAGS += -DMYVAR1=$(MYVAR2) 
MYFLAGS += -DMYVAR2=$(MYVAR3) 

は、私が以前に$(NUM_VARSを)持っている変数から追加する方法を多くのMYVARs知っています。 これは私が試したものです:

ITER := 0 
while[ $(ITER) -lt $(NUM_VARS)];\ 
     do\ 
      MYFLAGS += -DMYVAR$(ITER)=$(MYVAR$(ITER));\ 
done 

は私がループしながら、追加するには、この方法を使用することはできますか?

+0

GNU Makeを使用していると仮定して、[マニュアルを読む](https://www.gnu.org/software/make/manual/make.html)にしてください。 [foreach関数について](https://www.gnu.org/software/make/manual/make.html#Foreach-Function)を読むのと同じですか? –

+0

@Someprogrammerdudeはい、foreach関数について読んだことがありますが、固定リストが必要なので、私のケースに合わないと思います。私の場合、NUM_VARSは固定されていません。 – Codename

+0

どのように 'NUM_VARS'を設定しますか?別の場所で使っていますか?代わりに数字のリストに変更することは可能でしょうか? –

答えて

3

にexpanedされましたこのような数字のシーケンスを得るためのシェルです:

NUM_RANGE := $(shell seq 0 $(NUM_VARS)) 

次にあなたがこれを行うことができます:

MYFLAGS += $(foreach N,$(NUM_RANGE),-DMYVAR$N=$(MYVAR$N)) 

は最後に余分なスペースに注意してください。 shellを使用せずにNUM_RANGEを取得するのはおそらくトリッキーな方法ですが、

+0

これはそうするようです。コメントの中にSome Programmer Dudeが提案したように。また、この解決策は私にはわかりやすく感じます。 – Codename

1

これを試してみてください:

NUM := 3 
MYFLAGS += $(shell flag=""; for i in $$(seq $(NUM)); do flag=$["$${flag}-DMYVAR$${i}=\$$(MYVAR$${i}) "; done; echo $$flag) 

all: 
    echo '$(MYFLAGS)' 

サンプル出力を:

echo '-DMYVAR1=$(MYVAR1) -DMYVAR2=$(MYVAR2) -DMYVAR3=$(MYVAR3)' 
-DMYVAR1=$(MYVAR1) -DMYVAR2=$(MYVAR2) -DMYVAR3=$(MYVAR3) 

通知を文字列出力にエコーした後、$(MYFLAGS)とは何の使用について-DMYVAR1=$(MYVAR1) -DMYVAR2=$(MYVAR2) -DMYVAR3=$(MYVAR3)

2

他の回答はシェル、seq、foreachで優れており、おそらくすべてのニーズに適しています。 シェルおよび配列の使用には問題がある(例えば、配列は使用できません)、それだけでメイクしてシーケンスを生成することは容易である:

NUM?=3 

ENCODE=$(or $(and $(word $(1), $(2)), $(2)), $(call ENCODE, $(1), x $(2))) 
encoded=$(call ENCODE, $(NUM)) 
$(warning encoded: $(encoded)) 

GENERATE=$(or $(and $(word $(1), $(2)), $(2)), $(call GENERATE, $(1), $(2) $(words 0 $(2)))) 
sequence=$(call GENERATE, $(NUM)) 
$(warning sequence: $(sequence)) 

ENCODE直接(番号をコードGNU Make Standard Libraryで使用される符号化からインスピレーションを得ています同じ長さのxのシーケンスに変換する)。 GENERATEはseqと同じ結果を返します。両方を改善して1つ以上のステップを追加するなどして、ステップを追加することができます。結果の変数は、他の答えで説明されているようにforeachで使用できます。

[email protected]:~$ make NUM=13 
Makefile:5: encoded: x x x x x x x x x x x x x    
Makefile:9: sequence:    1 2 3 4 5 6 7 8 9 10 11 12 13 
make: Nothing to be done for 'all'. 
関連する問題