筆記一下makefile的四種等於的差異
雖然平常工作比較少從零開始寫markfile
但偶而還是需要修改一下既有的檔案
makefile總共有四種等於 先從最簡單的開始
- ?=
這個是適用於想表達如果?=左邊的變數從未被設定過的話 就讓它設定成右邊的內容、數值
如果已經有值了 就不進行任何變動
- =
在makefile官方文件中 使用=的時機是希望讓左邊的變數成為"recursively expanded variable" 也就是當變數真的被使用到的時候 在進行遞迴展開
所以就可以先定義 後續再補數值
以下提供一個例子
CFLAGS
= $(include_dirs) -O
include_dirs
= -Ifoo -Ibar
如果使用以上兩行的定義 當CFLAGS真的要被使用時就會展開成 -lfoo -lbar -O 所以可以後定義、補充include_dirs的內容
然後這樣子的特性可能會帶來兩個壞處
第一個是有可能造成無限遞迴 以下就是一個例子 不過這個makefile會提示bug 所以倒也還好修正
CFLAGS
= $(CFLAGS) -O
CFLAGS要被使用時會造成無限迴圈
另外一個壞處是跟效能有關的:
因為遞迴展開也適用於函式 所以函式的展開執行也會發生在變數要被使用的時候 也就是說如果變數要被重複使用幾次 函式就會展開跑幾次
所以效能就可能不太好
- :=
在markfile官方文件中 使用:=的時機是希望讓左邊的變數成為"Simply expanded variable" 也就是當這一行敘述被執行時 就馬上進行展開
所以一旦跑完:=後 就不再存在任何reference在變數中
- +=
最後一個是+= 用來增加敘述在原有已經定義的變數中
如果+=左邊的變數還沒定義過 那+=執行的效果就會跟=一樣 也就是recursively-expanded
variable.
如果變數曾經定義過 那+=跑起來的效果就會視前一次定義是用=或者:=來決定跑完後是recursively-expanded variable或者是simply expanded variable
沒有留言:
張貼留言