1. makefile中的预定义变量
(1)自动变量
- $@, @^, @<
(2)特殊变量
-
$(MAKE), $(MAKECMDGOALS) , $(MAKEFILE_LIST)
-
$(MAKEVERSION), $(MAKEVERSION), $(CURDIR) , $(.VARIABLES)
-
......
2. 自动变量的使用
(1)自动变量的意义
$@ 当前规则中触发命令被执行的目标
$^ 当前规则中所有的依赖
$< 当前规则中的第一个依赖
(2)自动变量的使用示例
.PHONY : all first second third all : first second third @echo "$$@ => $@" @echo "$$^ => $^" @echo "$$< => $<" firtst: second: third:
执行 make all 后程序的输出:
$@ => all
$^ => first second third
$< => first
注意:
ⅰ. 在执行makefile脚本时,make首先会展开脚本中的变量等,相当于C中预处理过程。然后再将相应规则中的命令交给shell执行。
ⅱ. "$" 对于makefile有特殊含义,输出时需要加上一个 "$" 进行转义。
ⅲ. "$@" 对于Bash Shell 有特殊含义,输出时需要加上 "" 进行转义。 $@是shell输入的参数的个数。
编程实验:
# 演示自动变量的使用 CC := g++ TARGET := hello-world.out $(TARGET) : func.o main.o $(CC) -o $@ $^ func.o : func.c $(CC) -o $@ -c $^ main.o : main.c $(CC) -o $@ -c $^ .PHONY : rebuild clean all rebuild : clean all all : $(TARGET) clean : $(RM) *.o $(TARGET)
运行结果:
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解释器的工作目录
(6)$(.VARIABLES),所有已经定义的变量名列表(自定义变量 + 预定义变量(自动变量、特殊变量))
编程实验:
# 测试以上三个特殊变量的含义 .PHONY : test1 test2 TDelphi := Delphi Tang D.T.Software := D.T. test1 : @echo "$(MAKE_VERSION)" @echo "$(CURDIR)" @echo "$(.VARIABLES)" test2 : @echo "$(RM)"
运行结果:
4. 小结
(1)makefile提供了预定义变量和自动变量供开发者使用
(2)预定义变量的使用能否使得makefile的开发更高效
(3)自动变量是makefile中最常见的元素
(4)使用$(.VARIABLES)能否获取所有的特殊变量