2012-03-12 12 views
4

私のmakefileでは、コマンドラインの変数値に基づいて変数を代入する必要があります。例えば、私が行いますmakefile:変数内の単語の位置を見つける

var_1が言う100個の値のいずれかを持つことができます
make var_1=xxx 

var_1という値に基づいて、私はメイクファイルにvar_2の値を割り当てる必要があります。私は何ができる:

ifeq ($(var_1), a) 
    var_2 = A 
endif 
ifeq ($(var_1), b) 
    var_2 = B 
endif 

などvar_1var_2のすべての100個の可能な組み合わせのために。ここでa,A,b,Bはいくつかの文字列を表します。 ifの100文を避けるにはどうすればよいですか?私は2つの変数を定義するために考えていた:

var_1_values = a b c d  
var_2_values = A B C D 

私は$(var_1)$(var_1_values)の中にあるかどうかを確認するために$(findstring $(var_1),$(var_1_values))を使用することができますが、どのように私はすべての$(var_1_values)$(var_1)の位置を特定できますか?その位置は、$(var_2_values)の対応する単語を選択するために使用されます。

+0

いやはやです!私は行かなかった。私の完全に間違った方向の答えを削除しました。申し訳ありません。 – RishiG

+0

クール、あなたが解決策を持ってうれしい – RishiG

答えて

5

それは少しkludgeyだが、そこにいた場合、あなたはこれを行うことができます(「_」など)のいずれかの値になりません知っている記号:

var_1_values = a b c d 
var_2_values = A B C D 

# This will be a_A b_B c_C d_D 
LIST1 = $(join $(addsuffix _,$(var_1_values)),$(var_2_values)) 

var_1 := a 

# The filter gives a_A, the subst turns it into A 
var_2 = $(subst $(var_1)_,,$(filter $(var_1)_%, $(LIST1))) 
4

一つの方法は、連想コンテナをシミュレートmakeはcomputed variablesを使用します。例:

var_2.a := A 
var_2.b := B 
# ... 

# lookup 
var_2 = ${var_2.${var_1}} 
# or, lookup and assign a default value if lookup fails 
var_2_or_default = $(or ${var_2.${var_1}},<default-value>) 
+0

それは構造体データ構造のように見えますが、それはすべてテキスト操作です。すごくいい! –

3

これはGNUの内側に再帰を使用して、かなりslickly行うことができ、次のように機能します

_pos = $(if $(findstring $1,$2),$(call _pos,$1,\ 
     $(wordlist 2,$(words $2),$2),x $3),$3) 
pos = $(words $(call _pos,$1,$2)) 

それを使用するには次の2つの引数を持つpos機能$(call)う:見つけてアイテムをし、それができるようになるまでそれが$2引数を通じて再帰によって動作します。例えば、

$(call pos,a,a b c d e f g) 
$(call pos,e,a b c d e f g) 
$(call pos,g,a b c d e f g) 
$(call pos,h,a b c d e f g) 
$(call pos,e,)) 

でそれを見つけるためにリスト値を見つけたら$1にしてください。それが繰り返されるたびに、$(wordlist 2,$(words $2),$2)を使用して$2を頭で叩きます。それぞれの回帰が繰り返されるたびに、返された文字列にxが追加され、$2から$1までの各位置に1つずつxが存在します。

_posxの数)からの戻り値の長さをカウントするには、$(words)を使用します。

あなたがGMSLプロジェクトを使用する場合、これは、より多くのslickly書き込みにこれを書くことができます。(それは標準GNU機能を作るのです)現在の関数の名前が含まれています、私はここに$0を使用

_pos = $(if $(findstring $1,$2),$(call $0,$1,$(call rest,$2),x $3),$3) 
pos = $(words $(call _$0,$1,$2)) 

注意GMSL機能restは、リストから頭を払う。

3

次のように、再帰を使用してこれを行うにはスムーズな方法があります。最初にposという名前の関数を定義し、リスト内の要素の位置を見つけ、次に$(word)を使用して、別のリスト内の対応する要素を抽出します。

ここposです:

_pos = $(if $(findstring $1,$2),$(call _pos,$1,\ 
     $(wordlist 2,$(words $2),$2),x $3),$3) 
pos = $(words $(call _pos,$1,$2)) 

は、それがどのように機能するかを理解するために、この答えを読む:Makefile: find function which returns position

今では、リスト内の要素や発見、他の対応する要素を見つけた関数を定義するのは簡単ですリスト。その後、

lookup = $(word $(call pos,$1,$2),$3) 

そして出た場合、このようにしてみてください:NATOのアルファベットにアルファベットの文字から変換to-nato機能を作るために

ALPHA := a b c d e f g h i j k l m n o p q r s t u v w x y z 
NATO := alpha beta charlie delta echo foxtrot gamma hotel india\ 
     juliet kilo lima mike november oscar papa quebec romeo\ 
     sierra tango uniform victor whisky yankee zulu 
to-nato = $(call lookup,$1,$(ALPHA),$(NATO)) 

。メイクの

1
FAB = macrofab 
# NOTE: base starts at 1 instead of 0 
none := 1 
seeed := 1 
oshpark := 2 
macrofab := 2 
pcbng := 3 
#NOTE: String must end with a space for word function to work 
SUFFIX_DRILLS := "txt xln drl " 

.PHONY: gerber 

gerber: 
    @echo $(FAB) drill suffix is $(word $($(FAB)), $(SUFFIX_DRILLS)) 

出力は次のとおりです。 macrofabドリルサフィックスは、XLN

関連する問題