前言
一、变量的定义和使用
- makefile 中支持程序设计语言中的变量的概念。
makefile 中的变量只代表文本数据 (字符串)
。
makefile 中的变量规则:
- 变量名可以包含 字符,数字,下划线。
- 不能包含 " : ", " # ", " = ", 或 " "。
- 变量名大小写敏感。
- 定义使用变量:
Makefile 中的变量是用于存储 特定值或字符串 的对象。
CC := gcc 表明 定义一个变量 CC, 将它赋值为 gcc ,定义了编译器的类型。
这里的 :=
就是简单的变量赋值方式,
- 相当于 c 语言中的
=
。
$( ) 的作用是引用变量.
二、变量的赋值方式
不同的赋值方式意义不同。
makefile 支持 4 中变量的赋值方式。
1,简单赋值 ( := )
- 程序设计语言的通用的赋值方式。
- 只针对当前语句的变量有效。
例如:定义 变量 x, y ,并对其进行简单赋值。
x := foo y := $(x) x := new test : @echo "x => $(x)" @echo "y => $(y)"
2,递归赋值 ( = )
- 赋值操作可能
影响多个其他的变量
。 - 所有与目标变量相关的其他变量都将收到影响。
使用递归对 x 赋值,则可能会影响其他值的变化。
x = foo y = $(x)b x = new test : @echo "x => $(x)" @echo "y => $(y)"
3,条件赋值 ( ?= )
- 如果变量未定义,使用赋值符号中的值定义变量。
如果变量已经定义,则复制无效。(适用于第一次赋值
)
使用 条件复制 二次对 x 进行赋值,就不会改变 x 。
x := foo y := $(x)b x ?= new test : @echo "x => $(x)" @echo "y => $(y)"
4,追加赋值 ( += )
- 原变量值之后
加上一个新值。(类似于字符串的添加)
- 原变量值与新值之间由空格给隔开。
x := foo y := $(x)b x += new test : @echo "x => $(x)" @echo "y => $(y)"
三、预定义变量
在 makefile 中存在一些预定义变量。
Makefile 中预定义变量是指由 Make 工具提前定义好的、可以直接在 Makefile 中使用的变量,这些变量包括了常见的编译和链接选项,以及 Make 工具本身的一些参数和配置信息。
1. 自动变量
Makefile 中的自动变量是指在 Make 命令执行过程中,自动生成并可供使用的特殊变量。这些变量在用于保存临时信息或函数返回值,帮助我们更好地完成规则定义和执行。
常用的自动变量:
$@
:当前规则中触发命令被执行的目标
。$>
: 当前规则中的所有依赖
。$<
: 当前规则中的第一个依赖
。
$*
:匹配通配符(%)的部分,例如规则中的 %.c匹配了foo.c,则$* 的值为foo。$?
:比目标文件更新的所有依赖文件名称列表,以空格分隔。
2. 自动变量示例
示例 一:
.PHONY : all first second third // 伪目标的声明 all : first second third @echo "\$$@ => $@" // @ 可消除回显 @echo "$$^ => $^" @echo "$$< => $<" firtst: // 没有依赖,命令,永远是最新的 second: third:
对于 @echo " $$^ => $^ " 的命令, => 左边和右边的不同;右边即是 变量本身,左边是文本。
注意:
" $ " 对于makefile 有特殊的含义。输出时需要加一个 " $ " 进行转义
。" $@ " 对于Bash Shell 有特殊的含义。输出时需要加一个 " \ " 进行转义
示例 二:
CC := g++ // 定义一个变量CC 并赋值为 g++. TARGET := hello-world.out // 目标 $(TARGET) : func.o main.o // 使用定义的变量直接使用 $ 即可,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 // rebuild 伪目标依赖于clean ,all all : $(TARGET) clean : $(RM) *.o $(TARGET) // 删除所有的 .o 和 hello-world.out文件
3. 特殊变量
一些特殊变量的含义:
- $(MAKE):当前的 make 解释器的文件名。
- $(MAKECMDGOALS):命令行中的目标名(make 的命令行参数)$(MAKEFILE_LIST):make 需要处理的文件列表。当前makefile 的文件名总是位于列表的最后。文件名之间以空格分割。
- $(MAKE_VERSION ):当前的 make 解释器的版本。
- $(CURDIR):当前工作目录的完整路径。这个变量通常用于构建绝对路径的文件名或目录名。
- $(.VARIABLES):所有已经定义的变量列表。(预定义变量 和 自定义变量)$(RM):用于删除文件的命令,默认是 rm -f。你可以显式设置 RM 变量来指定其他的删除命令。
- $(AR):用于创建静态库的命令,默认是 ar。你可以显式设置 AR 变量来指定其他的命令。
- $(ARFLAGS):传递给 $(AR) 命令的选项,默认为空。你可以显式设置 ARFLAGS 变量来指定其他的选项。
4. 特殊变量示例
.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