makefile--變數的應用(下)

sun_shine發表於2018-10-04

變數的應用(下)


1. 環境變數(全域性變數)

  • makefile中能夠直接使用環境變數的值
    定義了同名變數,環境變數將被覆蓋
    執行make時指定"-e"選項,優先使用環境變數
    示例1
LOGNAME := other

test :
    @echo "LOGNAME => $(LOGNAME)"
複製程式碼

直接使用環境變數的值
在Makefile中使用環境變數的優缺點: 優勢: 環境變數可以在所有makefile中使用 劣勢: 過多的依賴於環境變數會導致移植性降低


2. 變數在不同makefile之間的傳遞方式

  • 直接在外部定義環境變數進行傳遞
  • 使用export定義變數進行傳遞(定義臨時環境變數)
  • 定義make命令列變數進行傳遞(推薦)

示例2_1--直接在外部定義環境變數進行傳遞 makefile

LOGNAME := other

test :
    @echo "LOGNAME => $(LOGNAME)"
    @echo "make another file"
    @$(MAKE) -f makefile2
複製程式碼

makefile2

test :
    @echo "LOGNAME => $(LOGNAME)"
複製程式碼

直接在外部定義環境變數進行傳遞

示例2_2--多個檔案呼叫同一個變數不使用export makefile

var := var_start

test :
    @echo "make another file"
    @$(MAKE) -f makefile2

複製程式碼

makefile2

test :
    @echo "var => $(var)"
複製程式碼

多個檔案呼叫同一個變數不使用export

示例2_3--使用export定義變數進行傳遞 makefile

export var := var_start

test :
    @echo "make another file"
    @$(MAKE) -f makefile2

複製程式碼

makefile2

test :
    @echo "var => $(var)"
複製程式碼

使用export定義變數進行傳遞

示例2_4--定義make命令列變數進行傳遞 makefile

var := var_start

test :
    @echo "make another file"
    @$(MAKE) -f makefile2
    @$(MAKE) -f makefile2 var:=$(var)

複製程式碼

makefile2

test :
    @echo "var => $(var)"
複製程式碼

定義make命令列變數進行傳遞*


3. 目標變數(區域性變數)

  • 作用域只在指定目標及連帶規則中
target : name <assignment> value
target : override name <assignment> value
複製程式碼

示例3_1-目標變數,無依賴關係

var := var_start
test : var := var_test

test : 
    @echo "test:"
    @echo "var => $(var)"
    
another :
    @echo "another:"
    @echo "var => $(var)"
複製程式碼

目標變數,無依賴關係

示例3_2-目標變數,連帶依賴

var := var_start
test : var := var_test

test : another
    @echo "test:"
    @echo "var => $(var)"
    
another :
    @echo "another:"
    @echo "var => $(var)"
複製程式碼

目標變數,連帶依賴


4. 模式變數

  • 模式變數是目標變數的擴充套件
  • 作用域只在符合模式的目標及連帶規則中
pattern : name <assignment> value
pattern : override name <assignment> value
複製程式碼

示例4_1-模式變數-無依賴關係

new := new_start
%e : override new := new_test

test :
    @echo "test:"
    @echo "new => $(new)"
    
another :
    @echo "another:"
    @echo "new => $(new)"

rule :
    @echo "rule:"
    @echo "new => $(new)"
複製程式碼

模式變數-無依賴關係
示例4_2-模式變數-連帶依賴

new := new_start
%e : override new := new_test

test : another
    @echo "test:"
    @echo "new => $(new)"
    
another :
    @echo "another:"
    @echo "new => $(new)"

rule :
    @echo "rule:"
    @echo "new => $(new)"
複製程式碼

模式變數-連帶依賴


小結

  • makefile中的三種變數:
  • 全域性變數:makefile外部定義的環境變數
  • 檔案變數:makefile中定義的變數
  • 區域性變數:指定目標的變數

相關文章