Linux之Makefile(foreach)

$(foreach VAR,LIST,TEXT) 
 

函數功能:這個函數的工作過程是這樣的:如果需要(存在變量或者函數的引用) ,

1. 首先展開變量“VAR”和“LIST”的引用;而表達式“TEXT”中的變量引用不展開。

2. 執行時把“LIST”中使用空格分割的單詞依次取出賦值給變量“VAR” ,然後執行“TEXT”表達式重複直到“LIST”的最後一個單詞(爲空時結束) 。“TEXT”中的變量或者函數引用在執行時才被展開,因此如果在“TEXT”中存在對“VAR”的引用,那麼“VAR”的值在每一次展開式將會到的不同的值。 

3.返回值:空格分割的多次表達式“TEXT”的計算的結果。 

我們來看一個例子,定義變量“files”,它的值爲四個目錄(變量“dirs”代表的 a、b、c、d四個目錄)下的文件列表: 
 
dirs := a b c d 
files := $(foreach dir,$(dirs),$(wildcard $(dir)/*)) 
 
例子中,“TEXT”的表達式爲“$(wildcard $(dir)/*)”。表達式第一次執行時將展開
爲“$(wildcard a/*)” ;第二次執行時將展開爲“$(wildcard b/*)” ;第三次展開爲
 
“$(wildcard c/*)”;….;以此類推。所以此函數所實現的功能就和一下語句等價: 
 
files := $(wildcard a/* b/* c/* d/*) 
 
當函數的“TEXT”表達式過於複雜時,我們可以通過定義一箇中間變量,此變量
代表表達式的一部分。並在函數的“TEXT”中引用這個變量。上邊的例子也可以這樣
來實現: 
 
find_files = $(wildcard $(dir)/*) 
dirs := a b c d 
files := $(foreach dir,$(dirs),$(find_files)) 
 
在這裏我們定義了一個變量(也可以稱之爲表達式) ,需要注意,在這裏定義的是“遞
歸展開”時的變量“find_files” 。保證了定義時變量值中的引用不展開,而是在表達式
被函數處理時才展開(如果這裏使用直接展開式的定義將是無效的表達式)。

函數說明:函數中參數“VAR”是一個局部的臨時變量,它只在“foreach”函

數的上下文中有效,它的定義不會影響其它部分定義的同名“VAR”變量的值。
在函數的執行過程中它是一個“直接展開”式變量。 
 
在使用函數“foreach”時,需要注意:變量“VAR”的名字。我們建議使用一個單
詞、最好能夠表達其含義的名字,不要使用一個奇怪的字符串作爲變量名。雖然執行是
不會發生錯誤,但是會讓人很費解。 
沒有人會喜歡這種方式,儘管可能它可以正常工作: 
 
files := $(foreach Esta escrito en espanol!,b c ch,$(find_files)) 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章