电竞比分网-中国电竞赛事及体育赛事平台

分享

origin 函數(shù) -- 告知變量的出生情況

 WUCANADA 2013-02-11

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ù)當中。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多