$@ Target的檔名
$% 程式庫成員中的檔名元素
$< 第一個prequeite的檔名
$? Timestamp 在Target之後的Prequeite
$^ 所有的Prequeite的檔名 但不包含重複部分
$+ 所有的Prequeite的檔名
$* Target的主檔名
Makefile的賦值運算符(=, :=, +=, ?=)
1. ?=
這個是適用於想表達如果?=左邊的變數從未被設定過的話 就讓它設定成右邊的內容、數值
如果已經有值了 就不進行任何變動
2. =
在makefile官方文件中 使用=的時機是希望讓左邊的變數成為"recursively expanded variable" 也就是當變數真的被使用到的時候 在進行遞迴展開
所以就可以先定義 後續再補數值
以下提供一個例子
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
如果使用以上兩行的定義 當CFLAGS真的要被使用時就會展開成 -lfoo -lbar -O 所以可以後定義、補充include_dirs的內容
然後這樣子的特性可能會帶來兩個壞處
第一個是有可能造成無限遞迴 以下就是一個例子 不過這個makefile會提示bug 所以倒也還好修正
CFLAGS = $(CFLAGS) -O
CFLAGS要被使用時會造成無限迴圈
另外一個壞處是跟效能有關的:
因為遞迴展開也適用於函式 所以函式的展開執行也會發生在變數要被使用的時候 也就是說如果變數要被重複使用幾次 函式就會展開跑幾次
所以效能就可能不太好
3. :=
在markfile官方文件中 使用:=的時機是希望讓左邊的變數成為"Simply expanded variable" 也就是當這一行敘述被執行時 就馬上進行展開
所以一旦跑完:=後 就不再存在任何reference在變數中
4. +=
最後一個是+= 用來增加敘述在原有已經定義的變數中
如果+=左邊的變數還沒定義過 那+=執行的效果就會跟=一樣 也就是recursively-expanded variable.
如果變數曾經定義過 那+=跑起來的效果就會視前一次定義是用=或者:=來決定跑完後是recursively-expanded variable或者是simply expanded variable
1. =
make會將整個makefile展開後,才決定變數的值。也就是说,變數的值會是整個Makefile中最後被指定的值。看例子:
x = hello
y = $(x) world!
x = hi
all:
@echo $(y)
在上例中,輸出結果將會是 hi world! ,而不是 hello world!
2. :=
變數的值在Makefile展開途中就會被給定,而不是整個Makefile展開後的最终值。
x := hello
y := $(x) world!
x := hi
all:
@echo $(y)
輸出結果 ====> hello world!
這個是適用於想表達如果?=左邊的變數從未被設定過的話 就讓它設定成右邊的內容、數值
如果已經有值了 就不進行任何變動
2. =
在makefile官方文件中 使用=的時機是希望讓左邊的變數成為"recursively expanded variable" 也就是當變數真的被使用到的時候 在進行遞迴展開
所以就可以先定義 後續再補數值
以下提供一個例子
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
如果使用以上兩行的定義 當CFLAGS真的要被使用時就會展開成 -lfoo -lbar -O 所以可以後定義、補充include_dirs的內容
然後這樣子的特性可能會帶來兩個壞處
第一個是有可能造成無限遞迴 以下就是一個例子 不過這個makefile會提示bug 所以倒也還好修正
CFLAGS = $(CFLAGS) -O
CFLAGS要被使用時會造成無限迴圈
另外一個壞處是跟效能有關的:
因為遞迴展開也適用於函式 所以函式的展開執行也會發生在變數要被使用的時候 也就是說如果變數要被重複使用幾次 函式就會展開跑幾次
所以效能就可能不太好
3. :=
在markfile官方文件中 使用:=的時機是希望讓左邊的變數成為"Simply expanded variable" 也就是當這一行敘述被執行時 就馬上進行展開
所以一旦跑完:=後 就不再存在任何reference在變數中
4. +=
最後一個是+= 用來增加敘述在原有已經定義的變數中
如果+=左邊的變數還沒定義過 那+=執行的效果就會跟=一樣 也就是recursively-expanded variable.
如果變數曾經定義過 那+=跑起來的效果就會視前一次定義是用=或者:=來決定跑完後是recursively-expanded variable或者是simply expanded variable
ex
make會將整個makefile展開後,才決定變數的值。也就是说,變數的值會是整個Makefile中最後被指定的值。看例子:
x = hello
y = $(x) world!
x = hi
all:
@echo $(y)
在上例中,輸出結果將會是 hi world! ,而不是 hello world!
2. :=
變數的值在Makefile展開途中就會被給定,而不是整個Makefile展開後的最终值。
x := hello
y := $(x) world!
x := hi
all:
@echo $(y)
輸出結果 ====> hello world!
沒有留言:
張貼留言