2015年2月3日 星期二

makefile的四種等於 =, :=, +=, ?=


筆記一下makefile的四種等於的差異

雖然平常工作比較少從零開始寫markfile

但偶而還是需要修改一下既有的檔案

 

makefile總共有四種等於 先從最簡單的開始

  1. ?= 

這個是適用於想表達如果?=左邊的變數從未被設定過的話 就讓它設定成右邊的內容、數值

如果已經有值了 就不進行任何變動

  1. =

makefile官方文件中 使用=的時機是希望讓左邊的變數成為"recursively expanded variable"  也就是當變數真的被使用到的時候 在進行遞迴展開

所以就可以先定義 後續再補數值

以下提供一個例子

CFLAGS = $(include_dirs) -O

include_dirs = -Ifoo -Ibar

如果使用以上兩行的定義 CFLAGS真的要被使用時就會展開成 -lfoo -lbar -O  所以可以後定義、補充include_dirs的內容

然後這樣子的特性可能會帶來兩個壞處

第一個是有可能造成無限遞迴 以下就是一個例子 不過這個makefile會提示bug 所以倒也還好修正

CFLAGS = $(CFLAGS) -O

CFLAGS要被使用時會造成無限迴圈

另外一個壞處是跟效能有關的:

因為遞迴展開也適用於函式 所以函式的展開執行也會發生在變數要被使用的時候 也就是說如果變數要被重複使用幾次 函式就會展開跑幾次

所以效能就可能不太好

  1. := 

markfile官方文件中 使用:=的時機是希望讓左邊的變數成為"Simply expanded variable" 也就是當這一行敘述被執行時 就馬上進行展開

所以一旦跑完:= 就不再存在任何reference在變數中

  1. +=

最後一個是+= 用來增加敘述在原有已經定義的變數中

如果+=左邊的變數還沒定義過 +=執行的效果就會跟=一樣 也就是recursively-expanded variable.

如果變數曾經定義過 +=跑起來的效果就會視前一次定義是用=或者:=來決定跑完後是recursively-expanded variable或者是simply expanded variable

沒有留言:

張貼留言