2

我喜欢 Dylan 对“迭代 Makefile 中的列表”、 迭代 Makefile 中的列表的问题的回答?并尝试做类似的事情,但遇到了麻烦。也许儿子可以帮忙。

我的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 乔

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

set_global -name PARTITION_NAME 卡尔:玛丽

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

set_global -name PARTITION_NAME 弗里茨

set_global -color PARTITION_COLOR 蓝色 -name PARTITION_NAME Fritz

我不知道为什么我在前两次调用 print_tmp 结束时得到“@echo in print_tmp”(或者可能是最后两次调用 print_tmp 的开始?)

有人可以帮忙吗?

谢谢,马克

4

1 回答 1

3

这是因为您在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,然后作为 shell 命令执行并生成:

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 回答