预定义变量中存在两类变量,一类是自动变量,一类是特殊变量
$(MAKE),$(MAKECMDGOALS),$(MAKEFILE_LIST) $(MAKE_VERSION),$(CURDIR),$(VARIABLES) etc...
|
自动变量的意义
$@
当前规则中触发命令被执行的目标
$^
当前规则中的所有依赖
$<
当前规则中的第一个依赖
自动变量的使用示例
hello : main.o func.o gcc -o $@ $^
%.o : %.c gcc -o $@ -c $<
|
一些特殊变量的意义
$(MAKE)
当前make解释器的文件名
$(MAKECMDGOALS)
命令行中指定的目标名(make的命令行参数)
$(MAKEFILE_LIST)
make所需要的处理的makefile文件列表
当前makefile的文件名总是位于列表的最后
文件名之间以空格进行分割
.PHONY: all out first second third unload
all out: @echo "\$$(MAKE)=> $(MAKE)" @echo "\$$MAKECMDGOALS=> $(MAKECMDGOALS)" @echo "\$$(MAKEFILE_LIST)=> $(MAKEFILE_LIST)"
first: @echo "\$$MAKECMDGOALS=> $(MAKECMDGOALS)" @echo "first" second: @echo "\$$MAKECMDGOALS=> $(MAKECMDGOALS)" @echo "second" third: @echo "\$$MAKECMDGOALS=> $(MAKECMDGOALS)" @echo "third" test: @$(MAKE) first @$(MAKE) second @$(MAKE) third
|
$(MAKE_VERSION)
当前make解释器的版本
$(CURDIR)
当前make解释器的工作目录
$(.VARIABLES)
所有已经定义的变量名列表(预定义变量和自定义变量)
.PHONY: test1 test2
ZHC := Aron test1: @echo "\$$(MAKE_VERSION) => $(MAKE_VERSION)" @echo "\$$(CURDIR) => $(CURDIR)" @echo "\$$(。VARIABLES) => $(.VARIABLES)"
|
小结
makefile提供了预定义变量供开发者使用
预定义变量的使用能够使得 makefile的开发更高效
自动变量是makefile中最常见的元素
使用$(.VARIABLES)能够获取所有的特殊变量
小问题
makefile中能否实现 类似C语言 中多文件调用的情况?