2015年3月5日 星期四

Makefile的賦值運算符(=, :=, +=, ?=)

在Makefile的文件當中常常會看到這四種賦值運算符,下面我們寫個範例來介紹一下它們各別代表的意思。

首先編寫一個Makefile檔
ifdef DEFINE_INIT_VALUE
    VALUE = "Hello!"
endif

ifeq ($(CMD),colon)
    VALUE := “Hello all the World!”
endif

ifeq ($(CMD),question_mark)
    VALUE ?= “Hello World!”
endif

ifeq ($(CMD),plus)
    VALUE += “Danny!”
endif



all:
    @echo $(VALUE )


看看這幾種賦值運算的結果:
make DEFINE_INIT_VALUE=true CMD=colon                 輸出: ==>  Hello all the World!
make DEFINE_INIT_VALUE=true CMD=question_mark  輸出: ==>  Hello!
make DEFINE_INIT_VALUE=true CMD=plus                   輸出: ==>  Hello! Danny!

make DEFINE_INIT_VALUE= CMD=colon                 輸出: ==>  Hello all the World!
make DEFINE_INIT_VALUE= CMD=question_mark  輸出: ==>  Hello World!
make DEFINE_INIT_VALUE= CMD=plus                   輸出: ==>  Danny!


總結:
= 是最基本的賦值
:= 會覆蓋變數之前的值
?= 變數為空時才給值,不然則維持之前的值
+= 將值附加到變數的後面



另外 =, :=這兩賦值運算符號在網路上查詢,常常會看到這種說法:
= 在執行時擴展(values within it are recursively expanded when the variable is used, not when it's declared)
:= 在定義時擴展(values within it are expanded at declaration time)
而白話一點的說法如下範例所示


      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!

沒有留言:

張貼留言