第5課 - 預定義變量的使用
1. makefile中的預定義變量
(1)自動變量
-
-
-
- $@ @^ @<
-
(2)特殊變量
-
-
-
- $(MAKE) , $(MAKECMDGOALS) , $(MAKEFILE_LIST)
- $(MAKE_VERSION) , $(CURDIR) , $(.VARIABLES)
- ......
-
2. 自動變量的使用
(1)自動變量的意義
$@ 目前規則中觸發指令被執行的目标
$^ 目前規則中所有的依賴
$< 目前規則中的第一個依賴
(2)自動變量的使用示例
執行 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)"