2013-03-21 59 views
2

我喜歡Dylan給出的問題,「在Makefiles中對列表進行迭代」, Iterating over lists in Makefiles?並試圖做類似的事情,但遇到了麻煩。也許sonmeone可以提供幫助。在Makefiles中重複使用列表 -

我的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紅色

-name PARTITION_NAME Joe @echo in print_tmp

set_global -name PARTITION_NAME卡爾:瑪麗

set_global -color PARTITION_COLOR白色-name PARTITION_NAME卡爾:瑪麗 @echo在print_tmp

set_global -name PARTITION_NAME弗裏茨

set_global -color PARTITION_COLOR藍色 - name PARTITION_NAME Fritz

我不明白爲什麼我在第一個結尾處得到「print_tmp中的@echo」兩次調用print_tmp(或者它可能是最後兩次調用print_tmp的開始?)

有人可以幫忙嗎?

謝謝, 馬克

回答

3

這是因爲你在一個單一line--串在一起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 
+0

很好的例子。謝謝! – 2013-03-22 13:27:13