Ⅴ预定义变量的使用
预定义变量中存在两类变量,一类是自动变量,一类是特殊变量
  • 自动变量
$@ $^ $<
  • 特殊变量
$(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
##文末这种调用方式,适用于大型工程多个makefile的调用##
##但不能实现多文件的调用##

image-20210411175744920

$(MAKE_VERSION)

当前make解释器的版本

$(CURDIR)

当前make解释器的工作目录

$(.VARIABLES)

所有已经定义的变量名列表(预定义变量和自定义变量)
.PHONY: test1 test2

ZHC := Aron
test1:
@echo "\$$(MAKE_VERSION) => $(MAKE_VERSION)"
@echo "\$$(CURDIR) => $(CURDIR)"
@echo "\$$(。VARIABLES) => $(.VARIABLES)"

##我们可以通过(.VARIABLES)去查看该版本下的预定义的特殊变量,具体的解释需要到gnu官网去查看##

image-20210411175525011

小结

makefile提供了预定义变量供开发者使用

预定义变量的使用能够使得 makefile的开发更高效

自动变量是makefile中最常见的元素

使用$(.VARIABLES)能够获取所有的特殊变量


小问题

makefile中能否实现 类似C语言 中多文件调用的情况?

Author: 浩然天成
Link: http://aronzhc.github.io/2021/04/11/Ⅴ预定义变量的使用/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.