origin 函數(shù) -- 告知變量的出生情況
origin 函數(shù)的作用是告訴你變量是哪里來的,其出生狀況如何,他并不改變變量。其語法是:
$(origin <variable>)
上面,<variable> 為變量的名字,而不是引用,所以一般沒有 $ 字符在前。origin 函數(shù)通過返回值來告訴你 <variable> 的出生情況。下面用實例說明:
1. 當從來未定義過該變量時,origin 函數(shù)返回 "undefined" 。如下面的 Makefile 代碼:
all: @echo $(origin V)
運行輸出:
$ make undefined
2. 如果該變量為環(huán)境變量,那么返回 "enviroment" 。如下面的 Makefile 代碼:
all: @echo $(origin USER)
運行輸出:
$ make environment
其中 USER 這個變量為系統(tǒng)定義的當前用戶,使用 env 命令可以看到。
3. 如果變量是個默認定義,那么返回 "default"。如下面的 Makefile 代碼:
all: @echo $(origin CC)
運行輸出:
$ make default
4. 如果一個變量被定義在 Makefile 文件中,那么返回 "file" 。如下面的 Makefile 代碼:
V := 1 all: @echo $(origin V)
運行輸出:
$ make file
5. 如果變量來自命令行,那么返回 "command line" 。如下面的 Makefile 代碼:
all: @echo $(origin MyVar)
運行方法:
$ make MyVar="Are you ok?" command line
6. 如果變量被 override 被重新定義過,那么返回 "override"。如下面的 Makefile 代碼:
verride SHELL = /bin/sh all: @echo $(origin SHELL)
運行輸出:
$ make override
上面,SHELL 原本是個環(huán)境變量,但在 Makefile 里被 override 指示符重定義過。
7. 如果變量是自動化變量(如 $@, $< 等),那么返回 "automatic" 。如下面的 Makefile 代碼:
all: @echo $(origin @)
運行輸出:
$ make automatic
這些信息對于我們編寫Makefile是非常有用的,例如,假設我們有一個Makefile其包了一個定義文件Make.def,在Make.def中定
義了一個變量“bletch”,而我們的環(huán)境中也有一個環(huán)境變量“bletch”,此時,我們想判斷一下,如果變量來源于環(huán)境,那么我們就把之重定義了,
如果來源于Make.def或是命令行等非環(huán)境的,那么我們就不重新定義它。于是,在我們的Makefile中,我們可以這樣寫:
ifdef bletch
ifeq "$(origin bletch)" "environment"
bletch = barf, gag, etc.
endif
endif
當
然,你也許會說,使用override關鍵字不就可以重新定義環(huán)境中的變量了嗎?為什么需要使用這樣的步驟?是的,我們用override是可以達到這樣
的效果,可是override過于粗暴,它同時會把從命令行定義的變量也覆蓋了,而我們只想重新定義環(huán)境傳來的,而不想重新定義命令行傳來的。 四、foreach 函數(shù)
foreach函數(shù)和別的函數(shù)非常的不一樣。因為這個函數(shù)是用來做循環(huán)用的,Makefile中
的foreach函數(shù)幾乎是仿照于Unix標準Shell(/bin/sh)中的for語句,或是C-Shell(/bin/csh)中的foreach
語句而構建的。它的語法是:
$(foreach <var>;,<list>;,<text>;)
這
個函數(shù)的意思是,把參數(shù)<list>;中的單詞逐一取出放到參數(shù)<var>;所指定的變量中,然后再執(zhí)
行<text>;所包含的表達式。每一次<text>;會返回一個字符串,循環(huán)過程中,<text>;的所返回的每
個字符串會以空格分隔,最后當整個循環(huán)結束時,<text>;所返回的每個字符串所組成的整個字符串(以空格分隔)將會是foreach函數(shù)
的返回值。
所以,<var>;最好是一個變量名,<list>;可以是一個表達式,而<text>;中一般會使用<var>;這個參數(shù)來依次枚舉<list>;中的單詞。舉個例子: names := a b c d
files := $(foreach n,$(names),$(n).o) 上面的例子中,$(name)中的單詞會被挨個取出,并存到變量“n”中,“$(n).o”每次根據(jù)“$(n)”計算出一個值,這些值以空格分隔,最后作為foreach函數(shù)的返回,所以,$(files)的值是“a.o b.o c.o d.o”。
注意,foreach中的<var>;參數(shù)是一個臨時的局部變量,foreach函數(shù)執(zhí)行完后,參數(shù)<var>;的變量將不在作用,其作用域只在foreach函數(shù)當中。
|