第5课 - 预定义变量的使用
第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输入的参数的个数。
1 # 演示自动变量的使用 2 3 CC := gcc 4 TARGET := hello.out 5 6 $(TARGET) : main.o func.o 7 $(CC) -o $@ $^ 8 9 main.o : main.c 10 $(CC) -o $@ -c $< 11 12 func.o : func.c 13 $(CC) -o $@ -c $< 14 15 .PHONY : rebuild all clean 16 17 rebuild : clean all 18 19 all : $(TARGET) 20 21 clean : 22 rm *o $(TARGETa)
3. 特殊变量的使用
(1)$(MAKE),当前make解释器的文件名
(2)$(MAKECMDGOALS),命令行中指定的目标名(make的命令行参数 make xx , xx 即MAKECMDGOALS)
(3)$(MAKEFILE_LIST)
-
- make所需要处理的 makefile 文件列表
- 当前 makefile 的文件名总是位于列表的最后
- 文件名之间以空格进行分隔
1 # 测试以上三个特殊变量的含义 2 3 .PHONY : all out first second third test 4 5 all out : 6 @echo "$(MAKE)" 7 @echo "$(MAKECMDGOALS)" 8 @echo "$(MAKEFILE_LIST)" 9 10 first : 11 @echo "first" 12 13 second : 14 @echo "second" 15 16 third : 17 @echo "third" 18 19 test : 20 @$(MAKE) first 21 @$(MAKE) second 22 @$(MAKE) third
(4)$(MAKE_VERSION),当前make解释器的版本
(5)$(CURDIR),当前make解释器的工作目录
(6)$(.VARIABLES),所有已经定义的变量名列表(自定义变量 + 预定义变量(自动变量、特殊变量))
1 # 测试以上三个特殊变量的含义 2 3 .PHONY : test1 test2 4 5 TDelphi := Delphi Tang 6 D.T.Software := D.T. 7 8 test1 : 9 @echo "$(MAKE_VERSION)" 10 @echo "$(CURDIR)" 11 @echo "$(.VARIABLES)" 12 13 test2 : 14 @echo "$(RM)"
注:本文整理于《狄泰12月提升计划》课程内容
狄泰QQ群:199546072