文章目录
前言
一、变量的定义和使用
- 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
总结
下一节介绍 变量的进阶。