轉自:http://blog.chinaunix.net/uid-22028680-id-3054167.html
origin 函數的作用是告訴你變量是哪裏來的,其出生狀況如何,他並不改變變量。其語法是:
$(origin VAR),其中VAR爲變量的名字,而不是引用,所以一般沒有 $ 字符在前。origin 函數通過返回值來告訴你 的出生情況。
下面用實例說明:
1. 當從來未定義過該變量時,origin 函數返回 "undefined" 。如下面的 Makefile 代碼:
all:
@echo $(origin V)
運行輸出:
$ make
undefined
2. 如果該變量爲環境變量,那麼返回 "enviroment" 。如下面的 Makefile 代碼:
all:
@echo $(origin USER)
運行輸出:
$ make
environment
3. 如果一個變量被定義在 Makefile 文件中,那麼返回 "file" 。如下面的 Makefile 代碼:
V := 1
all:
@echo $(origin V)
運行輸出:
$ make
file
4. 如果變量來自命令行,那麼返回 "command line" 。如下面的 Makefile 代碼:
all:
@echo $(origin MyVar)
運行方法:
$ make MyVar="Are you ok?"
command line
5. 如果變量被 override 被重新定義過,那麼返回 "override"。如下面的 Makefile 代碼:
override SHELL = /bin/sh
all:
@echo $(origin SHELL)
運行輸出:
$ make
override
6. 如果變量是自動化變量(如 $@, $< 等),那麼返回 "automatic" 。如下面的 Makefile 代碼:
all:
@echo $(origin @)
運行輸出:
$ make
automatic
7. 如果變量是個默認定義,那麼返回 "default"。如下面的 Makefile 代碼:
all:
@echo $(origin CC)
運行輸出:
$ make
default
預定義變量的含義:
$* 不包含擴展名的目標文件名稱。
$+ 所有的依賴文件,以空格分開,並以出現的先後爲序,可能包含重複的依賴文件。
$< 第一個依賴文件的名稱。
$? 所有的依賴文件,以空格分開,這些依賴文件的修改日期比目標的創建日期晚。
$@ 目標的完整名稱。
$^ 所有的依賴文件,以空格分開,不包含重複的依賴文件。
$% 如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱。例如,如果目標名稱爲
test.so(test.o),則 $@ 爲 test.so,而 $% 爲 test.o。
AR 歸檔維護程序的名稱,默認值爲 ar。
ARFLAGS 歸檔維護程序的選項。
AS 彙編程序的名稱,默認值爲 as。
ASFLAGS 彙編程序的選項。
CC C 編譯器的名稱,默認值爲 cc。
CFLAGS C 編譯器的選項。
CPP C 預編譯器的名稱,默認值爲 $(CC) -E。
CPPFLAGS C 預編譯的選項。
CXX C++ 編譯器的名稱,默認值爲 g++。
CXXFLAGS C++ 編譯器的選項。