Makefile基础教学(预定义变量)

简介: Makefile基础教学(预定义变量)

前言

上篇文章讲解到了变量的使用,这篇文章继续讲解预定义变量。


一、自动变量的概念

在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 中可以更加灵活地处理命令和操作。

相关文章
|
6月前
|
存储 编译器 Shell
Makefile语法基础
Makefile语法基础
32 0
|
IDE 编译器 程序员
Makefile零基础教学(一)初识makefile
Makefile零基础教学(一)初识makefile
171 1
Makefile零基础教学(一)初识makefile
|
C语言
Makefile基础教学(include的使用方法)
Makefile基础教学(include的使用方法)
122 0
|
NoSQL Shell Linux
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(三)
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界
263 0
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(三)
|
Shell Linux 开发工具
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(一)
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界
516 0
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(一)
|
自然语言处理 算法 NoSQL
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(二)
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界
203 0
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(二)
|
编译器 Shell C语言
Makefile文件 | 进阶指南
Makefile文件 | 进阶指南
377 0
|
C语言
玩转Makefile | 四步教你从零开始写Makefile
玩转Makefile | 四步教你从零开始写Makefile
148 0
下一篇
无影云桌面