文章目录
- 一、变量
- 1.1 定义简单变量
- 1.2 定义数组
- 1.3 引用变量
- 1.4 规则中定义变量
一、变量
1.1 定义简单变量
用变量名 = 值
的语法来定义变量。这些变量可以用于存储命令、文件名、目录路径等信息,以便在Makefile规则中重复使用
# 定义一个变量
VAR_NAME = value# 定义多行变量(使用反斜杠 \ 进行换行)
MULTILINE_VAR = \line 1 \line 2 \line 3# 使用变量
target:@echo $(VAR_NAME)@echo $(MULTILINE_VAR)
示例如下:
ips = 192.168.2.1 192.168.2.99deploy:@echo $$ips# code result: (make deploy)
192.168.2.1 192.168.2.99
在上述示例中,VAR_NAME
是一个简单的变量,存储着value
的值。MULTILINE_VAR
是一个多行变量,包含了三行文本。
在target
规则中,可以通过$(VAR_NAME)
和$(MULTILINE_VAR)
来使用这些变量。echo
命令将会输出变量的值。
请注意,变量名是大小写敏感的,在Makefile中使用变量时,需要使用$()
或${}
将变量名包围起来。
定义变量时,可以使用=
或者:=
操作符。=
是简单赋值操作符,而:=
是覆盖前面定义的变量的操作符。
1.2 定义数组
在Makefile中,没有直接支持定义数组的语法。但是可以通过使用空格分隔的变量来模拟数组的行为。以下是一种常见的方法:
# 定义数组元素,使用空格分隔
ARRAY := element1 element2 element3# 使用数组元素
target:@echo $(ARRAY)@echo $(word 2, $(ARRAY)) # 访问数组中的特定元素# make target 的 code result
element2
示例如下:注意因为 for 被拆分为了多行,所以 for 里的每行要加分号;
ips = 192.168.2.1 192.168.2.99
deploy:for ip in $(ips); do \echo $$ip; \done# make deploy 的 code result
192.168.2.1
192.168.2.99
在上述示例中,ARRAY
被定义为一个由空格分隔的元素列表。在target
规则中,可以使用$(ARRAY)
来输出整个数组。
如果想要访问数组中的特定元素,可以使用Makefile的函数来实现。在示例代码中,使用了$(word index, text)
函数来获取数组中的第二个元素。
请注意,由于Makefile的变量只是简单的字符串替换,因此在使用数组元素时需要注意上下文。例如,在命令中使用数组元素时,应该将其用引号括起来以确保正确处理各个元素。
尽管这种方式可以模拟数组的行为,但是在 Makefile 中没有类似编程语言中的数组操作,例如追加元素、删除元素等。如果需要更复杂的数组操作,可能需要使用其他语言或工具来处理。
1.3 引用变量
在Makefile中,当你需要引用一个变量时,需要使用$$
符号来转义它。这是因为Makefile中$
符号有特殊含义,用于展开变量或执行命令替换。
以下是一些常见的情况,需要使用$$
来引用变量:
- 在规则的命令中引用变量:
target:@echo $$VAR_NAME
- 在变量的值中引用其他变量:
VAR1 = value1
VAR2 = $(VAR1) value2
在上述示例中,通过$$VAR_NAME
和$(VAR1)
来引用变量。
请注意,只有在Makefile的规则或变量的值中,需要引用变量时才需要使用$$
。在其他地方,例如Makefile文件中的注释或普通文本中,不需要使用$$
来引用变量。
确保在Makefile中正确使用$$
转义符号来引用变量,以避免意外的展开或替换行为。
1.4 规则中定义变量
在Makefile中,你可以在 规则 中定义变量。这样定义的变量只在该步骤中有效,并且可以使用该步骤中的其他命令引用变量。
以下是一个示例:
target:@echo "Step 1"$(eval VAR_NAME := value) # 在步骤中定义变量@echo "Step 2"@echo $(VAR_NAME) # 在同一步骤中引用变量