前言
上篇文章讲解到了变量的使用,这篇文章继续讲解预定义变量。
一、自动变量的概念
在Makefile中,自动变量指的是可以在编写规则或命令中使用的特殊变量,这些变量的值会根据上下文不同而自动地发生变化,从而可以方便地编写通用的规则或命令。
以下是一些常用的自动变量:
$@:目标文件的名称,即规则中的目标(target)。
$<:规则中第一个依赖文件的名称。
$^:规则中所有依赖文件的名称(去重之后)。
$*:匹配通配符(%)的部分,例如规则中的 %.c匹配了foo.c,则$* 的值为foo。
$?:比目标文件更新的所有依赖文件名称列表,以空格分隔。
下面编写一个makefile测试一下这些变量到底指代的是什么:
all : first second third @echo "\$$@ => $@" @echo "$$^ => $^" @echo "$$< => $<" @echo "$$*< => $$*" @echo "$$?< => $$?" first : second : third :
运行结果:
二、自动变量在工程中的应用
使用自动变量可以直接简化我们的Makefile程序当我们再次进行修改的时候会显得非常方便。
CC := gcc TARGET := hello TARGET : hello.o func.o $(CC) -o $@ $^ hello.o : hello.c $(CC) -c -o $@ $< func.o : func.c $(CC) -c -o $@ $< .PHONY: clean rebuild all rebuild : clean all all : TARGET clean : rm *.o TARGET
三、特殊变量的使用
$(MAKE):用来递归调用 Makefile 的命令。这个变量可以让你在一个 Makefile 中调用另一个 Makefile。通常情况下,它被设置为 make,也就是递归调用 make 命令。这个变量通常不需要显式设置,它的默认值就是 make。
$(MAKECMDGOALS):被执行的 Makefile 的目标列表,以空格分隔。例如,如果你运行 make foo bar,那么 $(MAKECMDGOALS) 的值就是 foo bar。你可以通过这个变量来判断当前执行的目标是哪个,以便根据需要执行不同的操作。
$(CURDIR):当前工作目录的完整路径。这个变量通常用于构建绝对路径的文件名或目录名。
$(RM):用于删除文件的命令,默认是 rm -f。你可以显式设置 RM 变量来指定其他的删除命令。
$(AR):用于创建静态库的命令,默认是 ar。你可以显式设置 AR 变量来指定其他的命令。
$(ARFLAGS):传递给 $(AR) 命令的选项,默认为空。你可以显式设置 ARFLAGS 变量来指定其他的选项。
像这种特殊变量还有很多我们主要就挑其中几个重要的来进行讲解。
我们先来打印一下这些变量具体指代的是什么吧:
all : @echo "$(MAKE)" @echo "$(MAKECMDGOALS)" @echo "$(MAKEFILE_LIST)" @echo "$(MAKE_VERSION)" @echo "$(CURDIR)" @echo "$(.VARIABLES)"
运行结果:
通过这个运行结果很清楚的可以看出这些特殊变量都具体指代的是什么意思。
四、特殊变量在工程中的应用
这里我只做了一个简单的修改使用RM预定义变量代替了rm,其他的功能作用大家可以自己去尝试。
CC := gcc TARGET := hello TARGET : hello.o func.o $(CC) -o $@ $^ hello.o : hello.c $(CC) -c -o $@ $< func.o : func.c $(CC) -c -o $@ $< .PHONY: clean rebuild all rebuild : clean all all : TARGET clean : $(RM) *.o TARGET
总结
除了上述这些变量之外,还有许多其他的变量可以在 Makefile 中使用,具体可以参考 GNU Make 的官方文档。通过引用这些变量,在 Makefile 中可以更加灵活地处理命令和操作。