天天看點

第5課 - 預定義變量的使用

第5課 - 預定義變量的使用

1. makefile中的預定義變量

(1)自動變量

    • $@ @^ @<

(2)特殊變量

    • $(MAKE) , $(MAKECMDGOALS) , $(MAKEFILE_LIST)
    • $(MAKE_VERSION) , $(CURDIR) , $(.VARIABLES)
    • ......

2. 自動變量的使用

(1)自動變量的意義

$@ 目前規則中觸發指令被執行的目标

$^ 目前規則中所有的依賴

$< 目前規則中的第一個依賴

(2)自動變量的使用示例

第5課 - 預定義變量的使用

         執行 make all 後程式的輸出

     $@ => all

$^ => first second third

$< => first

注意:

ⅰ. 在執行makefile腳本時,make首先會展開腳本中的變量等,相當于C中預處理過程。然後再将相應規則中的指令交給shell執行。

ⅱ. "$" 對于makefile有特殊含義,輸出時需要加上一個 "$" 進行轉義。

ⅲ. "$@" 對于Bash Shell 有特殊含義,輸出時需要加上 "\" 進行轉義。 $@是shell輸入的參數的個數。

# 示範自動變量的使用

CC := gcc
TARGET := hello.out

$(TARGET) : main.o func.o
    $(CC) -o $@ $^

main.o : main.c
    $(CC) -o  $@ -c $<

func.o : func.c
    $(CC) -o $@ -c $<

.PHONY : rebuild all clean

rebuild : clean all

all : $(TARGET)

clean :
    rm *o $(TARGETa)      

3. 特殊變量的使用

(1)$(MAKE),目前make解釋器的檔案名

(2)$(MAKECMDGOALS),指令行中指定的目标名(make的指令行參數 make xx , xx 即MAKECMDGOALS)

(3)$(MAKEFILE_LIST)

    • make所需要處理的 makefile 檔案清單
    • 目前 makefile 的檔案名總是位于清單的最後
    • 檔案名之間以空格進行分隔
# 測試以上三個特殊變量的含義

.PHONY : all out first second third test

all out :
    @echo "$(MAKE)"
    @echo "$(MAKECMDGOALS)"
    @echo "$(MAKEFILE_LIST)"

first :
    @echo "first"

second :
    @echo "second"

third :
    @echo "third"

test :
    @$(MAKE) first
    @$(MAKE) second
    @$(MAKE) third      

(4)$(MAKE_VERSION),目前make解釋器的版本

(5)$(CURDIR),目前make解釋器的工作目錄

# 測試以上三個特殊變量的含義

.PHONY : test1 test2

TDelphi := Delphi Tang
D.T.Software := D.T.

test1 :
    @echo "$(MAKE_VERSION)"
    @echo "$(CURDIR)"
    @echo "$(.VARIABLES)"

test2 :
    @echo "$(RM)"