2

「Makefilesのリストを反復処理する」、Makefilesのリストを反復処理するという質問に対するDylanの回答が気に入りました 似たようなことをしようとしましたが、問題があります。おそらくsonmeoneが助けになるでしょう。

私のMakefile:

PARTITION_TMP:=Joe|red \
               Carl:Mary|white \
               Fritz|blue

partition_tmp:
    @- $(foreach partition_tmp,$(PARTITION_TMP), \
        $(eval N = $(word 1, $(subst |, ,$(partition_tmp)))) \
        $(eval C = $(word 2, $(subst |, ,$(partition_tmp)))) \
        $(call print_tmp, $N, $C) \
    )

define print_tmp
    @echo in print_tmp
    @echo set_global -name PARTITION_NAME $(1)
    @echo set_global -color PARTITION_COLOR $(2) -name PARTITION_NAME $(1)
endef

makeを実行すると、次のようになります。

print_tmp内

set_global -name PARTITION_NAME Joe

set_global -color PARTITION_COLOR red -name PARTITION_NAME Joe @echo in print_tmp

set_global -name PARTITION_NAME Carl:Mary

set_global -color PARTITION_COLOR white -name PARTITION_NAME Carl:Mary @echo in print_tmp

set_global-namePARTITION_NAMEフリッツ

set_global -color PARTITION_COLOR blue-namePARTITION_NAMEフリッツ

print_tmpへの最初の2回の呼び出しの最後に「@echoinprint_tmp」が表示される理由がわかりません(または、print_tmpへの最後の2回の呼び出しの最初ですか?)

誰かが助けることができますか?

ありがとう、マーク

4

1 に答える 1

3

これは、1行でブロックをつなぎ合わせているためですprint_tmpが、ブロックには内部の改行があります。検討:

partition_tmp:
    $(foreach color, red blue, \
  $(call print_tmp, $(color)) \
  )

define print_tmp
    @echo first $(1)
endef

foreach評価@echo first red @echo first blueされ、シェルコマンドとして実行され、次のように生成されます。

first red @echo first blue

次に、マクロに別の行を追加します。

partition_tmp:
    $(foreach color, red blue, \
  $(call print_tmp, $(color)) \
  )

define print_tmp
    @echo first $(1)
    @echo second $(1)
endef

foreach評価します

@echo first red 
@echo second red @echo first blue
@echo second blue

これは以下を生成します:

first red 
second red @echo first blue
second blue

問題を修正するには、空白行を追加するだけです。

define print_tmp
    @echo in print_tmp
    @echo set_global -name PARTITION_NAME $(1)
    @echo set_global -color PARTITION_COLOR $(2) -name PARTITION_NAME $(1)

endef
于 2013-03-21T17:15:46.273 に答える